@tamagui/core 1.0.1-beta.193 → 1.0.1-beta.195

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 (220) hide show
  1. package/dist/cjs/Tamagui.js +4 -2
  2. package/dist/cjs/Tamagui.js.map +2 -2
  3. package/dist/cjs/config.js +1 -2
  4. package/dist/cjs/config.js.map +2 -2
  5. package/dist/cjs/constants/constants.js +13 -8
  6. package/dist/cjs/constants/constants.js.map +2 -2
  7. package/dist/cjs/contexts/TextAncestorContext.js +3 -16
  8. package/dist/cjs/contexts/TextAncestorContext.js.map +3 -3
  9. package/dist/cjs/createComponent.js +204 -294
  10. package/dist/cjs/createComponent.js.map +2 -2
  11. package/dist/cjs/createTamagui.js +15 -16
  12. package/dist/cjs/createTamagui.js.map +3 -3
  13. package/dist/cjs/createVariable.js +1 -2
  14. package/dist/cjs/createVariable.js.map +2 -2
  15. package/dist/cjs/helpers/ThemeManager.js +7 -14
  16. package/dist/cjs/helpers/ThemeManager.js.map +2 -2
  17. package/dist/cjs/helpers/{createShallowUpdate.js → cache.js} +20 -21
  18. package/dist/cjs/helpers/cache.js.map +7 -0
  19. package/dist/cjs/helpers/createMediaStyle.js +14 -8
  20. package/dist/cjs/helpers/createMediaStyle.js.map +2 -2
  21. package/dist/cjs/helpers/extendStaticConfig.js +0 -1
  22. package/dist/cjs/helpers/extendStaticConfig.js.map +2 -2
  23. package/dist/cjs/helpers/getSplitStyles.js +212 -93
  24. package/dist/cjs/helpers/getSplitStyles.js.map +3 -3
  25. package/dist/cjs/helpers/getStylesAtomic.js +16 -36
  26. package/dist/cjs/helpers/getStylesAtomic.js.map +3 -3
  27. package/dist/cjs/helpers/insertStyleRule.js +14 -6
  28. package/dist/cjs/helpers/insertStyleRule.js.map +2 -2
  29. package/dist/cjs/helpers/matchMedia.js.map +2 -2
  30. package/dist/cjs/helpers/mergeTransform.js.map +1 -1
  31. package/dist/cjs/helpers/normalizeValueWithProperty.js +32 -2
  32. package/dist/cjs/helpers/normalizeValueWithProperty.js.map +2 -2
  33. package/dist/cjs/helpers/useShallowSetState.js.map +2 -2
  34. package/dist/cjs/hooks/getThemeUnwrapped.js +1 -3
  35. package/dist/cjs/hooks/getThemeUnwrapped.js.map +2 -2
  36. package/dist/cjs/hooks/useElementLayout.js +92 -0
  37. package/dist/cjs/hooks/useElementLayout.js.map +7 -0
  38. package/dist/cjs/hooks/useIsTouchDevice.js +2 -10
  39. package/dist/cjs/hooks/useIsTouchDevice.js.map +2 -2
  40. package/dist/cjs/hooks/useMedia.js +77 -84
  41. package/dist/cjs/hooks/useMedia.js.map +2 -2
  42. package/dist/cjs/hooks/useMedia.test.js +2 -0
  43. package/dist/cjs/{helpers/validate.js.map → hooks/useMedia.test.js.map} +0 -0
  44. package/dist/cjs/hooks/usePressablePressResponder.js +370 -0
  45. package/dist/cjs/hooks/usePressablePressResponder.js.map +7 -0
  46. package/dist/cjs/hooks/useSafeRef.js +13 -15
  47. package/dist/cjs/hooks/useSafeRef.js.map +2 -2
  48. package/dist/cjs/hooks/useTheme.js +3 -4
  49. package/dist/cjs/hooks/useTheme.js.map +2 -2
  50. package/dist/cjs/index.js +1 -17
  51. package/dist/cjs/index.js.map +2 -2
  52. package/dist/cjs/static.js +0 -20
  53. package/dist/cjs/static.js.map +2 -2
  54. package/dist/cjs/styled.js +4 -22
  55. package/dist/cjs/styled.js.map +2 -2
  56. package/dist/cjs/types.js.map +1 -1
  57. package/dist/cjs/{hooks/useIsSSR.js → views/AbsoluteFill.js} +18 -23
  58. package/dist/cjs/views/AbsoluteFill.js.map +7 -0
  59. package/dist/cjs/views/AbsoluteFill.native.js +45 -0
  60. package/dist/cjs/views/AbsoluteFill.native.js.map +7 -0
  61. package/dist/cjs/views/FontLanguage.native.js.map +2 -2
  62. package/dist/cjs/views/Stack.js.map +1 -1
  63. package/dist/cjs/views/TamaguiProvider.js +3 -2
  64. package/dist/cjs/views/TamaguiProvider.js.map +2 -2
  65. package/dist/cjs/views/Text.js.map +1 -1
  66. package/dist/cjs/views/ThemeReset.js +10 -10
  67. package/dist/cjs/views/ThemeReset.js.map +2 -2
  68. package/dist/esm/Tamagui.js +4 -2
  69. package/dist/esm/Tamagui.js.map +2 -2
  70. package/dist/esm/config.js +1 -2
  71. package/dist/esm/config.js.map +2 -2
  72. package/dist/esm/constants/constants.js +11 -7
  73. package/dist/esm/constants/constants.js.map +2 -2
  74. package/dist/esm/contexts/TextAncestorContext.js +2 -13
  75. package/dist/esm/contexts/TextAncestorContext.js.map +2 -2
  76. package/dist/esm/createComponent.js +203 -296
  77. package/dist/esm/createComponent.js.map +2 -2
  78. package/dist/esm/createTamagui.js +15 -16
  79. package/dist/esm/createTamagui.js.map +3 -3
  80. package/dist/esm/createVariable.js +1 -2
  81. package/dist/esm/createVariable.js.map +2 -2
  82. package/dist/esm/helpers/ThemeManager.js +7 -14
  83. package/dist/esm/helpers/ThemeManager.js.map +2 -2
  84. package/dist/esm/helpers/cache.js +18 -0
  85. package/dist/esm/helpers/cache.js.map +7 -0
  86. package/dist/esm/helpers/createMediaStyle.js +14 -8
  87. package/dist/esm/helpers/createMediaStyle.js.map +2 -2
  88. package/dist/esm/helpers/extendStaticConfig.js +0 -1
  89. package/dist/esm/helpers/extendStaticConfig.js.map +2 -2
  90. package/dist/esm/helpers/getSplitStyles.js +221 -94
  91. package/dist/esm/helpers/getSplitStyles.js.map +3 -3
  92. package/dist/esm/helpers/getStylesAtomic.js +13 -26
  93. package/dist/esm/helpers/getStylesAtomic.js.map +2 -2
  94. package/dist/esm/helpers/insertStyleRule.js +14 -6
  95. package/dist/esm/helpers/insertStyleRule.js.map +2 -2
  96. package/dist/esm/helpers/matchMedia.js.map +2 -2
  97. package/dist/esm/helpers/mergeTransform.js.map +1 -1
  98. package/dist/esm/helpers/normalizeValueWithProperty.js +30 -1
  99. package/dist/esm/helpers/normalizeValueWithProperty.js.map +2 -2
  100. package/dist/esm/helpers/useShallowSetState.js.map +2 -2
  101. package/dist/esm/hooks/getThemeUnwrapped.js +1 -3
  102. package/dist/esm/hooks/getThemeUnwrapped.js.map +2 -2
  103. package/dist/esm/hooks/useElementLayout.js +66 -0
  104. package/dist/esm/hooks/useElementLayout.js.map +7 -0
  105. package/dist/esm/hooks/useIsTouchDevice.js +3 -11
  106. package/dist/esm/hooks/useIsTouchDevice.js.map +2 -2
  107. package/dist/esm/hooks/useMedia.js +74 -83
  108. package/dist/esm/hooks/useMedia.js.map +2 -2
  109. package/dist/esm/hooks/useMedia.test.js +1 -0
  110. package/dist/esm/{helpers/validate.js.map → hooks/useMedia.test.js.map} +0 -0
  111. package/dist/esm/hooks/usePressablePressResponder.js +346 -0
  112. package/dist/esm/hooks/usePressablePressResponder.js.map +7 -0
  113. package/dist/esm/hooks/useSafeRef.js +13 -15
  114. package/dist/esm/hooks/useSafeRef.js.map +2 -2
  115. package/dist/esm/hooks/useTheme.js +3 -4
  116. package/dist/esm/hooks/useTheme.js.map +2 -2
  117. package/dist/esm/index.js +1 -14
  118. package/dist/esm/index.js.map +2 -2
  119. package/dist/esm/static.js +0 -14
  120. package/dist/esm/static.js.map +2 -2
  121. package/dist/esm/styled.js +4 -22
  122. package/dist/esm/styled.js.map +2 -2
  123. package/dist/esm/views/AbsoluteFill.js +17 -0
  124. package/dist/esm/views/AbsoluteFill.js.map +7 -0
  125. package/dist/esm/views/AbsoluteFill.native.js +21 -0
  126. package/dist/esm/views/AbsoluteFill.native.js.map +7 -0
  127. package/dist/esm/views/FontLanguage.native.js.map +2 -2
  128. package/dist/esm/views/Stack.js.map +1 -1
  129. package/dist/esm/views/TamaguiProvider.js +5 -4
  130. package/dist/esm/views/TamaguiProvider.js.map +2 -2
  131. package/dist/esm/views/Text.js.map +1 -1
  132. package/dist/esm/views/ThemeReset.js +10 -10
  133. package/dist/esm/views/ThemeReset.js.map +2 -2
  134. package/package.json +14 -14
  135. package/src/Tamagui.ts +7 -3
  136. package/src/config.ts +2 -3
  137. package/src/constants/constants.ts +10 -6
  138. package/src/contexts/TextAncestorContext.tsx +1 -8
  139. package/src/createComponent.tsx +256 -421
  140. package/src/createTamagui.ts +16 -19
  141. package/src/createVariable.ts +1 -3
  142. package/src/helpers/ThemeManager.tsx +7 -15
  143. package/src/helpers/cache.ts +18 -0
  144. package/src/helpers/createMediaStyle.ts +16 -9
  145. package/src/helpers/extendStaticConfig.ts +0 -1
  146. package/src/helpers/getSplitStyles.tsx +257 -151
  147. package/src/helpers/getStylesAtomic.ts +14 -34
  148. package/src/helpers/insertStyleRule.tsx +16 -8
  149. package/src/helpers/matchMedia.ts +1 -0
  150. package/src/helpers/mergeTransform.ts +1 -1
  151. package/src/helpers/normalizeValueWithProperty.ts +30 -0
  152. package/src/helpers/useShallowSetState.tsx +0 -1
  153. package/src/hooks/getThemeUnwrapped.tsx +1 -2
  154. package/src/hooks/useElementLayout.tsx +90 -0
  155. package/src/hooks/useIsTouchDevice.tsx +3 -17
  156. package/src/hooks/useMedia.tsx +80 -87
  157. package/src/hooks/useSafeRef.ts +17 -18
  158. package/src/hooks/useTheme.tsx +4 -4
  159. package/src/index.ts +1 -11
  160. package/src/static.ts +0 -10
  161. package/src/styled.tsx +15 -33
  162. package/src/types.tsx +58 -55
  163. package/src/views/FontLanguage.native.tsx +1 -0
  164. package/src/views/Stack.tsx +1 -1
  165. package/src/views/TamaguiProvider.tsx +5 -5
  166. package/src/views/Text.tsx +1 -1
  167. package/src/views/ThemeReset.tsx +11 -11
  168. package/types/Tamagui.d.ts +6 -4
  169. package/types/constants/constants.d.ts +14 -3
  170. package/types/contexts/TextAncestorContext.d.ts +1 -3
  171. package/types/createComponent.d.ts +0 -15
  172. package/types/helpers/ThemeManager.d.ts +2 -3
  173. package/types/helpers/cache.d.ts +12 -0
  174. package/types/helpers/calc.d.ts +0 -16
  175. package/types/helpers/createMediaStyle.d.ts +1 -1
  176. package/types/helpers/getSplitStyles.d.ts +6 -10
  177. package/types/helpers/getStylesAtomic.d.ts +1 -5
  178. package/types/helpers/insertStyleRule.d.ts +2 -2
  179. package/types/helpers/mergeTransform.d.ts +1 -1
  180. package/types/helpers/normalizeValueWithProperty.d.ts +1 -0
  181. package/types/hooks/useElementLayout.d.ts +27 -0
  182. package/types/hooks/useMedia.d.ts +3 -1
  183. package/types/hooks/useMedia.test.d.ts +1 -0
  184. package/types/hooks/usePressablePressResponder.d.ts +84 -0
  185. package/types/index.d.ts +1 -11
  186. package/types/static.d.ts +0 -1
  187. package/types/types.d.ts +42 -44
  188. package/types/views/AbsoluteFill.d.ts +5 -0
  189. package/types/views/AbsoluteFill.native.d.ts +3 -0
  190. package/types/views/Stack.d.ts +1 -1
  191. package/types/views/Text.d.ts +1 -1
  192. package/dist/cjs/constants/platform.js +0 -74
  193. package/dist/cjs/constants/platform.js.map +0 -7
  194. package/dist/cjs/constants/platform.native.js +0 -62
  195. package/dist/cjs/constants/platform.native.js.map +0 -7
  196. package/dist/cjs/helpers/createShallowUpdate.js.map +0 -7
  197. package/dist/cjs/helpers/validate.js +0 -2
  198. package/dist/cjs/hooks/useDidFinishSSR.js +0 -60
  199. package/dist/cjs/hooks/useDidFinishSSR.js.map +0 -7
  200. package/dist/cjs/hooks/useIsSSR.js.map +0 -7
  201. package/dist/esm/constants/platform.js +0 -39
  202. package/dist/esm/constants/platform.js.map +0 -7
  203. package/dist/esm/constants/platform.native.js +0 -28
  204. package/dist/esm/constants/platform.native.js.map +0 -7
  205. package/dist/esm/helpers/createShallowUpdate.js +0 -20
  206. package/dist/esm/helpers/createShallowUpdate.js.map +0 -7
  207. package/dist/esm/helpers/validate.js +0 -1
  208. package/dist/esm/hooks/useDidFinishSSR.js +0 -35
  209. package/dist/esm/hooks/useDidFinishSSR.js.map +0 -7
  210. package/dist/esm/hooks/useIsSSR.js +0 -22
  211. package/dist/esm/hooks/useIsSSR.js.map +0 -7
  212. package/src/helpers/assignNativePropsToWeb.tsx +0 -178
  213. package/src/helpers/calc.ts +0 -68
  214. package/src/helpers/getFont.tsx +0 -43
  215. package/src/helpers/getStackSize.ts +0 -22
  216. package/src/helpers/startTransition.ts +0 -4
  217. package/src/hooks/useConstant.tsx +0 -19
  218. package/src/hooks/useIsMounted.ts +0 -16
  219. package/src/hooks/usePressable.tsx +0 -9
  220. package/src/hooks/useUnmountEffect.ts +0 -5
@@ -0,0 +1,346 @@
1
+ const DELAY = "DELAY";
2
+ const ERROR = "ERROR";
3
+ const LONG_PRESS_DETECTED = "LONG_PRESS_DETECTED";
4
+ const NOT_RESPONDER = "NOT_RESPONDER";
5
+ const RESPONDER_ACTIVE_LONG_PRESS_START = "RESPONDER_ACTIVE_LONG_PRESS_START";
6
+ const RESPONDER_ACTIVE_PRESS_START = "RESPONDER_ACTIVE_PRESS_START";
7
+ const RESPONDER_INACTIVE_PRESS_START = "RESPONDER_INACTIVE_PRESS_START";
8
+ const RESPONDER_GRANT = "RESPONDER_GRANT";
9
+ const RESPONDER_RELEASE = "RESPONDER_RELEASE";
10
+ const RESPONDER_TERMINATED = "RESPONDER_TERMINATED";
11
+ const Transitions = Object.freeze({
12
+ NOT_RESPONDER: {
13
+ DELAY: ERROR,
14
+ RESPONDER_GRANT: RESPONDER_INACTIVE_PRESS_START,
15
+ RESPONDER_RELEASE: ERROR,
16
+ RESPONDER_TERMINATED: ERROR,
17
+ LONG_PRESS_DETECTED: ERROR
18
+ },
19
+ RESPONDER_INACTIVE_PRESS_START: {
20
+ DELAY: RESPONDER_ACTIVE_PRESS_START,
21
+ RESPONDER_GRANT: ERROR,
22
+ RESPONDER_RELEASE: NOT_RESPONDER,
23
+ RESPONDER_TERMINATED: NOT_RESPONDER,
24
+ LONG_PRESS_DETECTED: ERROR
25
+ },
26
+ RESPONDER_ACTIVE_PRESS_START: {
27
+ DELAY: ERROR,
28
+ RESPONDER_GRANT: ERROR,
29
+ RESPONDER_RELEASE: NOT_RESPONDER,
30
+ RESPONDER_TERMINATED: NOT_RESPONDER,
31
+ LONG_PRESS_DETECTED: RESPONDER_ACTIVE_LONG_PRESS_START
32
+ },
33
+ RESPONDER_ACTIVE_LONG_PRESS_START: {
34
+ DELAY: ERROR,
35
+ RESPONDER_GRANT: ERROR,
36
+ RESPONDER_RELEASE: NOT_RESPONDER,
37
+ RESPONDER_TERMINATED: NOT_RESPONDER,
38
+ LONG_PRESS_DETECTED: RESPONDER_ACTIVE_LONG_PRESS_START
39
+ },
40
+ ERROR: {
41
+ DELAY: NOT_RESPONDER,
42
+ RESPONDER_GRANT: RESPONDER_INACTIVE_PRESS_START,
43
+ RESPONDER_RELEASE: NOT_RESPONDER,
44
+ RESPONDER_TERMINATED: NOT_RESPONDER,
45
+ LONG_PRESS_DETECTED: NOT_RESPONDER
46
+ }
47
+ });
48
+ const isActiveSignal = (signal) => signal === RESPONDER_ACTIVE_PRESS_START || signal === RESPONDER_ACTIVE_LONG_PRESS_START;
49
+ const isButtonRole = (element) => element.getAttribute("role") === "button";
50
+ const isPressStartSignal = (signal) => signal === RESPONDER_INACTIVE_PRESS_START || signal === RESPONDER_ACTIVE_PRESS_START || signal === RESPONDER_ACTIVE_LONG_PRESS_START;
51
+ const isTerminalSignal = (signal) => signal === RESPONDER_TERMINATED || signal === RESPONDER_RELEASE;
52
+ const isValidKeyPress = (event) => {
53
+ const { key, target } = event;
54
+ const role = target.getAttribute("role");
55
+ const isSpacebar = key === " " || key === "Spacebar";
56
+ return key === "Enter" || isSpacebar && role === "button";
57
+ };
58
+ const DEFAULT_LONG_PRESS_DELAY_MS = 450;
59
+ const DEFAULT_PRESS_DELAY_MS = 50;
60
+ class PressResponder {
61
+ constructor(config) {
62
+ this._eventHandlers = null;
63
+ this._isPointerTouch = false;
64
+ this._longPressDelayTimeout = null;
65
+ this._longPressDispatched = false;
66
+ this._pressDelayTimeout = null;
67
+ this._pressOutDelayTimeout = null;
68
+ this._touchState = NOT_RESPONDER;
69
+ this._config = config;
70
+ }
71
+ configure(config) {
72
+ this._config = config;
73
+ }
74
+ reset() {
75
+ this._cancelLongPressDelayTimeout();
76
+ this._cancelPressDelayTimeout();
77
+ this._cancelPressOutDelayTimeout();
78
+ }
79
+ getEventHandlers() {
80
+ if (this._eventHandlers == null) {
81
+ this._eventHandlers = this._createEventHandlers();
82
+ }
83
+ return this._eventHandlers;
84
+ }
85
+ _createEventHandlers() {
86
+ const start = (event, shouldDelay) => {
87
+ event.persist();
88
+ this._cancelPressOutDelayTimeout();
89
+ this._longPressDispatched = false;
90
+ this._selectionTerminated = false;
91
+ this._touchState = NOT_RESPONDER;
92
+ this._isPointerTouch = event.nativeEvent.type === "touchstart";
93
+ this._receiveSignal(RESPONDER_GRANT, event);
94
+ const delayPressStart = normalizeDelay(
95
+ this._config.delayPressStart,
96
+ 0,
97
+ DEFAULT_PRESS_DELAY_MS
98
+ );
99
+ if (shouldDelay !== false && delayPressStart > 0) {
100
+ this._pressDelayTimeout = setTimeout(() => {
101
+ this._receiveSignal(DELAY, event);
102
+ }, delayPressStart);
103
+ } else {
104
+ this._receiveSignal(DELAY, event);
105
+ }
106
+ const delayLongPress = normalizeDelay(
107
+ this._config.delayLongPress,
108
+ 10,
109
+ DEFAULT_LONG_PRESS_DELAY_MS
110
+ );
111
+ this._longPressDelayTimeout = setTimeout(() => {
112
+ this._handleLongPress(event);
113
+ }, delayLongPress + delayPressStart);
114
+ };
115
+ const end = (event) => {
116
+ this._receiveSignal(RESPONDER_RELEASE, event);
117
+ };
118
+ const keyupHandler = (event) => {
119
+ const { onPress } = this._config;
120
+ const { target } = event;
121
+ if (this._touchState !== NOT_RESPONDER && isValidKeyPress(event)) {
122
+ end(event);
123
+ document.removeEventListener("keyup", keyupHandler);
124
+ const role = target.getAttribute("role");
125
+ const elementType = target.tagName.toLowerCase();
126
+ const isNativeInteractiveElement = role === "link" || elementType === "a" || elementType === "button" || elementType === "input" || elementType === "select" || elementType === "textarea";
127
+ if (onPress != null && !isNativeInteractiveElement) {
128
+ onPress(event);
129
+ }
130
+ }
131
+ };
132
+ return {
133
+ onStartShouldSetResponder: (event) => {
134
+ const { disabled } = this._config;
135
+ if (disabled && isButtonRole(event.currentTarget)) {
136
+ event.stopPropagation();
137
+ }
138
+ if (disabled == null) {
139
+ return true;
140
+ }
141
+ return !disabled;
142
+ },
143
+ onKeyDown: (event) => {
144
+ const { disabled } = this._config;
145
+ const { key, target } = event;
146
+ if (!disabled && isValidKeyPress(event)) {
147
+ if (this._touchState === NOT_RESPONDER) {
148
+ start(event, false);
149
+ document.addEventListener("keyup", keyupHandler);
150
+ }
151
+ const role = target.getAttribute("role");
152
+ const isSpacebarKey = key === " " || key === "Spacebar";
153
+ const isButtonRole2 = role === "button" || role === "menuitem";
154
+ if (isSpacebarKey && isButtonRole2) {
155
+ event.preventDefault();
156
+ }
157
+ event.stopPropagation();
158
+ }
159
+ },
160
+ onResponderGrant: (event) => start(event),
161
+ onResponderMove: (event) => {
162
+ if (this._config.onPressMove != null) {
163
+ this._config.onPressMove(event);
164
+ }
165
+ const touch = getTouchFromResponderEvent(event);
166
+ if (this._touchActivatePosition != null) {
167
+ const deltaX = this._touchActivatePosition.pageX - touch.pageX;
168
+ const deltaY = this._touchActivatePosition.pageY - touch.pageY;
169
+ if (Math.hypot(deltaX, deltaY) > 10) {
170
+ this._cancelLongPressDelayTimeout();
171
+ }
172
+ }
173
+ },
174
+ onResponderRelease: (event) => end(event),
175
+ onResponderTerminate: (event) => {
176
+ if (event.nativeEvent.type === "selectionchange") {
177
+ this._selectionTerminated = true;
178
+ }
179
+ this._receiveSignal(RESPONDER_TERMINATED, event);
180
+ },
181
+ onResponderTerminationRequest: (event) => {
182
+ const { cancelable, disabled, onLongPress } = this._config;
183
+ if (!disabled && onLongPress != null && this._isPointerTouch && event.nativeEvent.type === "contextmenu") {
184
+ return false;
185
+ }
186
+ if (cancelable == null) {
187
+ return true;
188
+ }
189
+ return cancelable;
190
+ },
191
+ onClick: (event) => {
192
+ const { disabled, onPress } = this._config;
193
+ if (!disabled) {
194
+ event.stopPropagation();
195
+ if (this._longPressDispatched || this._selectionTerminated) {
196
+ event.preventDefault();
197
+ } else if (onPress != null && event.altKey === false) {
198
+ onPress(event);
199
+ }
200
+ } else {
201
+ if (isButtonRole(event.currentTarget)) {
202
+ event.stopPropagation();
203
+ }
204
+ }
205
+ },
206
+ onContextMenu: (event) => {
207
+ const { disabled, onLongPress } = this._config;
208
+ if (!disabled) {
209
+ if (onLongPress != null && this._isPointerTouch && !event.defaultPrevented) {
210
+ event.preventDefault();
211
+ event.stopPropagation();
212
+ }
213
+ } else {
214
+ if (isButtonRole(event.currentTarget)) {
215
+ event.stopPropagation();
216
+ }
217
+ }
218
+ }
219
+ };
220
+ }
221
+ _receiveSignal(signal, event) {
222
+ const prevState = this._touchState;
223
+ let nextState = null;
224
+ if (Transitions[prevState] != null) {
225
+ nextState = Transitions[prevState][signal];
226
+ }
227
+ if (this._touchState === NOT_RESPONDER && signal === RESPONDER_RELEASE) {
228
+ return;
229
+ }
230
+ if (nextState == null || nextState === ERROR) {
231
+ console.error(`PressResponder: Invalid signal ${signal} for state ${prevState} on responder`);
232
+ } else if (prevState !== nextState) {
233
+ this._performTransitionSideEffects(prevState, nextState, signal, event);
234
+ this._touchState = nextState;
235
+ }
236
+ }
237
+ _performTransitionSideEffects(prevState, nextState, signal, event) {
238
+ if (isTerminalSignal(signal)) {
239
+ setTimeout(() => {
240
+ this._isPointerTouch = false;
241
+ }, 0);
242
+ this._touchActivatePosition = null;
243
+ this._cancelLongPressDelayTimeout();
244
+ }
245
+ if (isPressStartSignal(prevState) && signal === LONG_PRESS_DETECTED) {
246
+ const { onLongPress } = this._config;
247
+ if (onLongPress != null && event.nativeEvent.key == null) {
248
+ onLongPress(event);
249
+ this._longPressDispatched = true;
250
+ }
251
+ }
252
+ const isPrevActive = isActiveSignal(prevState);
253
+ const isNextActive = isActiveSignal(nextState);
254
+ if (!isPrevActive && isNextActive) {
255
+ this._activate(event);
256
+ } else if (isPrevActive && !isNextActive) {
257
+ this._deactivate(event);
258
+ }
259
+ if (isPressStartSignal(prevState) && signal === RESPONDER_RELEASE) {
260
+ const { onLongPress, onPress } = this._config;
261
+ if (onPress != null) {
262
+ const isPressCanceledByLongPress = onLongPress != null && prevState === RESPONDER_ACTIVE_LONG_PRESS_START;
263
+ if (!isPressCanceledByLongPress) {
264
+ if (!isNextActive && !isPrevActive) {
265
+ this._activate(event);
266
+ this._deactivate(event);
267
+ }
268
+ }
269
+ }
270
+ }
271
+ this._cancelPressDelayTimeout();
272
+ }
273
+ _activate(event) {
274
+ const { onPressChange, onPressStart } = this._config;
275
+ const touch = getTouchFromResponderEvent(event);
276
+ this._touchActivatePosition = {
277
+ pageX: touch.pageX,
278
+ pageY: touch.pageY
279
+ };
280
+ if (onPressStart != null) {
281
+ onPressStart(event);
282
+ }
283
+ if (onPressChange != null) {
284
+ onPressChange(true);
285
+ }
286
+ }
287
+ _deactivate(event) {
288
+ const { onPressChange, onPressEnd } = this._config;
289
+ function end() {
290
+ if (onPressEnd != null) {
291
+ onPressEnd(event);
292
+ }
293
+ if (onPressChange != null) {
294
+ onPressChange(false);
295
+ }
296
+ }
297
+ const delayPressEnd = normalizeDelay(this._config.delayPressEnd);
298
+ if (delayPressEnd > 0) {
299
+ this._pressOutDelayTimeout = setTimeout(() => {
300
+ end();
301
+ }, delayPressEnd);
302
+ } else {
303
+ end();
304
+ }
305
+ }
306
+ _handleLongPress(event) {
307
+ if (this._touchState === RESPONDER_ACTIVE_PRESS_START || this._touchState === RESPONDER_ACTIVE_LONG_PRESS_START) {
308
+ this._receiveSignal(LONG_PRESS_DETECTED, event);
309
+ }
310
+ }
311
+ _cancelLongPressDelayTimeout() {
312
+ if (this._longPressDelayTimeout != null) {
313
+ clearTimeout(this._longPressDelayTimeout);
314
+ this._longPressDelayTimeout = null;
315
+ }
316
+ }
317
+ _cancelPressDelayTimeout() {
318
+ if (this._pressDelayTimeout != null) {
319
+ clearTimeout(this._pressDelayTimeout);
320
+ this._pressDelayTimeout = null;
321
+ }
322
+ }
323
+ _cancelPressOutDelayTimeout() {
324
+ if (this._pressOutDelayTimeout != null) {
325
+ clearTimeout(this._pressOutDelayTimeout);
326
+ this._pressOutDelayTimeout = null;
327
+ }
328
+ }
329
+ }
330
+ function normalizeDelay(delay, min = 0, fallback = 0) {
331
+ return Math.max(min, delay ?? fallback);
332
+ }
333
+ function getTouchFromResponderEvent(event) {
334
+ const { changedTouches, touches } = event.nativeEvent;
335
+ if (touches != null && touches.length > 0) {
336
+ return touches[0];
337
+ }
338
+ if (changedTouches != null && changedTouches.length > 0) {
339
+ return changedTouches[0];
340
+ }
341
+ return event.nativeEvent;
342
+ }
343
+ export {
344
+ PressResponder
345
+ };
346
+ //# sourceMappingURL=usePressablePressResponder.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/hooks/usePressablePressResponder.tsx"],
4
+ "sourcesContent": ["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow strict-local\n * @format\n */\n\n'use strict'\n\ntype ClickEvent = any\ntype KeyboardEvent = any\ntype ResponderEvent = any\n\nexport type PressResponderConfig = {\n // The gesture can be interrupted by a parent gesture, e.g., scroll.\n // Defaults to true.\n cancelable?: boolean | null\n // Whether to disable initialization of the press gesture.\n disabled?: boolean | null\n // Duration (in addition to `delayPressStart`) after which a press gesture is\n // considered a long press gesture. Defaults to 500 (milliseconds).\n delayLongPress?: number | null\n // Duration to wait after press down before calling `onPressStart`.\n delayPressStart?: number | null\n // Duration to wait after letting up before calling `onPressEnd`.\n delayPressEnd?: number | null\n // Called when a long press gesture has been triggered.\n onLongPress?: ((event: ResponderEvent) => void) | null\n // Called when a press gestute has been triggered.\n onPress?: ((event: ClickEvent) => void) | null\n // Called when the press is activated to provide visual feedback.\n onPressChange?: ((event: ResponderEvent) => void) | null\n // Called when the press is activated to provide visual feedback.\n onPressStart?: ((event: ResponderEvent) => void) | null\n // Called when the press location moves. (This should rarely be used.)\n onPressMove?: ((event: ResponderEvent) => void) | null\n // Called when the press is deactivated to undo visual feedback.\n onPressEnd?: ((event: ResponderEvent) => void) | null\n}\n\nexport type EventHandlers = {\n onClick: (event: ClickEvent) => void\n onContextMenu: (event: ClickEvent) => void\n onKeyDown: (event: KeyboardEvent) => void\n onResponderGrant: (event: ResponderEvent) => void\n onResponderMove: (event: ResponderEvent) => void\n onResponderRelease: (event: ResponderEvent) => void\n onResponderTerminate: (event: ResponderEvent) => void\n onResponderTerminationRequest: (event: ResponderEvent) => boolean\n onStartShouldSetResponder: (event: ResponderEvent) => boolean\n}\n\ntype TouchState =\n | 'NOT_RESPONDER'\n | 'RESPONDER_INACTIVE_PRESS_START'\n | 'RESPONDER_ACTIVE_PRESS_START'\n | 'RESPONDER_ACTIVE_LONG_PRESS_START'\n | 'ERROR'\n\ntype TouchSignal =\n | 'DELAY'\n | 'RESPONDER_GRANT'\n | 'RESPONDER_RELEASE'\n | 'RESPONDER_TERMINATED'\n | 'LONG_PRESS_DETECTED'\n\nconst DELAY = 'DELAY'\nconst ERROR = 'ERROR'\nconst LONG_PRESS_DETECTED = 'LONG_PRESS_DETECTED'\nconst NOT_RESPONDER = 'NOT_RESPONDER'\nconst RESPONDER_ACTIVE_LONG_PRESS_START = 'RESPONDER_ACTIVE_LONG_PRESS_START'\nconst RESPONDER_ACTIVE_PRESS_START = 'RESPONDER_ACTIVE_PRESS_START'\nconst RESPONDER_INACTIVE_PRESS_START = 'RESPONDER_INACTIVE_PRESS_START'\nconst RESPONDER_GRANT = 'RESPONDER_GRANT'\nconst RESPONDER_RELEASE = 'RESPONDER_RELEASE'\nconst RESPONDER_TERMINATED = 'RESPONDER_TERMINATED'\n\nconst Transitions = Object.freeze({\n NOT_RESPONDER: {\n DELAY: ERROR,\n RESPONDER_GRANT: RESPONDER_INACTIVE_PRESS_START,\n RESPONDER_RELEASE: ERROR,\n RESPONDER_TERMINATED: ERROR,\n LONG_PRESS_DETECTED: ERROR,\n },\n RESPONDER_INACTIVE_PRESS_START: {\n DELAY: RESPONDER_ACTIVE_PRESS_START,\n RESPONDER_GRANT: ERROR,\n RESPONDER_RELEASE: NOT_RESPONDER,\n RESPONDER_TERMINATED: NOT_RESPONDER,\n LONG_PRESS_DETECTED: ERROR,\n },\n RESPONDER_ACTIVE_PRESS_START: {\n DELAY: ERROR,\n RESPONDER_GRANT: ERROR,\n RESPONDER_RELEASE: NOT_RESPONDER,\n RESPONDER_TERMINATED: NOT_RESPONDER,\n LONG_PRESS_DETECTED: RESPONDER_ACTIVE_LONG_PRESS_START,\n },\n RESPONDER_ACTIVE_LONG_PRESS_START: {\n DELAY: ERROR,\n RESPONDER_GRANT: ERROR,\n RESPONDER_RELEASE: NOT_RESPONDER,\n RESPONDER_TERMINATED: NOT_RESPONDER,\n LONG_PRESS_DETECTED: RESPONDER_ACTIVE_LONG_PRESS_START,\n },\n ERROR: {\n DELAY: NOT_RESPONDER,\n RESPONDER_GRANT: RESPONDER_INACTIVE_PRESS_START,\n RESPONDER_RELEASE: NOT_RESPONDER,\n RESPONDER_TERMINATED: NOT_RESPONDER,\n LONG_PRESS_DETECTED: NOT_RESPONDER,\n },\n})\n\nconst isActiveSignal = (signal) =>\n signal === RESPONDER_ACTIVE_PRESS_START || signal === RESPONDER_ACTIVE_LONG_PRESS_START\n\nconst isButtonRole = (element) => element.getAttribute('role') === 'button'\n\nconst isPressStartSignal = (signal) =>\n signal === RESPONDER_INACTIVE_PRESS_START ||\n signal === RESPONDER_ACTIVE_PRESS_START ||\n signal === RESPONDER_ACTIVE_LONG_PRESS_START\n\nconst isTerminalSignal = (signal) => signal === RESPONDER_TERMINATED || signal === RESPONDER_RELEASE\n\nconst isValidKeyPress = (event) => {\n const { key, target } = event\n const role = target.getAttribute('role')\n const isSpacebar = key === ' ' || key === 'Spacebar'\n\n return key === 'Enter' || (isSpacebar && role === 'button')\n}\n\nconst DEFAULT_LONG_PRESS_DELAY_MS = 450 // 500 - 50\nconst DEFAULT_PRESS_DELAY_MS = 50\n\ntype TimeoutID = NodeJS.Timer | null\n\nexport class PressResponder {\n _config: PressResponderConfig\n _eventHandlers?: EventHandlers | null = null\n _isPointerTouch?: boolean = false\n _longPressDelayTimeout?: TimeoutID = null\n _longPressDispatched?: boolean = false\n _pressDelayTimeout?: TimeoutID = null\n _pressOutDelayTimeout?: TimeoutID = null\n _selectionTerminated?: boolean\n _touchActivatePosition?: {\n pageX: number\n pageY: number\n } | null\n _touchState: TouchState = NOT_RESPONDER\n\n constructor(config: PressResponderConfig) {\n this._config = config\n }\n\n configure(config: PressResponderConfig) {\n this._config = config\n }\n\n /**\n * Resets any pending timers. This should be called on unmount.\n */\n reset(): void {\n this._cancelLongPressDelayTimeout()\n this._cancelPressDelayTimeout()\n this._cancelPressOutDelayTimeout()\n }\n\n /**\n * Returns a set of props to spread into the interactive element.\n */\n getEventHandlers(): EventHandlers {\n if (this._eventHandlers == null) {\n this._eventHandlers = this._createEventHandlers()\n }\n return this._eventHandlers\n }\n\n _createEventHandlers(): EventHandlers {\n const start = (event: ResponderEvent, shouldDelay?: boolean): void => {\n event.persist()\n\n this._cancelPressOutDelayTimeout()\n\n this._longPressDispatched = false\n this._selectionTerminated = false\n this._touchState = NOT_RESPONDER\n this._isPointerTouch = event.nativeEvent.type === 'touchstart'\n\n this._receiveSignal(RESPONDER_GRANT, event)\n\n const delayPressStart = normalizeDelay(\n // @ts-ignore\n this._config.delayPressStart,\n 0,\n DEFAULT_PRESS_DELAY_MS\n )\n\n if (shouldDelay !== false && delayPressStart > 0) {\n this._pressDelayTimeout = setTimeout(() => {\n this._receiveSignal(DELAY, event)\n }, delayPressStart)\n } else {\n this._receiveSignal(DELAY, event)\n }\n\n const delayLongPress = normalizeDelay(\n this._config.delayLongPress,\n 10,\n DEFAULT_LONG_PRESS_DELAY_MS\n )\n this._longPressDelayTimeout = setTimeout(() => {\n this._handleLongPress(event)\n }, delayLongPress + delayPressStart)\n }\n\n const end = (event: ResponderEvent): void => {\n this._receiveSignal(RESPONDER_RELEASE, event)\n }\n\n const keyupHandler = (event: KeyboardEvent) => {\n const { onPress } = this._config\n const { target } = event\n\n if (this._touchState !== NOT_RESPONDER && isValidKeyPress(event)) {\n end(event)\n document.removeEventListener('keyup', keyupHandler)\n\n const role = target.getAttribute('role')\n const elementType = target.tagName.toLowerCase()\n\n const isNativeInteractiveElement =\n role === 'link' ||\n elementType === 'a' ||\n elementType === 'button' ||\n elementType === 'input' ||\n elementType === 'select' ||\n elementType === 'textarea'\n\n if (onPress != null && !isNativeInteractiveElement) {\n onPress(event)\n }\n }\n }\n\n return {\n onStartShouldSetResponder: (event): boolean => {\n const { disabled } = this._config\n if (disabled && isButtonRole(event.currentTarget)) {\n event.stopPropagation()\n }\n if (disabled == null) {\n return true\n }\n return !disabled\n },\n\n onKeyDown: (event) => {\n const { disabled } = this._config\n const { key, target } = event\n if (!disabled && isValidKeyPress(event)) {\n if (this._touchState === NOT_RESPONDER) {\n start(event, false)\n // Listen to 'keyup' on document to account for situations where\n // focus is moved to another element during 'keydown'.\n document.addEventListener('keyup', keyupHandler)\n }\n const role = target.getAttribute('role')\n const isSpacebarKey = key === ' ' || key === 'Spacebar'\n const isButtonRole = role === 'button' || role === 'menuitem'\n if (isSpacebarKey && isButtonRole) {\n // Prevent spacebar scrolling the window\n event.preventDefault()\n }\n event.stopPropagation()\n }\n },\n\n onResponderGrant: (event) => start(event),\n\n onResponderMove: (event) => {\n if (this._config.onPressMove != null) {\n this._config.onPressMove(event)\n }\n const touch = getTouchFromResponderEvent(event)\n if (this._touchActivatePosition != null) {\n const deltaX = this._touchActivatePosition.pageX - touch.pageX\n const deltaY = this._touchActivatePosition.pageY - touch.pageY\n if (Math.hypot(deltaX, deltaY) > 10) {\n this._cancelLongPressDelayTimeout()\n }\n }\n },\n\n onResponderRelease: (event) => end(event),\n\n onResponderTerminate: (event) => {\n if (event.nativeEvent.type === 'selectionchange') {\n this._selectionTerminated = true\n }\n this._receiveSignal(RESPONDER_TERMINATED, event)\n },\n\n onResponderTerminationRequest: (event): boolean => {\n const { cancelable, disabled, onLongPress } = this._config\n // If `onLongPress` is provided, don't terminate on `contextmenu` as default\n // behavior will be prevented for non-mouse pointers.\n if (\n !disabled &&\n onLongPress != null &&\n this._isPointerTouch &&\n event.nativeEvent.type === 'contextmenu'\n ) {\n return false\n }\n if (cancelable == null) {\n return true\n }\n return cancelable\n },\n\n // NOTE: this diverges from react-native in 3 significant ways:\n // * The `onPress` callback is not connected to the responder system (the native\n // `click` event must be used but is dispatched in many scenarios where no pointers\n // are on the screen.) Therefore, it's possible for `onPress` to be called without\n // `onPress{Start,End}` being called first.\n // * The `onPress` callback is only be called on the first ancestor of the native\n // `click` target that is using the PressResponder.\n // * The event's `nativeEvent` is a `MouseEvent` not a `TouchEvent`.\n onClick: (event: any): void => {\n const { disabled, onPress } = this._config\n if (!disabled) {\n // If long press dispatched, cancel default click behavior.\n // If the responder terminated because text was selected during the gesture,\n // cancel the default click behavior.\n event.stopPropagation()\n if (this._longPressDispatched || this._selectionTerminated) {\n event.preventDefault()\n } else if (onPress != null && event.altKey === false) {\n onPress(event)\n }\n } else {\n if (isButtonRole(event.currentTarget)) {\n event.stopPropagation()\n }\n }\n },\n\n // If `onLongPress` is provided and a touch pointer is being used, prevent the\n // default context menu from opening.\n onContextMenu: (event: any): void => {\n const { disabled, onLongPress } = this._config\n if (!disabled) {\n if (onLongPress != null && this._isPointerTouch && !event.defaultPrevented) {\n event.preventDefault()\n event.stopPropagation()\n }\n } else {\n if (isButtonRole(event.currentTarget)) {\n event.stopPropagation()\n }\n }\n },\n }\n }\n\n /**\n * Receives a state machine signal, performs side effects of the transition\n * and stores the new state. Validates the transition as well.\n */\n _receiveSignal(signal: TouchSignal, event: ResponderEvent): void {\n const prevState = this._touchState\n let nextState: TouchState | null = null\n if (Transitions[prevState] != null) {\n nextState = Transitions[prevState][signal] as TouchState\n }\n if (this._touchState === NOT_RESPONDER && signal === RESPONDER_RELEASE) {\n return\n }\n if (nextState == null || nextState === ERROR) {\n // eslint-disable-next-line no-console\n console.error(`PressResponder: Invalid signal ${signal} for state ${prevState} on responder`)\n } else if (prevState !== nextState) {\n this._performTransitionSideEffects(prevState, nextState, signal, event)\n this._touchState = nextState\n }\n }\n\n /**\n * Performs a transition between touchable states and identify any activations\n * or deactivations (and callback invocations).\n */\n _performTransitionSideEffects(\n prevState: TouchState,\n nextState: TouchState,\n signal: TouchSignal,\n event: ResponderEvent\n ): void {\n if (isTerminalSignal(signal)) {\n // Pressable suppression of contextmenu on windows.\n // On Windows, the contextmenu is displayed after pointerup.\n // https://github.com/necolas/react-native-web/issues/2296\n setTimeout(() => {\n this._isPointerTouch = false\n }, 0)\n this._touchActivatePosition = null\n this._cancelLongPressDelayTimeout()\n }\n\n if (isPressStartSignal(prevState) && signal === LONG_PRESS_DETECTED) {\n const { onLongPress } = this._config\n // Long press is not supported for keyboards because 'click' can be dispatched\n // immediately (and multiple times) after 'keydown'.\n if (onLongPress != null && event.nativeEvent.key == null) {\n onLongPress(event)\n this._longPressDispatched = true\n }\n }\n\n const isPrevActive = isActiveSignal(prevState)\n const isNextActive = isActiveSignal(nextState)\n\n if (!isPrevActive && isNextActive) {\n this._activate(event)\n } else if (isPrevActive && !isNextActive) {\n this._deactivate(event)\n }\n\n if (isPressStartSignal(prevState) && signal === RESPONDER_RELEASE) {\n const { onLongPress, onPress } = this._config\n if (onPress != null) {\n const isPressCanceledByLongPress =\n onLongPress != null && prevState === RESPONDER_ACTIVE_LONG_PRESS_START\n if (!isPressCanceledByLongPress) {\n // If we never activated (due to delays), activate and deactivate now.\n if (!isNextActive && !isPrevActive) {\n this._activate(event)\n this._deactivate(event)\n }\n }\n }\n }\n\n this._cancelPressDelayTimeout()\n }\n\n _activate(event: ResponderEvent): void {\n const { onPressChange, onPressStart } = this._config\n const touch = getTouchFromResponderEvent(event)\n this._touchActivatePosition = {\n pageX: touch.pageX,\n pageY: touch.pageY,\n }\n if (onPressStart != null) {\n onPressStart(event)\n }\n if (onPressChange != null) {\n onPressChange(true)\n }\n }\n\n _deactivate(event: ResponderEvent): void {\n const { onPressChange, onPressEnd } = this._config\n function end() {\n if (onPressEnd != null) {\n onPressEnd(event)\n }\n if (onPressChange != null) {\n onPressChange(false)\n }\n }\n const delayPressEnd = normalizeDelay(this._config.delayPressEnd)\n if (delayPressEnd > 0) {\n this._pressOutDelayTimeout = setTimeout(() => {\n end()\n }, delayPressEnd)\n } else {\n end()\n }\n }\n\n _handleLongPress(event: ResponderEvent): void {\n if (\n this._touchState === RESPONDER_ACTIVE_PRESS_START ||\n this._touchState === RESPONDER_ACTIVE_LONG_PRESS_START\n ) {\n this._receiveSignal(LONG_PRESS_DETECTED, event)\n }\n }\n\n _cancelLongPressDelayTimeout(): void {\n if (this._longPressDelayTimeout != null) {\n clearTimeout(this._longPressDelayTimeout)\n this._longPressDelayTimeout = null\n }\n }\n\n _cancelPressDelayTimeout(): void {\n if (this._pressDelayTimeout != null) {\n clearTimeout(this._pressDelayTimeout)\n this._pressDelayTimeout = null\n }\n }\n\n _cancelPressOutDelayTimeout(): void {\n if (this._pressOutDelayTimeout != null) {\n clearTimeout(this._pressOutDelayTimeout)\n this._pressOutDelayTimeout = null\n }\n }\n}\n\nfunction normalizeDelay(delay: number | null | undefined, min = 0, fallback = 0): number {\n return Math.max(min, delay ?? fallback)\n}\n\nfunction getTouchFromResponderEvent(event: ResponderEvent) {\n const { changedTouches, touches } = event.nativeEvent\n if (touches != null && touches.length > 0) {\n return touches[0]\n }\n if (changedTouches != null && changedTouches.length > 0) {\n return changedTouches[0]\n }\n return event.nativeEvent\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["isButtonRole"]
7
+ }
@@ -3,30 +3,28 @@ import { useRef } from "react";
3
3
  const useSafeRef = (initialValue) => {
4
4
  const rawRef = useRef();
5
5
  const raw = rawRef.current ?? (rawRef.current = {
6
- isRendering: true,
7
- comittedValue: initialValue,
8
- currentValue: initialValue,
6
+ hold: true,
7
+ next: initialValue,
8
+ cur: initialValue,
9
9
  ref: {
10
10
  get current() {
11
- if (raw.isRendering) {
12
- return raw.currentValue;
13
- } else {
14
- return raw.comittedValue;
15
- }
11
+ return raw.hold ? raw.cur : raw.next;
16
12
  },
17
13
  set current(v) {
18
- if (!raw.isRendering) {
19
- raw.comittedValue = v;
14
+ if (!raw.hold) {
15
+ raw.next = v;
20
16
  }
21
- raw.currentValue = v;
17
+ raw.cur = v;
22
18
  }
23
19
  }
24
20
  });
25
- raw.isRendering = true;
26
- Promise.resolve().then(() => raw.isRendering = false);
27
- raw.currentValue = raw.comittedValue;
21
+ raw.hold = true;
22
+ Promise.resolve().then(() => {
23
+ raw.hold = false;
24
+ });
25
+ raw.cur = raw.next;
28
26
  useIsomorphicLayoutEffect(() => {
29
- raw.comittedValue = raw.currentValue;
27
+ raw.next = raw.cur;
30
28
  });
31
29
  return raw.ref;
32
30
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/hooks/useSafeRef.ts"],
4
- "sourcesContent": ["import { useIsomorphicLayoutEffect } from '@tamagui/constants'\nimport { useRef } from 'react'\n\n// dai-shi \uD83D\uDE4F\n// https://dev.to/uhyo_/a-concurrent-mode-safe-version-of-useref-1325\n\ntype Raw<T> = {\n isRendering: boolean\n comittedValue: T\n currentValue: T\n ref: { current: T }\n}\n\nexport const useSafeRef = <T>(initialValue: T) => {\n const rawRef = useRef<Raw<T>>()\n\n const raw: Raw<T> =\n rawRef.current ??\n (rawRef.current = {\n isRendering: true,\n comittedValue: initialValue,\n currentValue: initialValue,\n ref: {\n get current() {\n if (raw.isRendering) {\n return raw.currentValue\n } else {\n return raw.comittedValue\n }\n },\n set current(v) {\n if (!raw.isRendering) {\n raw.comittedValue = v\n }\n raw.currentValue = v\n },\n },\n })\n\n raw.isRendering = true\n Promise.resolve().then(() => (raw.isRendering = false))\n raw.currentValue = raw.comittedValue\n\n useIsomorphicLayoutEffect(() => {\n raw.comittedValue = raw.currentValue\n })\n\n return raw.ref\n}\n"],
5
- "mappings": "AAAA,SAAS,iCAAiC;AAC1C,SAAS,cAAc;AAYhB,MAAM,aAAa,CAAI,iBAAoB;AAChD,QAAM,SAAS,OAAe;AAE9B,QAAM,MACJ,OAAO,YACN,OAAO,UAAU;AAAA,IAChB,aAAa;AAAA,IACb,eAAe;AAAA,IACf,cAAc;AAAA,IACd,KAAK;AAAA,MACH,IAAI,UAAU;AACZ,YAAI,IAAI,aAAa;AACnB,iBAAO,IAAI;AAAA,QACb,OAAO;AACL,iBAAO,IAAI;AAAA,QACb;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,GAAG;AACb,YAAI,CAAC,IAAI,aAAa;AACpB,cAAI,gBAAgB;AAAA,QACtB;AACA,YAAI,eAAe;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEF,MAAI,cAAc;AAClB,UAAQ,QAAQ,EAAE,KAAK,MAAO,IAAI,cAAc,KAAM;AACtD,MAAI,eAAe,IAAI;AAEvB,4BAA0B,MAAM;AAC9B,QAAI,gBAAgB,IAAI;AAAA,EAC1B,CAAC;AAED,SAAO,IAAI;AACb;",
4
+ "sourcesContent": ["import { useIsomorphicLayoutEffect } from '@tamagui/constants'\nimport { useRef } from 'react'\n\n// dai-shi \uD83D\uDE4F\n// https://dev.to/uhyo_/a-concurrent-mode-safe-version-of-useref-1325\n// probably can live without it though to save a bit of b\n\ntype Raw<T> = {\n hold: boolean\n next: T\n cur: T\n ref: { current: T }\n}\n\nexport const useSafeRef = <T>(initialValue: T) => {\n const rawRef = useRef<Raw<T>>()\n\n const raw: Raw<T> =\n rawRef.current ??\n (rawRef.current = {\n hold: true,\n next: initialValue,\n cur: initialValue,\n ref: {\n get current() {\n return raw.hold ? raw.cur : raw.next\n },\n set current(v) {\n if (!raw.hold) {\n raw.next = v\n }\n raw.cur = v\n },\n },\n })\n\n raw.hold = true\n Promise.resolve().then(() => {\n raw.hold = false\n })\n raw.cur = raw.next\n\n useIsomorphicLayoutEffect(() => {\n raw.next = raw.cur\n })\n\n return raw.ref\n}\n"],
5
+ "mappings": "AAAA,SAAS,iCAAiC;AAC1C,SAAS,cAAc;AAahB,MAAM,aAAa,CAAI,iBAAoB;AAChD,QAAM,SAAS,OAAe;AAE9B,QAAM,MACJ,OAAO,YACN,OAAO,UAAU;AAAA,IAChB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,MACH,IAAI,UAAU;AACZ,eAAO,IAAI,OAAO,IAAI,MAAM,IAAI;AAAA,MAClC;AAAA,MACA,IAAI,QAAQ,GAAG;AACb,YAAI,CAAC,IAAI,MAAM;AACb,cAAI,OAAO;AAAA,QACb;AACA,YAAI,MAAM;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEF,MAAI,OAAO;AACX,UAAQ,QAAQ,EAAE,KAAK,MAAM;AAC3B,QAAI,OAAO;AAAA,EACb,CAAC;AACD,MAAI,MAAM,IAAI;AAEd,4BAA0B,MAAM;AAC9B,QAAI,OAAO,IAAI;AAAA,EACjB,CAAC;AAED,SAAO,IAAI;AACb;",
6
6
  "names": []
7
7
  }
@@ -12,7 +12,6 @@ import {
12
12
  emptyManager
13
13
  } from "../helpers/ThemeManager";
14
14
  import { GetThemeUnwrapped } from "./getThemeUnwrapped";
15
- import { useConstant } from "./useConstant";
16
15
  import { useServerRef } from "./useServerHooks";
17
16
  const useTheme = (themeName, componentName, props, forceUpdate) => {
18
17
  if (isRSC) {
@@ -141,7 +140,7 @@ const useChangeThemeEffect = (name, componentName, props, forceUpdateProp, uuid)
141
140
  if (process.env.NODE_ENV === "development") {
142
141
  if (!config) {
143
142
  throw new Error(
144
- `Missing tamagui config, you either have a duplicate config, or haven't set it up. Be sure createTamagui is called before renderig.`
143
+ `Missing tamagui config, you either have a duplicate config, or haven't set it up. Be sure createTamagui is called before rendering.`
145
144
  );
146
145
  }
147
146
  }
@@ -171,9 +170,9 @@ const useChangeThemeEffect = (name, componentName, props, forceUpdateProp, uuid)
171
170
  };
172
171
  const next = parentManager.getNextTheme(getThemeProps, debug);
173
172
  const forceUpdate = forceUpdateProp || useForceUpdate();
174
- const themeManager = useConstant(() => {
173
+ const themeManager = useMemo(() => {
175
174
  return new ThemeManager(next.name, next.className, next.theme, parentManager, reset);
176
- });
175
+ }, []);
177
176
  let didChange = false;
178
177
  if (process.env.TAMAGUI_TARGET === "native") {
179
178
  didChange = Boolean(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/hooks/useTheme.tsx"],
4
- "sourcesContent": ["import { isRSC, isServer, useIsomorphicLayoutEffect } from '@tamagui/constants'\nimport { useForceUpdate } from '@tamagui/use-force-update'\nimport React, { useContext, useLayoutEffect, useMemo, useRef, useState } from 'react'\n\nimport { getConfig } from '../config'\nimport { isDevTools } from '../constants/isDevTools'\nimport { ThemeContext } from '../contexts/ThemeContext'\nimport { areEqualSets } from '../helpers/areEqualSets'\nimport { createProxy } from '../helpers/createProxy'\nimport {\n GetNextThemeProps,\n ThemeManager,\n ThemeManagerContext,\n emptyManager,\n} from '../helpers/ThemeManager'\nimport { ThemeName, ThemeParsed } from '../types'\nimport { GetThemeUnwrapped } from './getThemeUnwrapped'\nimport { useConstant } from './useConstant'\nimport { useServerRef } from './useServerHooks'\n\nexport interface ThemeProps {\n className?: string\n disableThemeClass?: boolean\n name: Exclude<ThemeName, number> | null\n componentName?: string\n children?: any\n reset?: boolean\n debug?: boolean | 'verbose'\n}\n\ninterface UseThemeState {\n uuid: Object\n keys: Set<string>\n isRendering: boolean\n}\n\nexport const useTheme = (\n themeName?: string | null,\n componentName?: string,\n props?: ThemeProps,\n forceUpdate?: any\n): ThemeParsed => {\n // TODO this can use useChangeThemeEffect almost ready\n if (isRSC) {\n const config = getConfig()\n // @ts-ignore\n return getThemeProxied(config.themes[config.defaultTheme], config.defaultTheme)\n }\n\n const state = useServerRef() as React.MutableRefObject<UseThemeState>\n if (!state.current) {\n state.current = {\n uuid: {},\n keys: new Set(),\n isRendering: true,\n }\n }\n\n const { name, theme, themes, themeManager, className } = useChangeThemeEffect(\n themeName,\n componentName,\n props,\n forceUpdate,\n state.current.uuid\n )\n\n if (process.env.NODE_ENV === 'development') {\n if (props?.debug === 'verbose') {\n // eslint-disable-next-line no-console\n console.groupCollapsed(' \uD83D\uDD39 useTheme =>', name)\n const logs = { themeName, componentName, name, className, ...(isDevTools && { theme }) }\n for (const key in logs) {\n // eslint-disable-next-line no-console\n console.log(' ', key, logs[key])\n }\n // eslint-disable-next-line no-console\n console.groupEnd()\n }\n }\n\n // track usage\n state.current.isRendering = true\n useIsomorphicLayoutEffect(() => {\n const st = state.current\n st.isRendering = false\n const cur = themeManager?.keys.get(st.uuid)\n if (!cur || !areEqualSets(st.keys, cur)) {\n themeManager?.track(st.uuid, st.keys)\n }\n })\n\n const debugProp = props && props['debug']\n\n if (!theme) {\n if (process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.warn('No theme with name', themeName)\n }\n return themes[getConfig().defaultTheme || 'light']\n }\n\n return useMemo(() => {\n return getThemeProxied(theme, name, className, themeManager, state, debugProp)\n }, [theme, name, className, themeManager, state, debugProp])\n}\n\nfunction getThemeProxied(\n theme: any,\n name: string,\n className?: string,\n themeManager?: ThemeManager | null,\n state?: React.MutableRefObject<UseThemeState>,\n debugProp?: boolean | 'verbose'\n) {\n return createProxy(theme, {\n has(_, key) {\n if (typeof key === 'string' && key[0] === '$') {\n key = key.slice(1)\n }\n return Reflect.has(theme, key)\n },\n get(_, key) {\n if (key === GetThemeUnwrapped) {\n return theme\n }\n if (key === GetThemeManager) {\n return themeManager\n }\n if (key === 'name') {\n return name\n }\n if (key === 'className') {\n return className\n }\n if (!name || key === '__proto__' || typeof key === 'symbol' || key === '$typeof') {\n return Reflect.get(_, key)\n }\n // auto convert variables to plain\n if (key[0] === '$') {\n key = key.slice(1)\n }\n if (!themeManager) {\n return theme[key]\n }\n if (state) {\n if (state.current.isRendering && !state.current.keys.has(key)) {\n state.current.keys.add(key)\n if (process.env.NODE_ENV === 'development' && debugProp === 'verbose') {\n // eslint-disable-next-line no-console\n console.log(' \uD83D\uDD38 tracking theme', key)\n }\n }\n }\n return themeManager.getValue(key)\n },\n })\n}\n\nconst GetThemeManager = Symbol()\n\nexport const getThemeManager = (theme: any): ThemeManager | undefined => {\n if (!theme) return\n return theme[GetThemeManager]\n}\n\nexport const useThemeName = (opts?: { parent?: true }) => {\n if (isRSC) {\n const config = getConfig()\n return config.defaultTheme || 'light'\n }\n const parent = useContext(ThemeManagerContext)\n const [name, setName] = useState(parent?.name || '')\n\n useIsomorphicLayoutEffect(() => {\n if (!parent) return\n return parent.onChangeTheme((next, manager) => {\n const name = opts?.parent ? manager.parentName || next : next\n if (!name) return\n setName(name)\n })\n }, [parent])\n\n return name\n}\n\nexport const useDefaultThemeName = () => {\n return useContext(ThemeContext)?.defaultTheme\n}\n\nexport const activeThemeManagers = new Set<ThemeManager>()\n\nexport const useChangeThemeEffect = (\n name?: string | null,\n componentName?: string,\n props?: ThemeProps,\n forceUpdateProp?: any,\n uuid?: Object\n): {\n themes: Record<string, ThemeParsed>\n themeManager: ThemeManager | null\n name: string\n theme: ThemeParsed | null\n className?: string\n} => {\n const config = getConfig()\n\n if (process.env.NODE_ENV === 'development') {\n if (!config) {\n throw new Error(\n `Missing tamagui config, you either have a duplicate config, or haven't set it up. Be sure createTamagui is called before renderig.`\n )\n }\n }\n\n const { themes } = config\n\n if (isRSC) {\n // we need context working for this to work well\n const parentManager = new ThemeManager('light', 'light', themes.light)\n const next = parentManager.getNextTheme({\n name,\n componentName,\n themes,\n reset: props?.reset,\n })\n return {\n ...next,\n themes,\n themeManager: null,\n }\n }\n\n const debug = props && props['debug']\n const parentManager = useContext(ThemeManagerContext) || emptyManager\n const reset = props?.reset || false\n const getThemeProps: GetNextThemeProps = {\n name,\n componentName,\n themes,\n reset,\n }\n const next = parentManager.getNextTheme(getThemeProps, debug)\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const forceUpdate = forceUpdateProp || useForceUpdate()\n\n const themeManager = useConstant(() => {\n return new ThemeManager(next.name, next.className, next.theme, parentManager, reset)\n })\n\n // not concurrent safe but fixes native (but breaks SSR and not needed on web (i think) so leave only on native)\n let didChange = false\n if (process.env.TAMAGUI_TARGET === 'native') {\n didChange = Boolean(\n next?.name !== themeManager.name || next?.className !== themeManager.className\n )\n if (didChange) {\n themeManager.update(next, false, false)\n }\n }\n\n if (!isServer) {\n useLayoutEffect(() => {\n themeManager.update(next, didChange)\n activeThemeManagers.add(themeManager)\n\n const disposeParentOnChange = parentManager.onChangeTheme(() => {\n const next = parentManager.getNextTheme(getThemeProps, debug)\n if (!next) return\n if (themeManager.update(next)) {\n if (uuid && !themeManager.isTracking(uuid)) {\n // no need to re-render if not tracking any keys\n return\n }\n if (process.env.NODE_ENV === 'development' && debug) {\n // eslint-disable-next-line no-console\n console.log('Changed theme', componentName, next, { props })\n }\n forceUpdate()\n }\n })\n\n return () => {\n activeThemeManagers.delete(themeManager)\n disposeParentOnChange()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [didChange, themes, next?.name, next?.className, componentName, debug])\n }\n\n return {\n ...(parentManager && {\n name: parentManager.name,\n theme: parentManager.theme,\n }),\n ...next,\n className: next.className === parentManager.className ? undefined : next.className,\n themes,\n themeManager,\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { isRSC, isServer, useIsomorphicLayoutEffect } from '@tamagui/constants'\nimport { useForceUpdate } from '@tamagui/use-force-update'\nimport React, { useContext, useLayoutEffect, useMemo, useRef, useState } from 'react'\n\nimport { getConfig } from '../config'\nimport { isDevTools } from '../constants/isDevTools'\nimport { ThemeContext } from '../contexts/ThemeContext'\nimport { areEqualSets } from '../helpers/areEqualSets'\nimport { createProxy } from '../helpers/createProxy'\nimport {\n GetNextThemeProps,\n ThemeManager,\n ThemeManagerContext,\n emptyManager,\n} from '../helpers/ThemeManager'\nimport { ThemeName, ThemeParsed } from '../types'\nimport { GetThemeUnwrapped } from './getThemeUnwrapped'\nimport { useServerRef } from './useServerHooks'\n\nexport interface ThemeProps {\n className?: string\n disableThemeClass?: boolean\n name: Exclude<ThemeName, number> | null\n componentName?: string\n children?: any\n reset?: boolean\n debug?: boolean | 'verbose'\n}\n\ninterface UseThemeState {\n uuid: Object\n keys: Set<string>\n isRendering: boolean\n}\n\nexport const useTheme = (\n themeName?: string | null,\n componentName?: string,\n props?: ThemeProps,\n forceUpdate?: any\n): ThemeParsed => {\n // TODO this can use useChangeThemeEffect almost ready\n if (isRSC) {\n const config = getConfig()\n // @ts-ignore\n return getThemeProxied(config.themes[config.defaultTheme], config.defaultTheme)\n }\n\n const state = useServerRef() as React.MutableRefObject<UseThemeState>\n if (!state.current) {\n state.current = {\n uuid: {},\n keys: new Set(),\n isRendering: true,\n }\n }\n\n const { name, theme, themes, themeManager, className } = useChangeThemeEffect(\n themeName,\n componentName,\n props,\n forceUpdate,\n state.current.uuid\n )\n\n if (process.env.NODE_ENV === 'development') {\n if (props?.debug === 'verbose') {\n // eslint-disable-next-line no-console\n console.groupCollapsed(' \uD83D\uDD39 useTheme =>', name)\n const logs = { themeName, componentName, name, className, ...(isDevTools && { theme }) }\n for (const key in logs) {\n // eslint-disable-next-line no-console\n console.log(' ', key, logs[key])\n }\n // eslint-disable-next-line no-console\n console.groupEnd()\n }\n }\n\n // track usage\n state.current.isRendering = true\n useIsomorphicLayoutEffect(() => {\n const st = state.current\n st.isRendering = false\n const cur = themeManager?.keys.get(st.uuid)\n if (!cur || !areEqualSets(st.keys, cur)) {\n themeManager?.track(st.uuid, st.keys)\n }\n })\n\n const debugProp = props && props['debug']\n\n if (!theme) {\n if (process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.warn('No theme with name', themeName)\n }\n return themes[getConfig().defaultTheme || 'light']\n }\n\n return useMemo(() => {\n return getThemeProxied(theme, name, className, themeManager, state, debugProp)\n }, [theme, name, className, themeManager, state, debugProp])\n}\n\nfunction getThemeProxied(\n theme: any,\n name: string,\n className?: string,\n themeManager?: ThemeManager | null,\n state?: React.MutableRefObject<UseThemeState>,\n debugProp?: boolean | 'verbose'\n) {\n return createProxy(theme, {\n has(_, key) {\n if (typeof key === 'string' && key[0] === '$') {\n key = key.slice(1)\n }\n return Reflect.has(theme, key)\n },\n get(_, key) {\n if (key === GetThemeUnwrapped) {\n return theme\n }\n if (key === GetThemeManager) {\n return themeManager\n }\n if (key === 'name') {\n return name\n }\n if (key === 'className') {\n return className\n }\n if (!name || key === '__proto__' || typeof key === 'symbol' || key === '$typeof') {\n return Reflect.get(_, key)\n }\n // auto convert variables to plain\n if (key[0] === '$') {\n key = key.slice(1)\n }\n if (!themeManager) {\n return theme[key]\n }\n if (state) {\n if (state.current.isRendering && !state.current.keys.has(key)) {\n state.current.keys.add(key)\n if (process.env.NODE_ENV === 'development' && debugProp === 'verbose') {\n // eslint-disable-next-line no-console\n console.log(' \uD83D\uDD38 tracking theme', key)\n }\n }\n }\n return themeManager.getValue(key)\n },\n })\n}\n\nconst GetThemeManager = Symbol()\n\nexport const getThemeManager = (theme: any): ThemeManager | undefined => {\n if (!theme) return\n return theme[GetThemeManager]\n}\n\nexport const useThemeName = (opts?: { parent?: true }) => {\n if (isRSC) {\n const config = getConfig()\n return config.defaultTheme || 'light'\n }\n const parent = useContext(ThemeManagerContext)\n const [name, setName] = useState(parent?.name || '')\n\n useIsomorphicLayoutEffect(() => {\n if (!parent) return\n return parent.onChangeTheme((next, manager) => {\n const name = opts?.parent ? manager.parentName || next : next\n if (!name) return\n setName(name)\n })\n }, [parent])\n\n return name\n}\n\nexport const useDefaultThemeName = () => {\n return useContext(ThemeContext)?.defaultTheme\n}\n\nexport const activeThemeManagers = new Set<ThemeManager>()\n\nexport const useChangeThemeEffect = (\n name?: string | null,\n componentName?: string,\n props?: ThemeProps,\n forceUpdateProp?: any,\n uuid?: Object\n): {\n themes: Record<string, ThemeParsed>\n themeManager: ThemeManager | null\n name: string\n theme: ThemeParsed | null\n className?: string\n} => {\n const config = getConfig()\n\n if (process.env.NODE_ENV === 'development') {\n if (!config) {\n throw new Error(\n `Missing tamagui config, you either have a duplicate config, or haven't set it up. Be sure createTamagui is called before rendering.`\n )\n }\n }\n\n const { themes } = config\n\n if (isRSC) {\n // we need context working for this to work well\n const parentManager = new ThemeManager('light', 'light', themes.light)\n const next = parentManager.getNextTheme({\n name,\n componentName,\n themes,\n reset: props?.reset,\n })\n return {\n ...next,\n themes,\n themeManager: null,\n }\n }\n\n const debug = props && props['debug']\n const parentManager = useContext(ThemeManagerContext) || emptyManager\n const reset = props?.reset || false\n const getThemeProps: GetNextThemeProps = {\n name,\n componentName,\n themes,\n reset,\n }\n const next = parentManager.getNextTheme(getThemeProps, debug)\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const forceUpdate = forceUpdateProp || useForceUpdate()\n\n const themeManager = useMemo(() => {\n return new ThemeManager(next.name, next.className, next.theme, parentManager, reset)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // not concurrent safe but fixes native (but breaks SSR and not needed on web (i think) so leave only on native)\n let didChange = false\n if (process.env.TAMAGUI_TARGET === 'native') {\n didChange = Boolean(\n next?.name !== themeManager.name || next?.className !== themeManager.className\n )\n if (didChange) {\n themeManager.update(next, false, false)\n }\n }\n\n if (!isServer) {\n useLayoutEffect(() => {\n themeManager.update(next, didChange)\n activeThemeManagers.add(themeManager)\n\n const disposeParentOnChange = parentManager.onChangeTheme(() => {\n const next = parentManager.getNextTheme(getThemeProps, debug)\n if (!next) return\n if (themeManager.update(next)) {\n if (uuid && !themeManager.isTracking(uuid)) {\n // no need to re-render if not tracking any keys\n return\n }\n if (process.env.NODE_ENV === 'development' && debug) {\n // eslint-disable-next-line no-console\n console.log('Changed theme', componentName, next, { props })\n }\n forceUpdate()\n }\n })\n\n return () => {\n activeThemeManagers.delete(themeManager)\n disposeParentOnChange()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [didChange, themes, next?.name, next?.className, componentName, debug])\n }\n\n return {\n ...(parentManager && {\n name: parentManager.name,\n theme: parentManager.theme,\n }),\n ...next,\n className: next.className === parentManager.className ? undefined : next.className,\n themes,\n themeManager,\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["name", "parentManager", "next"]
7
7
  }
package/dist/esm/index.js CHANGED
@@ -14,10 +14,7 @@ export * from "./styled";
14
14
  export * from "./types";
15
15
  import { getHasConfigured, getConfig, getThemes, getTokens, onConfiguredOnce } from "./config";
16
16
  export * from "./constants/constants";
17
- import { createDOMProps } from "@tamagui/rnw";
18
- export * from "./helpers/calc";
19
17
  export * from "./helpers/useShallowSetState";
20
- export * from "./helpers/getStackSize";
21
18
  export * from "./helpers/getVariantExtras";
22
19
  export * from "./helpers/getAnimationDriver";
23
20
  export * from "./helpers/getExpandedShorthands";
@@ -27,18 +24,13 @@ export * from "./helpers/getStylesAtomic";
27
24
  export * from "./helpers/pseudoDescriptors";
28
25
  export * from "./helpers/mergeProps";
29
26
  export * from "./helpers/expandStyles";
30
- export * from "./helpers/getFont";
31
- export * from "./helpers/isObj";
32
27
  export * from "./helpers/isTamaguiElement";
33
28
  export * from "./helpers/isTamaguiComponent";
34
29
  export * from "./helpers/matchMedia";
35
- export * from "./helpers/startTransition";
36
30
  export * from "./helpers/themeable";
37
31
  export * from "./helpers/withStaticProperties";
38
32
  export * from "./contexts/ButtonInsideButtonContext";
39
- export * from "./hooks/useConstant";
40
33
  export * from "./hooks/useId";
41
- export * from "./hooks/useIsMounted";
42
34
  export * from "./hooks/useIsTouchDevice";
43
35
  import {
44
36
  configureMedia,
@@ -51,14 +43,12 @@ import {
51
43
  removeMediaQueryListener,
52
44
  mediaQueryConfig
53
45
  } from "./hooks/useMedia";
54
- export * from "./hooks/usePressable";
55
46
  export * from "./hooks/useTheme";
56
- export * from "./hooks/useUnmountEffect";
57
47
  export * from "./hooks/useSafeRef";
58
48
  export * from "./views/Slot";
59
49
  export * from "./views/Stack";
60
50
  export * from "./views/Text";
61
- import { TextAncestorProvider, TextAncestorContext } from "./contexts/TextAncestorContext";
51
+ export * from "./contexts/TextAncestorContext";
62
52
  export * from "./views/Theme";
63
53
  export * from "./views/ThemeInverse";
64
54
  export * from "./views/ThemeProvider";
@@ -72,11 +62,8 @@ export * from "@tamagui/compose-refs";
72
62
  export * from "@tamagui/helpers";
73
63
  export * from "@tamagui/constants";
74
64
  export {
75
- TextAncestorContext,
76
- TextAncestorProvider,
77
65
  addMediaQueryListener,
78
66
  configureMedia,
79
- createDOMProps,
80
67
  getConfig,
81
68
  getHasConfigured,
82
69
  getMedia,