@tamagui/portal 2.7.7 → 3.0.0-beta.1093.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/cjs/GorhomPortal.cjs +131 -164
  2. package/dist/cjs/GorhomPortal.native.cjs +201 -0
  3. package/dist/cjs/GorhomPortal.native.js +165 -211
  4. package/dist/cjs/GorhomPortal.native.js.map +1 -1
  5. package/dist/cjs/GorhomPortalItem.cjs +57 -58
  6. package/dist/cjs/GorhomPortalItem.native.cjs +104 -0
  7. package/dist/cjs/GorhomPortalItem.native.js +84 -106
  8. package/dist/cjs/GorhomPortalItem.native.js.map +1 -1
  9. package/dist/cjs/Portal.cjs +50 -60
  10. package/dist/cjs/Portal.native.cjs +58 -0
  11. package/dist/cjs/Portal.native.js +40 -44
  12. package/dist/cjs/Portal.native.js.map +1 -1
  13. package/dist/cjs/PortalProps.cjs +9 -11
  14. package/dist/cjs/PortalProps.native.cjs +18 -0
  15. package/dist/cjs/PortalProps.native.js +9 -10
  16. package/dist/cjs/PortalProps.native.js.map +1 -1
  17. package/dist/cjs/constants.cjs +23 -25
  18. package/dist/cjs/constants.native.cjs +43 -0
  19. package/dist/cjs/constants.native.js +25 -26
  20. package/dist/cjs/constants.native.js.map +1 -1
  21. package/dist/cjs/helpers.cjs +22 -24
  22. package/dist/cjs/helpers.native.cjs +38 -0
  23. package/dist/cjs/helpers.native.js +22 -23
  24. package/dist/cjs/helpers.native.js.map +1 -1
  25. package/dist/cjs/index.cjs +15 -17
  26. package/dist/cjs/index.native.cjs +35 -0
  27. package/dist/cjs/index.native.js +15 -16
  28. package/dist/cjs/index.native.js.map +1 -1
  29. package/dist/cjs/native-portal.cjs +31 -35
  30. package/dist/cjs/native-portal.native.cjs +50 -0
  31. package/dist/cjs/native-portal.native.js +36 -39
  32. package/dist/cjs/native-portal.native.js.map +1 -1
  33. package/dist/cjs/types.cjs +9 -11
  34. package/dist/cjs/types.native.cjs +18 -0
  35. package/dist/cjs/types.native.js +9 -10
  36. package/dist/cjs/types.native.js.map +1 -1
  37. package/dist/esm/GorhomPortal.mjs +112 -136
  38. package/dist/esm/GorhomPortal.mjs.map +1 -1
  39. package/dist/esm/GorhomPortal.native.js +146 -184
  40. package/dist/esm/GorhomPortal.native.js.map +1 -1
  41. package/dist/esm/GorhomPortalItem.mjs +46 -41
  42. package/dist/esm/GorhomPortalItem.mjs.map +1 -1
  43. package/dist/esm/GorhomPortalItem.native.js +74 -91
  44. package/dist/esm/GorhomPortalItem.native.js.map +1 -1
  45. package/dist/esm/Portal.mjs +37 -36
  46. package/dist/esm/Portal.mjs.map +1 -1
  47. package/dist/esm/Portal.native.js +30 -29
  48. package/dist/esm/Portal.native.js.map +1 -1
  49. package/dist/esm/PortalProps.mjs +0 -2
  50. package/dist/esm/PortalProps.native.js +0 -2
  51. package/dist/esm/constants.mjs +8 -6
  52. package/dist/esm/constants.mjs.map +1 -1
  53. package/dist/esm/constants.native.js +10 -8
  54. package/dist/esm/constants.native.js.map +1 -1
  55. package/dist/esm/helpers.mjs +9 -7
  56. package/dist/esm/helpers.mjs.map +1 -1
  57. package/dist/esm/helpers.native.js +9 -7
  58. package/dist/esm/helpers.native.js.map +1 -1
  59. package/dist/esm/index.js +10 -6
  60. package/dist/esm/index.mjs +10 -6
  61. package/dist/esm/index.native.js +10 -6
  62. package/dist/esm/native-portal.mjs +23 -17
  63. package/dist/esm/native-portal.mjs.map +1 -1
  64. package/dist/esm/native-portal.native.js +28 -22
  65. package/dist/esm/native-portal.native.js.map +1 -1
  66. package/dist/esm/types.mjs +0 -2
  67. package/dist/esm/types.native.js +0 -2
  68. package/package.json +14 -12
  69. package/src/GorhomPortalItem.tsx +11 -2
  70. package/src/Portal.native.tsx +8 -1
  71. package/src/Portal.tsx +26 -7
  72. package/src/PortalProps.tsx +7 -0
  73. package/types/GorhomPortal.d.ts +3 -2
  74. package/types/GorhomPortal.d.ts.map +1 -1
  75. package/types/GorhomPortalItem.d.ts.map +1 -1
  76. package/types/GorhomPortalItem.native.d.ts +1 -1
  77. package/types/GorhomPortalItem.native.d.ts.map +1 -1
  78. package/types/Portal.d.ts.map +1 -1
  79. package/types/Portal.native.d.ts +1 -1
  80. package/types/Portal.native.d.ts.map +1 -1
  81. package/types/PortalProps.d.ts +7 -1
  82. package/types/PortalProps.d.ts.map +1 -1
  83. package/types/helpers.d.ts +1 -1
  84. package/types/helpers.d.ts.map +1 -1
  85. package/dist/esm/PortalProps.mjs.map +0 -1
  86. package/dist/esm/PortalProps.native.js.map +0 -1
  87. package/dist/esm/index.js.map +0 -1
  88. package/dist/esm/index.mjs.map +0 -1
  89. package/dist/esm/index.native.js.map +0 -1
  90. package/dist/esm/types.mjs.map +0 -1
  91. package/dist/esm/types.native.js.map +0 -1
@@ -5,39 +5,32 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __getProtoOf = Object.getPrototypeOf;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
7
  var __export = (target, all) => {
8
- for (var name in all) __defProp(target, name, {
9
- get: all[name],
10
- enumerable: true
11
- });
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
12
  };
13
13
  var __copyProps = (to, from, except, desc) => {
14
- if (from && typeof from === "object" || typeof from === "function") {
15
- for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
- get: () => from[key],
17
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
- });
19
- }
20
- return to;
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
+ get: () => from[key],
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
19
+ }
20
+ return to;
21
21
  };
22
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
- // If the importer is in node compatibility mode or this is not an ESM
24
- // file that has been converted to a CommonJS file using a Babel-
25
- // compatible transform (i.e. "__esModule" has not been set), then set
26
- // "default" to the CommonJS "module.exports" for node compatibility.
27
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
28
- value: mod,
29
- enumerable: true
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
23
+ value: mod,
24
+ enumerable: true
30
25
  }) : target, mod));
31
- var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
32
- value: true
33
- }), mod);
26
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
27
  var GorhomPortal_exports = {};
35
28
  __export(GorhomPortal_exports, {
36
- ACTIONS: () => ACTIONS,
37
- INITIAL_STATE: () => INITIAL_STATE,
38
- PortalHost: () => PortalHost,
39
- PortalProvider: () => PortalProvider,
40
- usePortal: () => usePortal
29
+ ACTIONS: () => ACTIONS,
30
+ INITIAL_STATE: () => INITIAL_STATE,
31
+ PortalHost: () => PortalHost,
32
+ PortalProvider: () => PortalProvider,
33
+ usePortal: () => usePortal
41
34
  });
42
35
  module.exports = __toCommonJS(GorhomPortal_exports);
43
36
  var import_constants = require("@tamagui/constants");
@@ -46,163 +39,137 @@ var import_start_transition = require("@tamagui/start-transition");
46
39
  var import_react = __toESM(require("react"), 1);
47
40
  var import_constants2 = require("./constants.cjs");
48
41
  var import_jsx_runtime = require("react/jsx-runtime");
49
- var ACTIONS = /* @__PURE__ */(ACTIONS2 => {
50
- ACTIONS2[ACTIONS2["REGISTER_HOST"] = 0] = "REGISTER_HOST";
51
- ACTIONS2[ACTIONS2["DEREGISTER_HOST"] = 1] = "DEREGISTER_HOST";
52
- ACTIONS2[ACTIONS2["ADD_UPDATE_PORTAL"] = 2] = "ADD_UPDATE_PORTAL";
53
- ACTIONS2[ACTIONS2["REMOVE_PORTAL"] = 3] = "REMOVE_PORTAL";
54
- return ACTIONS2;
42
+ var ACTIONS = /* @__PURE__ */ ((ACTIONS2) => {
43
+ ACTIONS2[ACTIONS2["REGISTER_HOST"] = 0] = "REGISTER_HOST";
44
+ ACTIONS2[ACTIONS2["DEREGISTER_HOST"] = 1] = "DEREGISTER_HOST";
45
+ ACTIONS2[ACTIONS2["ADD_UPDATE_PORTAL"] = 2] = "ADD_UPDATE_PORTAL";
46
+ ACTIONS2[ACTIONS2["REMOVE_PORTAL"] = 3] = "REMOVE_PORTAL";
47
+ return ACTIONS2;
55
48
  })(ACTIONS || {});
56
49
  const INITIAL_STATE = {};
57
50
  const registerHost = (state, hostName) => {
58
- if (!(hostName in state)) state[hostName] = [];
59
- return state;
51
+ if (!(hostName in state)) state[hostName] = [];
52
+ return state;
60
53
  };
61
54
  const deregisterHost = (state, hostName) => {
62
- delete state[hostName];
63
- return state;
55
+ delete state[hostName];
56
+ return state;
64
57
  };
65
58
  const addUpdatePortal = (state, hostName, portalName, node) => {
66
- if (!(hostName in state)) state = registerHost(state, hostName);
67
- const index = state[hostName].findIndex(item => item.name === portalName);
68
- if (index !== -1) state[hostName][index].node = node;else state[hostName].push({
69
- name: portalName,
70
- node
71
- });
72
- return state;
59
+ if (!(hostName in state)) state = registerHost(state, hostName);
60
+ const index = state[hostName].findIndex((item) => item.name === portalName);
61
+ if (index !== -1) state[hostName][index].node = node;
62
+ else state[hostName].push({
63
+ name: portalName,
64
+ node
65
+ });
66
+ return state;
73
67
  };
74
68
  const removePortal = (state, hostName, portalName) => {
75
- if (!(hostName in state)) {
76
- if (process.env.NODE_ENV === "development") console.info(`Failed to remove portal '${portalName}', '${hostName}' was not registered!`);
77
- return state;
78
- }
79
- const index = state[hostName].findIndex(item => item.name === portalName);
80
- if (index !== -1) state[hostName].splice(index, 1);
81
- return state;
69
+ if (!(hostName in state)) {
70
+ if (process.env.NODE_ENV === "development") console.info(`Failed to remove portal '${portalName}', '${hostName}' was not registered!`);
71
+ return state;
72
+ }
73
+ const index = state[hostName].findIndex((item) => item.name === portalName);
74
+ if (index !== -1) state[hostName].splice(index, 1);
75
+ return state;
82
76
  };
83
77
  const reducer = (state, action) => {
84
- const {
85
- type
86
- } = action;
87
- switch (type) {
88
- case 0:
89
- return registerHost({
90
- ...state
91
- }, action.hostName);
92
- case 1:
93
- return deregisterHost({
94
- ...state
95
- }, action.hostName);
96
- case 2:
97
- return addUpdatePortal({
98
- ...state
99
- }, action.hostName, action.portalName, action.node);
100
- case 3:
101
- return removePortal({
102
- ...state
103
- }, action.hostName, action.portalName);
104
- default:
105
- return state;
106
- }
78
+ const { type } = action;
79
+ switch (type) {
80
+ case 0: return registerHost({ ...state }, action.hostName);
81
+ case 1: return deregisterHost({ ...state }, action.hostName);
82
+ case 2: return addUpdatePortal({ ...state }, action.hostName, action.portalName, action.node);
83
+ case 3: return removePortal({ ...state }, action.hostName, action.portalName);
84
+ default: return state;
85
+ }
107
86
  };
108
87
  const PortalStateContext = (0, import_react.createContext)(null);
109
88
  const PortalDispatchContext = (0, import_react.createContext)(null);
110
89
  const PortalProviderActiveContext = (0, import_react.createContext)(false);
111
90
  const usePortal = (hostName = "root") => {
112
- const dispatch = (0, import_react.useContext)(PortalDispatchContext);
113
- if (dispatch === null) throw new Error("'PortalDispatchContext' cannot be null, please add 'PortalProvider' to the root component.");
114
- const registerHost2 = (0, import_react.useCallback)(() => {
115
- dispatch({
116
- type: 0,
117
- hostName
118
- });
119
- }, []);
120
- const deregisterHost2 = (0, import_react.useCallback)(() => {
121
- dispatch({
122
- type: 1,
123
- hostName
124
- });
125
- }, []);
126
- const addUpdatePortal2 = (0, import_react.useCallback)((name, node) => {
127
- dispatch({
128
- type: 2,
129
- hostName,
130
- portalName: name,
131
- node
132
- });
133
- }, []);
134
- return {
135
- registerHost: registerHost2,
136
- deregisterHost: deregisterHost2,
137
- addPortal: addUpdatePortal2,
138
- updatePortal: addUpdatePortal2,
139
- removePortal: (0, import_react.useCallback)(name => {
140
- dispatch({
141
- type: 3,
142
- hostName,
143
- portalName: name
144
- });
145
- }, [])
146
- };
91
+ const dispatch = (0, import_react.useContext)(PortalDispatchContext);
92
+ if (dispatch === null) throw new Error("'PortalDispatchContext' cannot be null, please add 'PortalProvider' to the root component.");
93
+ const registerHost2 = (0, import_react.useCallback)(() => {
94
+ dispatch({
95
+ type: 0,
96
+ hostName
97
+ });
98
+ }, []);
99
+ const deregisterHost2 = (0, import_react.useCallback)(() => {
100
+ dispatch({
101
+ type: 1,
102
+ hostName
103
+ });
104
+ }, []);
105
+ const addUpdatePortal2 = (0, import_react.useCallback)((name, node) => {
106
+ dispatch({
107
+ type: 2,
108
+ hostName,
109
+ portalName: name,
110
+ node
111
+ });
112
+ }, []);
113
+ return {
114
+ registerHost: registerHost2,
115
+ deregisterHost: deregisterHost2,
116
+ addPortal: addUpdatePortal2,
117
+ updatePortal: addUpdatePortal2,
118
+ removePortal: (0, import_react.useCallback)((name) => {
119
+ dispatch({
120
+ type: 3,
121
+ hostName,
122
+ portalName: name
123
+ });
124
+ }, [])
125
+ };
147
126
  };
148
- const PortalProviderComponent = ({
149
- rootHostName = "root",
150
- shouldAddRootHost = true,
151
- children
152
- }) => {
153
- const isAlreadyInProvider = (0, import_react.useContext)(PortalProviderActiveContext);
154
- if (process.env.NODE_ENV === "development") {
155
- if (isAlreadyInProvider && shouldAddRootHost) console.warn(`[tamagui] Nested PortalProvider with shouldAddRootHost detected. This causes hydration mismatches. TamaguiProvider from 'tamagui' already includes PortalProvider - remove the explicit PortalProvider wrapper or set shouldAddRootHost={false}.`);
156
- }
157
- const [state, dispatch] = (0, import_react.useReducer)(reducer, INITIAL_STATE);
158
- const transitionDispatch = (0, import_react.useMemo)(() => {
159
- const next = value => {
160
- (0, import_start_transition.startTransition)(() => {
161
- dispatch(value);
162
- });
163
- };
164
- return next;
165
- }, [dispatch]);
166
- const portalState = (0, import_native.getPortal)().state;
167
- const content = /* @__PURE__ */(0, import_jsx_runtime.jsx)(PortalProviderActiveContext.Provider, {
168
- value: true,
169
- children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(PortalDispatchContext.Provider, {
170
- value: transitionDispatch,
171
- children: /* @__PURE__ */(0, import_jsx_runtime.jsxs)(PortalStateContext.Provider, {
172
- value: state,
173
- children: [children, shouldAddRootHost && /* @__PURE__ */(0, import_jsx_runtime.jsx)(PortalHost, {
174
- name: rootHostName
175
- })]
176
- })
177
- })
178
- });
179
- if (portalState.type === "teleport") return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_native.NativePortalProvider, {
180
- children: content
181
- });
182
- return content;
127
+ const PortalProviderComponent = ({ rootHostName = "root", shouldAddRootHost = true, children }) => {
128
+ const isAlreadyInProvider = (0, import_react.useContext)(PortalProviderActiveContext);
129
+ if (process.env.NODE_ENV === "development") {
130
+ if (isAlreadyInProvider && shouldAddRootHost) console.warn(`[tamagui] Nested PortalProvider with shouldAddRootHost detected. This causes hydration mismatches. TamaguiProvider from 'tamagui' already includes PortalProvider - remove the explicit PortalProvider wrapper or set shouldAddRootHost={false}.`);
131
+ }
132
+ const [state, dispatch] = (0, import_react.useReducer)(reducer, INITIAL_STATE);
133
+ const transitionDispatch = (0, import_react.useMemo)(() => {
134
+ const next = (value) => {
135
+ (0, import_start_transition.startTransition)(() => {
136
+ dispatch(value);
137
+ });
138
+ };
139
+ return next;
140
+ }, [dispatch]);
141
+ const portalState = (0, import_native.getPortal)().state;
142
+ const content = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PortalProviderActiveContext.Provider, {
143
+ value: true,
144
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PortalDispatchContext.Provider, {
145
+ value: transitionDispatch,
146
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(PortalStateContext.Provider, {
147
+ value: state,
148
+ children: [children, shouldAddRootHost && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PortalHost, { name: rootHostName })]
149
+ })
150
+ })
151
+ });
152
+ if (portalState.type === "teleport") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_native.NativePortalProvider, { children: content });
153
+ return content;
183
154
  };
184
155
  const PortalProvider = (0, import_react.memo)(PortalProviderComponent);
185
156
  PortalProvider.displayName = "PortalProvider";
186
157
  const PortalHost = (0, import_react.memo)(function PortalHost2(props) {
187
- return /* @__PURE__ */(0, import_jsx_runtime.jsx)(PortalHostWeb, {
188
- ...props
189
- });
158
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PortalHostWeb, { ...props });
190
159
  });
191
160
  function PortalHostWeb(props) {
192
- (0, import_constants.useIsomorphicLayoutEffect)(() => {
193
- return () => {
194
- import_constants2.allPortalHosts.delete(props.name);
195
- };
196
- }, [props.name]);
197
- return /* @__PURE__ */(0, import_jsx_runtime.jsx)("div", {
198
- style: {
199
- display: "contents"
200
- },
201
- ref: node => {
202
- if (node) {
203
- import_constants2.allPortalHosts.set(props.name, node);
204
- import_constants2.portalListeners[props.name]?.forEach(x => x(node));
205
- }
206
- }
207
- });
208
- }
161
+ (0, import_constants.useIsomorphicLayoutEffect)(() => {
162
+ return () => {
163
+ import_constants2.allPortalHosts.delete(props.name);
164
+ };
165
+ }, [props.name]);
166
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
167
+ style: { display: "contents" },
168
+ ref: (node) => {
169
+ if (node) {
170
+ import_constants2.allPortalHosts.set(props.name, node);
171
+ import_constants2.portalListeners[props.name]?.forEach((x) => x(node));
172
+ }
173
+ }
174
+ });
175
+ }
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all) __defProp(target, name, {
11
+ get: all[name],
12
+ enumerable: true
13
+ });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
18
+ get: () => from[key],
19
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
20
+ });
21
+ }
22
+ return to;
23
+ };
24
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
25
+ value: mod,
26
+ enumerable: true
27
+ }) : target, mod));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var GorhomPortal_exports = {};
30
+ __export(GorhomPortal_exports, {
31
+ ACTIONS: () => ACTIONS,
32
+ INITIAL_STATE: () => INITIAL_STATE,
33
+ PortalHost: () => PortalHost,
34
+ PortalProvider: () => PortalProvider,
35
+ usePortal: () => usePortal
36
+ });
37
+ module.exports = __toCommonJS(GorhomPortal_exports);
38
+ var import_jsx_runtime = require("react/jsx-runtime");
39
+ var import_constants = require("@tamagui/constants");
40
+ var import_native = require("@tamagui/native");
41
+ var import_start_transition = require("@tamagui/start-transition");
42
+ var import_react = __toESM(require("react"), 1);
43
+ require("./constants.native.js");
44
+ var ACTIONS = /* @__PURE__ */ (function(ACTIONS2) {
45
+ ACTIONS2[ACTIONS2["REGISTER_HOST"] = 0] = "REGISTER_HOST";
46
+ ACTIONS2[ACTIONS2["DEREGISTER_HOST"] = 1] = "DEREGISTER_HOST";
47
+ ACTIONS2[ACTIONS2["ADD_UPDATE_PORTAL"] = 2] = "ADD_UPDATE_PORTAL";
48
+ ACTIONS2[ACTIONS2["REMOVE_PORTAL"] = 3] = "REMOVE_PORTAL";
49
+ return ACTIONS2;
50
+ })(ACTIONS || {});
51
+ var INITIAL_STATE = {};
52
+ var registerHost = function(state, hostName) {
53
+ if (!(hostName in state)) state[hostName] = [];
54
+ return state;
55
+ };
56
+ var deregisterHost = function(state, hostName) {
57
+ delete state[hostName];
58
+ return state;
59
+ };
60
+ var addUpdatePortal = function(state, hostName, portalName, node) {
61
+ if (!(hostName in state)) state = registerHost(state, hostName);
62
+ var index = state[hostName].findIndex(function(item) {
63
+ return item.name === portalName;
64
+ });
65
+ if (index !== -1) state[hostName][index].node = node;
66
+ else state[hostName].push({
67
+ name: portalName,
68
+ node
69
+ });
70
+ return state;
71
+ };
72
+ var removePortal = function(state, hostName, portalName) {
73
+ if (!(hostName in state)) {
74
+ if (process.env.NODE_ENV === "development") console.info(`Failed to remove portal '${portalName}', '${hostName}' was not registered!`);
75
+ return state;
76
+ }
77
+ var index = state[hostName].findIndex(function(item) {
78
+ return item.name === portalName;
79
+ });
80
+ if (index !== -1) state[hostName].splice(index, 1);
81
+ return state;
82
+ };
83
+ var reducer = function(state, action) {
84
+ var { type } = action;
85
+ switch (type) {
86
+ case 0: return registerHost({ ...state }, action.hostName);
87
+ case 1: return deregisterHost({ ...state }, action.hostName);
88
+ case 2: return addUpdatePortal({ ...state }, action.hostName, action.portalName, action.node);
89
+ case 3: return removePortal({ ...state }, action.hostName, action.portalName);
90
+ default: return state;
91
+ }
92
+ };
93
+ var PortalStateContext = /* @__PURE__ */ (0, import_react.createContext)(null);
94
+ var PortalDispatchContext = /* @__PURE__ */ (0, import_react.createContext)(null);
95
+ var PortalProviderActiveContext = /* @__PURE__ */ (0, import_react.createContext)(false);
96
+ var usePortalState = function(hostName) {
97
+ var state = (0, import_react.useContext)(PortalStateContext);
98
+ if (state === null) throw new Error("'PortalStateContext' cannot be null, please add 'PortalProvider' to the root component.");
99
+ return state[hostName] || [];
100
+ };
101
+ var usePortal = function() {
102
+ var hostName = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "root";
103
+ var dispatch = (0, import_react.useContext)(PortalDispatchContext);
104
+ if (dispatch === null) throw new Error("'PortalDispatchContext' cannot be null, please add 'PortalProvider' to the root component.");
105
+ var registerHost2 = (0, import_react.useCallback)(function() {
106
+ dispatch({
107
+ type: 0,
108
+ hostName
109
+ });
110
+ }, []);
111
+ var deregisterHost2 = (0, import_react.useCallback)(function() {
112
+ dispatch({
113
+ type: 1,
114
+ hostName
115
+ });
116
+ }, []);
117
+ var addUpdatePortal2 = (0, import_react.useCallback)(function(name, node) {
118
+ dispatch({
119
+ type: 2,
120
+ hostName,
121
+ portalName: name,
122
+ node
123
+ });
124
+ }, []);
125
+ return {
126
+ registerHost: registerHost2,
127
+ deregisterHost: deregisterHost2,
128
+ addPortal: addUpdatePortal2,
129
+ updatePortal: addUpdatePortal2,
130
+ removePortal: (0, import_react.useCallback)(function(name) {
131
+ dispatch({
132
+ type: 3,
133
+ hostName,
134
+ portalName: name
135
+ });
136
+ }, [])
137
+ };
138
+ };
139
+ var PortalProviderComponent = function(param) {
140
+ var { rootHostName = "root", shouldAddRootHost = true, children } = param;
141
+ var isAlreadyInProvider = (0, import_react.useContext)(PortalProviderActiveContext);
142
+ if (process.env.NODE_ENV === "development") {
143
+ if (isAlreadyInProvider && shouldAddRootHost) console.warn(`[tamagui] Nested PortalProvider with shouldAddRootHost detected. This causes hydration mismatches. TamaguiProvider from 'tamagui' already includes PortalProvider - remove the explicit PortalProvider wrapper or set shouldAddRootHost={false}.`);
144
+ }
145
+ var [state, dispatch] = (0, import_react.useReducer)(reducer, INITIAL_STATE);
146
+ var transitionDispatch = (0, import_react.useMemo)(function() {
147
+ var next = function(value) {
148
+ (0, import_start_transition.startTransition)(function() {
149
+ dispatch(value);
150
+ });
151
+ };
152
+ return next;
153
+ }, [dispatch]);
154
+ var portalState = (0, import_native.getPortal)().state;
155
+ var content = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PortalProviderActiveContext.Provider, {
156
+ value: true,
157
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PortalDispatchContext.Provider, {
158
+ value: transitionDispatch,
159
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(PortalStateContext.Provider, {
160
+ value: state,
161
+ children: [children, shouldAddRootHost && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PortalHost, { name: rootHostName })]
162
+ })
163
+ })
164
+ });
165
+ if (portalState.type === "teleport") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_native.NativePortalProvider, { children: content });
166
+ return content;
167
+ };
168
+ var PortalProvider = /* @__PURE__ */ (0, import_react.memo)(PortalProviderComponent);
169
+ PortalProvider.displayName = "PortalProvider";
170
+ var defaultRenderer = function(children) {
171
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
172
+ };
173
+ var PortalHost = /* @__PURE__ */ (0, import_react.memo)(function PortalHost2(props) {
174
+ if ((0, import_native.getPortal)().state.type === "teleport") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_native.NativePortalHost, { name: props.name });
175
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PortalHostNonNative, { ...props });
176
+ });
177
+ function PortalHostNonNative(props) {
178
+ var { name, forwardProps, render = defaultRenderer } = props;
179
+ var state = usePortalState(name);
180
+ var { registerHost: registerHost2, deregisterHost: deregisterHost2 } = usePortal(props.name);
181
+ (0, import_constants.useIsomorphicLayoutEffect)(function() {
182
+ registerHost2();
183
+ return function() {
184
+ deregisterHost2();
185
+ };
186
+ }, []);
187
+ if (forwardProps) return render(state.map(function(item) {
188
+ var next = item.node;
189
+ var { children, ...restForwardProps } = forwardProps;
190
+ if (forwardProps) return import_react.default.Children.map(next, function(child) {
191
+ return /* @__PURE__ */ import_react.default.isValidElement(child) ? /* @__PURE__ */ import_react.default.cloneElement(child, {
192
+ key: child.key,
193
+ ...restForwardProps
194
+ }) : child;
195
+ });
196
+ return next;
197
+ }));
198
+ return render(state.map(function(item) {
199
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.default.Fragment, { children: item.node }, item.name);
200
+ }));
201
+ }