@tamagui/core 1.0.1-beta.140 → 1.0.1-beta.143

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 (561) hide show
  1. package/dist/cjs/Tamagui.js +2 -2
  2. package/dist/cjs/Tamagui.js.map +2 -2
  3. package/dist/cjs/addTheme.js +28 -22
  4. package/dist/cjs/addTheme.js.map +2 -2
  5. package/dist/cjs/conf.js +0 -0
  6. package/dist/cjs/conf.js.map +0 -0
  7. package/dist/cjs/config.js +75 -0
  8. package/dist/cjs/config.js.map +7 -0
  9. package/dist/cjs/constants/constants.js +0 -0
  10. package/dist/cjs/constants/constants.js.map +0 -0
  11. package/dist/cjs/constants/platform.js +7 -1
  12. package/dist/cjs/constants/platform.js.map +2 -2
  13. package/dist/cjs/constants/platform.native.js +62 -0
  14. package/dist/cjs/constants/platform.native.js.map +7 -0
  15. package/dist/cjs/contexts/ButtonInsideButtonContext.js +0 -0
  16. package/dist/cjs/contexts/ButtonInsideButtonContext.js.map +0 -0
  17. package/dist/cjs/contexts/FontLanguageContext.js +0 -0
  18. package/dist/cjs/contexts/FontLanguageContext.js.map +0 -0
  19. package/dist/cjs/contexts/TextAncestorContext.js +0 -0
  20. package/dist/cjs/contexts/TextAncestorContext.js.map +0 -0
  21. package/dist/cjs/contexts/ThemeContext.js +0 -0
  22. package/dist/cjs/contexts/ThemeContext.js.map +0 -0
  23. package/dist/cjs/createComponent.js +77 -71
  24. package/dist/cjs/createComponent.js.map +2 -2
  25. package/dist/cjs/createComponent.server.js +431 -0
  26. package/dist/cjs/createComponent.server.js.map +7 -0
  27. package/dist/cjs/createFont.js +0 -0
  28. package/dist/cjs/createFont.js.map +0 -0
  29. package/dist/cjs/createShorthands.js +0 -0
  30. package/dist/cjs/createShorthands.js.map +0 -0
  31. package/dist/cjs/createTamagui.js +31 -32
  32. package/dist/cjs/createTamagui.js.map +2 -2
  33. package/dist/cjs/createTheme.js +0 -0
  34. package/dist/cjs/createTheme.js.map +0 -0
  35. package/dist/cjs/createTokens.js +0 -0
  36. package/dist/cjs/createTokens.js.map +0 -0
  37. package/dist/cjs/createVariable.js +21 -35
  38. package/dist/cjs/createVariable.js.map +2 -2
  39. package/dist/cjs/createVariables.js +5 -2
  40. package/dist/cjs/createVariables.js.map +2 -2
  41. package/dist/cjs/helpers/RNComponents.js +11 -11
  42. package/dist/cjs/helpers/RNComponents.js.map +2 -2
  43. package/dist/cjs/helpers/ThemeManager.js +7 -9
  44. package/dist/cjs/helpers/ThemeManager.js.map +2 -2
  45. package/dist/cjs/helpers/areEqualSets.js +0 -0
  46. package/dist/cjs/helpers/areEqualSets.js.map +0 -0
  47. package/dist/cjs/helpers/assignNativePropsToWeb.js +0 -1
  48. package/dist/cjs/helpers/assignNativePropsToWeb.js.map +2 -2
  49. package/dist/cjs/helpers/assignNativePropsToWeb.native.js +0 -0
  50. package/dist/cjs/helpers/assignNativePropsToWeb.native.js.map +0 -0
  51. package/dist/cjs/helpers/calc.js +0 -0
  52. package/dist/cjs/helpers/calc.js.map +0 -0
  53. package/dist/cjs/helpers/createMediaStyle.js +0 -0
  54. package/dist/cjs/helpers/createMediaStyle.js.map +0 -0
  55. package/dist/cjs/helpers/createPropMapper.js +3 -3
  56. package/dist/cjs/helpers/createPropMapper.js.map +2 -2
  57. package/dist/cjs/helpers/createShallowUpdate.js +0 -0
  58. package/dist/cjs/helpers/createShallowUpdate.js.map +0 -0
  59. package/dist/cjs/helpers/cssHash.js +0 -0
  60. package/dist/cjs/helpers/cssHash.js.map +0 -0
  61. package/dist/cjs/helpers/expandStyle.js +0 -0
  62. package/dist/cjs/helpers/expandStyle.js.map +0 -0
  63. package/dist/cjs/helpers/expandStyles.js +4 -4
  64. package/dist/cjs/helpers/expandStyles.js.map +2 -2
  65. package/dist/cjs/helpers/extendStaticConfig.js +0 -0
  66. package/dist/cjs/helpers/extendStaticConfig.js.map +0 -0
  67. package/dist/cjs/helpers/fixNativeShadow.js +0 -0
  68. package/dist/cjs/helpers/fixNativeShadow.js.map +0 -0
  69. package/dist/cjs/{Pressability.js → helpers/getAnimationDriver.js} +10 -10
  70. package/dist/cjs/helpers/getAnimationDriver.js.map +7 -0
  71. package/dist/cjs/helpers/getExpandedShorthands.js +3 -3
  72. package/dist/cjs/helpers/getExpandedShorthands.js.map +2 -2
  73. package/dist/cjs/helpers/getFont.js +1 -1
  74. package/dist/cjs/helpers/getFont.js.map +2 -2
  75. package/dist/cjs/helpers/getFontLanguage.js +0 -0
  76. package/dist/cjs/helpers/getFontLanguage.js.map +0 -0
  77. package/dist/cjs/helpers/getSize.js +2 -2
  78. package/dist/cjs/helpers/getSize.js.map +2 -2
  79. package/dist/cjs/helpers/getSplitStyles.js +12 -13
  80. package/dist/cjs/helpers/getSplitStyles.js.map +2 -2
  81. package/dist/cjs/helpers/getStackSize.js +0 -0
  82. package/dist/cjs/helpers/getStackSize.js.map +0 -0
  83. package/dist/cjs/helpers/getStylesAtomic.js +6 -4
  84. package/dist/cjs/helpers/getStylesAtomic.js.map +2 -2
  85. package/dist/cjs/helpers/getStylesAtomic.native.js +0 -0
  86. package/dist/cjs/helpers/getStylesAtomic.native.js.map +0 -0
  87. package/dist/cjs/helpers/getThemeCSSRules.js +0 -0
  88. package/dist/cjs/helpers/getThemeCSSRules.js.map +0 -0
  89. package/dist/cjs/helpers/getThemeCSSRules.native.js +0 -0
  90. package/dist/cjs/helpers/getThemeCSSRules.native.js.map +0 -0
  91. package/dist/cjs/helpers/getVariantExtras.js +2 -2
  92. package/dist/cjs/helpers/getVariantExtras.js.map +2 -2
  93. package/dist/cjs/helpers/insertStyleRule.js +0 -0
  94. package/dist/cjs/helpers/insertStyleRule.js.map +0 -0
  95. package/dist/cjs/helpers/isObj.js +0 -0
  96. package/dist/cjs/helpers/isObj.js.map +0 -0
  97. package/dist/cjs/helpers/isTamaguiComponent.js +0 -0
  98. package/dist/cjs/helpers/isTamaguiComponent.js.map +0 -0
  99. package/dist/cjs/helpers/isTamaguiElement.js +0 -0
  100. package/dist/cjs/helpers/isTamaguiElement.js.map +0 -0
  101. package/dist/cjs/helpers/matchMedia.js +0 -0
  102. package/dist/cjs/helpers/matchMedia.js.map +0 -0
  103. package/dist/cjs/helpers/matchMedia.native.js +0 -0
  104. package/dist/cjs/helpers/matchMedia.native.js.map +0 -0
  105. package/dist/cjs/helpers/mergeProps.js +0 -0
  106. package/dist/cjs/helpers/mergeProps.js.map +0 -0
  107. package/dist/cjs/helpers/mergeTransform.js +0 -0
  108. package/dist/cjs/helpers/mergeTransform.js.map +0 -0
  109. package/dist/cjs/helpers/normalizeColor.js +2 -2
  110. package/dist/cjs/helpers/normalizeColor.js.map +2 -2
  111. package/dist/cjs/helpers/normalizeValueWithProperty.js +0 -0
  112. package/dist/cjs/helpers/normalizeValueWithProperty.js.map +2 -2
  113. package/dist/cjs/helpers/proxyThemeVariables.js +0 -0
  114. package/dist/cjs/helpers/proxyThemeVariables.js.map +0 -0
  115. package/dist/cjs/helpers/pseudoDescriptors.js +0 -0
  116. package/dist/cjs/helpers/pseudoDescriptors.js.map +0 -0
  117. package/dist/cjs/helpers/registerCSSVariable.js +0 -0
  118. package/dist/cjs/helpers/registerCSSVariable.js.map +2 -2
  119. package/dist/cjs/helpers/startTransition.js +0 -0
  120. package/dist/cjs/helpers/startTransition.js.map +0 -0
  121. package/dist/cjs/helpers/themeable.js +0 -0
  122. package/dist/cjs/helpers/themeable.js.map +0 -0
  123. package/dist/cjs/helpers/themes.js +0 -0
  124. package/dist/cjs/helpers/themes.js.map +0 -0
  125. package/dist/cjs/helpers/useAnimationDriver.js +2 -0
  126. package/dist/cjs/{defaultComponentState.js.map → helpers/useAnimationDriver.js.map} +0 -0
  127. package/dist/cjs/helpers/validate.js +0 -0
  128. package/dist/cjs/helpers/validate.js.map +0 -0
  129. package/dist/cjs/helpers/withStaticProperties.js +0 -0
  130. package/dist/cjs/helpers/withStaticProperties.js.map +0 -0
  131. package/dist/cjs/hooks/getThemeUnwrapped.js +2 -0
  132. package/dist/cjs/hooks/getThemeUnwrapped.js.map +2 -2
  133. package/dist/cjs/hooks/useAnimationDriver.js +2 -0
  134. package/dist/{esm/defaultComponentState.js.map → cjs/hooks/useAnimationDriver.js.map} +0 -0
  135. package/dist/cjs/hooks/useConstant.js +3 -0
  136. package/dist/cjs/hooks/useConstant.js.map +2 -2
  137. package/dist/cjs/hooks/useFeatures.js +10 -2
  138. package/dist/cjs/hooks/useFeatures.js.map +2 -2
  139. package/dist/cjs/hooks/useId.js +0 -0
  140. package/dist/cjs/hooks/useId.js.map +0 -0
  141. package/dist/cjs/hooks/useIsMounted.js +0 -0
  142. package/dist/cjs/hooks/useIsMounted.js.map +0 -0
  143. package/dist/cjs/hooks/useIsSSR.js +2 -2
  144. package/dist/cjs/hooks/useIsSSR.js.map +2 -2
  145. package/dist/cjs/hooks/useIsTouchDevice.js +0 -0
  146. package/dist/cjs/hooks/useIsTouchDevice.js.map +0 -0
  147. package/dist/cjs/hooks/useMedia.js +0 -0
  148. package/dist/cjs/hooks/useMedia.js.map +0 -0
  149. package/dist/cjs/hooks/usePressable.js +0 -0
  150. package/dist/cjs/hooks/usePressable.js.map +0 -0
  151. package/dist/cjs/hooks/useSafeRef.js +0 -0
  152. package/dist/cjs/hooks/useSafeRef.js.map +0 -0
  153. package/dist/cjs/{helpers/nativeGestureHandler.native.js → hooks/useServerContext.js} +8 -6
  154. package/dist/cjs/hooks/useServerContext.js.map +7 -0
  155. package/dist/cjs/{ThemeContext.js → hooks/useServerHooks.js} +13 -7
  156. package/dist/cjs/hooks/useServerHooks.js.map +7 -0
  157. package/dist/cjs/hooks/useTheme.js +72 -44
  158. package/dist/cjs/hooks/useTheme.js.map +2 -2
  159. package/dist/cjs/hooks/useUnmountEffect.js +0 -0
  160. package/dist/cjs/hooks/useUnmountEffect.js.map +0 -0
  161. package/dist/cjs/index.js +8 -6
  162. package/dist/cjs/index.js.map +2 -2
  163. package/dist/cjs/{Pressability.native.js → injectStyles.js} +18 -10
  164. package/dist/cjs/injectStyles.js.map +7 -0
  165. package/dist/cjs/insertFont.js +2 -2
  166. package/dist/cjs/insertFont.js.map +2 -2
  167. package/dist/cjs/static.js +0 -0
  168. package/dist/cjs/static.js.map +0 -0
  169. package/dist/cjs/styled.js +11 -1
  170. package/dist/cjs/styled.js.map +2 -2
  171. package/dist/cjs/types-rnw.js +0 -0
  172. package/dist/cjs/types-rnw.js.map +0 -0
  173. package/dist/cjs/types.js +0 -0
  174. package/dist/cjs/types.js.map +1 -1
  175. package/dist/cjs/updateTheme.js +0 -0
  176. package/dist/cjs/updateTheme.js.map +0 -0
  177. package/dist/cjs/vendor/Pressability.js +0 -0
  178. package/dist/cjs/vendor/Pressability.js.map +0 -0
  179. package/dist/cjs/vendor/Pressability.native.js +0 -0
  180. package/dist/cjs/vendor/Pressability.native.js.map +0 -0
  181. package/dist/cjs/views/FontLanguage.js +0 -0
  182. package/dist/cjs/views/FontLanguage.js.map +0 -0
  183. package/dist/cjs/views/FontLanguage.native.js +0 -0
  184. package/dist/cjs/views/FontLanguage.native.js.map +0 -0
  185. package/dist/cjs/views/FontLanguage.types.js +0 -0
  186. package/dist/cjs/views/FontLanguage.types.js.map +0 -0
  187. package/dist/cjs/views/Slot.js +0 -0
  188. package/dist/cjs/views/Slot.js.map +0 -0
  189. package/dist/cjs/views/Stack.js +0 -0
  190. package/dist/cjs/views/Stack.js.map +0 -0
  191. package/dist/cjs/{helpers/createTamaguiProvider.js → views/TamaguiProvider.js} +41 -37
  192. package/dist/cjs/views/TamaguiProvider.js.map +7 -0
  193. package/dist/cjs/views/Text.js +0 -0
  194. package/dist/cjs/views/Text.js.map +0 -0
  195. package/dist/cjs/views/Theme.js +4 -3
  196. package/dist/cjs/views/Theme.js.map +2 -2
  197. package/dist/cjs/views/ThemeInverse.js +0 -0
  198. package/dist/cjs/views/ThemeInverse.js.map +0 -0
  199. package/dist/cjs/views/ThemeProvider.js +10 -6
  200. package/dist/cjs/views/ThemeProvider.js.map +2 -2
  201. package/dist/cjs/views/ThemeReset.js +0 -0
  202. package/dist/cjs/views/ThemeReset.js.map +0 -0
  203. package/dist/esm/Tamagui.js +1 -1
  204. package/dist/esm/Tamagui.js.map +1 -1
  205. package/dist/esm/addTheme.js +27 -21
  206. package/dist/esm/addTheme.js.map +2 -2
  207. package/dist/esm/conf.js +0 -0
  208. package/dist/esm/conf.js.map +0 -0
  209. package/dist/esm/config.js +43 -0
  210. package/dist/esm/config.js.map +7 -0
  211. package/dist/esm/constants/constants.js +0 -0
  212. package/dist/esm/constants/constants.js.map +0 -0
  213. package/dist/esm/constants/platform.js +5 -1
  214. package/dist/esm/constants/platform.js.map +2 -2
  215. package/dist/esm/constants/platform.native.js +28 -0
  216. package/dist/esm/constants/platform.native.js.map +7 -0
  217. package/dist/esm/contexts/ButtonInsideButtonContext.js +0 -0
  218. package/dist/esm/contexts/ButtonInsideButtonContext.js.map +0 -0
  219. package/dist/esm/contexts/FontLanguageContext.js +0 -0
  220. package/dist/esm/contexts/FontLanguageContext.js.map +0 -0
  221. package/dist/esm/contexts/TextAncestorContext.js +0 -0
  222. package/dist/esm/contexts/TextAncestorContext.js.map +0 -0
  223. package/dist/esm/contexts/ThemeContext.js +0 -0
  224. package/dist/esm/contexts/ThemeContext.js.map +0 -0
  225. package/dist/esm/createComponent.js +77 -73
  226. package/dist/esm/createComponent.js.map +2 -2
  227. package/dist/esm/createComponent.server.js +408 -0
  228. package/dist/esm/createComponent.server.js.map +7 -0
  229. package/dist/esm/createFont.js +0 -0
  230. package/dist/esm/createFont.js.map +0 -0
  231. package/dist/esm/createShorthands.js +0 -0
  232. package/dist/esm/createShorthands.js.map +0 -0
  233. package/dist/esm/createTamagui.js +30 -31
  234. package/dist/esm/createTamagui.js.map +2 -2
  235. package/dist/esm/createTheme.js +0 -0
  236. package/dist/esm/createTheme.js.map +0 -0
  237. package/dist/esm/createTokens.js +0 -0
  238. package/dist/esm/createTokens.js.map +0 -0
  239. package/dist/esm/createVariable.js +19 -33
  240. package/dist/esm/createVariable.js.map +2 -2
  241. package/dist/esm/createVariables.js +5 -2
  242. package/dist/esm/createVariables.js.map +2 -2
  243. package/dist/esm/helpers/RNComponents.js +11 -8
  244. package/dist/esm/helpers/RNComponents.js.map +2 -2
  245. package/dist/esm/helpers/ThemeManager.js +6 -8
  246. package/dist/esm/helpers/ThemeManager.js.map +2 -2
  247. package/dist/esm/helpers/areEqualSets.js +0 -0
  248. package/dist/esm/helpers/areEqualSets.js.map +0 -0
  249. package/dist/esm/helpers/assignNativePropsToWeb.js +0 -1
  250. package/dist/esm/helpers/assignNativePropsToWeb.js.map +2 -2
  251. package/dist/esm/helpers/assignNativePropsToWeb.native.js +0 -0
  252. package/dist/esm/helpers/assignNativePropsToWeb.native.js.map +0 -0
  253. package/dist/esm/helpers/calc.js +0 -0
  254. package/dist/esm/helpers/calc.js.map +0 -0
  255. package/dist/esm/helpers/createMediaStyle.js +0 -0
  256. package/dist/esm/helpers/createMediaStyle.js.map +0 -0
  257. package/dist/esm/helpers/createPropMapper.js +2 -2
  258. package/dist/esm/helpers/createPropMapper.js.map +2 -2
  259. package/dist/esm/helpers/createShallowUpdate.js +0 -0
  260. package/dist/esm/helpers/createShallowUpdate.js.map +0 -0
  261. package/dist/esm/helpers/cssHash.js +0 -0
  262. package/dist/esm/helpers/cssHash.js.map +0 -0
  263. package/dist/esm/helpers/expandStyle.js +0 -0
  264. package/dist/esm/helpers/expandStyle.js.map +0 -0
  265. package/dist/esm/helpers/expandStyles.js +3 -3
  266. package/dist/esm/helpers/expandStyles.js.map +2 -2
  267. package/dist/esm/helpers/extendStaticConfig.js +0 -0
  268. package/dist/esm/helpers/extendStaticConfig.js.map +0 -0
  269. package/dist/esm/helpers/fixNativeShadow.js +0 -0
  270. package/dist/esm/helpers/fixNativeShadow.js.map +0 -0
  271. package/dist/esm/helpers/getAnimationDriver.js +8 -0
  272. package/dist/esm/helpers/getAnimationDriver.js.map +7 -0
  273. package/dist/esm/helpers/getExpandedShorthands.js +2 -2
  274. package/dist/esm/helpers/getExpandedShorthands.js.map +2 -2
  275. package/dist/esm/helpers/getFont.js +1 -1
  276. package/dist/esm/helpers/getFont.js.map +2 -2
  277. package/dist/esm/helpers/getFontLanguage.js +0 -0
  278. package/dist/esm/helpers/getFontLanguage.js.map +0 -0
  279. package/dist/esm/helpers/getSize.js +1 -1
  280. package/dist/esm/helpers/getSize.js.map +1 -1
  281. package/dist/esm/helpers/getSplitStyles.js +12 -13
  282. package/dist/esm/helpers/getSplitStyles.js.map +2 -2
  283. package/dist/esm/helpers/getStackSize.js +0 -0
  284. package/dist/esm/helpers/getStackSize.js.map +0 -0
  285. package/dist/esm/helpers/getStylesAtomic.js +5 -3
  286. package/dist/esm/helpers/getStylesAtomic.js.map +2 -2
  287. package/dist/esm/helpers/getStylesAtomic.native.js +0 -0
  288. package/dist/esm/helpers/getStylesAtomic.native.js.map +0 -0
  289. package/dist/esm/helpers/getThemeCSSRules.js +0 -0
  290. package/dist/esm/helpers/getThemeCSSRules.js.map +0 -0
  291. package/dist/esm/helpers/getThemeCSSRules.native.js +0 -0
  292. package/dist/esm/helpers/getThemeCSSRules.native.js.map +0 -0
  293. package/dist/esm/helpers/getVariantExtras.js +1 -1
  294. package/dist/esm/helpers/getVariantExtras.js.map +1 -1
  295. package/dist/esm/helpers/insertStyleRule.js +0 -0
  296. package/dist/esm/helpers/insertStyleRule.js.map +0 -0
  297. package/dist/esm/helpers/isObj.js +0 -0
  298. package/dist/esm/helpers/isObj.js.map +0 -0
  299. package/dist/esm/helpers/isTamaguiComponent.js +0 -0
  300. package/dist/esm/helpers/isTamaguiComponent.js.map +0 -0
  301. package/dist/esm/helpers/isTamaguiElement.js +0 -0
  302. package/dist/esm/helpers/isTamaguiElement.js.map +0 -0
  303. package/dist/esm/helpers/matchMedia.js +0 -0
  304. package/dist/esm/helpers/matchMedia.js.map +0 -0
  305. package/dist/esm/helpers/matchMedia.native.js +0 -0
  306. package/dist/esm/helpers/matchMedia.native.js.map +0 -0
  307. package/dist/esm/helpers/mergeProps.js +0 -0
  308. package/dist/esm/helpers/mergeProps.js.map +0 -0
  309. package/dist/esm/helpers/mergeTransform.js +0 -0
  310. package/dist/esm/helpers/mergeTransform.js.map +0 -0
  311. package/dist/esm/helpers/normalizeColor.js +1 -1
  312. package/dist/esm/helpers/normalizeColor.js.map +1 -1
  313. package/dist/esm/helpers/normalizeValueWithProperty.js +0 -0
  314. package/dist/esm/helpers/normalizeValueWithProperty.js.map +2 -2
  315. package/dist/esm/helpers/proxyThemeVariables.js +0 -0
  316. package/dist/esm/helpers/proxyThemeVariables.js.map +0 -0
  317. package/dist/esm/helpers/pseudoDescriptors.js +0 -0
  318. package/dist/esm/helpers/pseudoDescriptors.js.map +0 -0
  319. package/dist/esm/helpers/registerCSSVariable.js +0 -0
  320. package/dist/esm/helpers/registerCSSVariable.js.map +2 -2
  321. package/dist/esm/helpers/startTransition.js +0 -0
  322. package/dist/esm/helpers/startTransition.js.map +0 -0
  323. package/dist/esm/helpers/themeable.js +0 -0
  324. package/dist/esm/helpers/themeable.js.map +0 -0
  325. package/dist/esm/helpers/themes.js +0 -0
  326. package/dist/esm/helpers/themes.js.map +0 -0
  327. package/dist/esm/helpers/useAnimationDriver.js +1 -0
  328. package/dist/esm/helpers/useAnimationDriver.js.map +7 -0
  329. package/dist/esm/helpers/validate.js +0 -0
  330. package/dist/esm/helpers/validate.js.map +0 -0
  331. package/dist/esm/helpers/withStaticProperties.js +0 -0
  332. package/dist/esm/helpers/withStaticProperties.js.map +0 -0
  333. package/dist/esm/hooks/getThemeUnwrapped.js +2 -0
  334. package/dist/esm/hooks/getThemeUnwrapped.js.map +2 -2
  335. package/dist/esm/hooks/useAnimationDriver.js +1 -0
  336. package/dist/esm/hooks/useAnimationDriver.js.map +7 -0
  337. package/dist/esm/hooks/useConstant.js +4 -1
  338. package/dist/esm/hooks/useConstant.js.map +2 -2
  339. package/dist/esm/hooks/useFeatures.js +9 -1
  340. package/dist/esm/hooks/useFeatures.js.map +2 -2
  341. package/dist/esm/hooks/useId.js +0 -0
  342. package/dist/esm/hooks/useId.js.map +0 -0
  343. package/dist/esm/hooks/useIsMounted.js +0 -0
  344. package/dist/esm/hooks/useIsMounted.js.map +0 -0
  345. package/dist/esm/hooks/useIsSSR.js +4 -4
  346. package/dist/esm/hooks/useIsSSR.js.map +2 -2
  347. package/dist/esm/hooks/useIsTouchDevice.js +0 -0
  348. package/dist/esm/hooks/useIsTouchDevice.js.map +0 -0
  349. package/dist/esm/hooks/useMedia.js +0 -0
  350. package/dist/esm/hooks/useMedia.js.map +0 -0
  351. package/dist/esm/hooks/usePressable.js +0 -0
  352. package/dist/esm/hooks/usePressable.js.map +0 -0
  353. package/dist/esm/hooks/useSafeRef.js +0 -0
  354. package/dist/esm/hooks/useSafeRef.js.map +0 -0
  355. package/dist/esm/hooks/useServerContext.js +4 -0
  356. package/dist/esm/hooks/useServerContext.js.map +7 -0
  357. package/dist/esm/hooks/useServerHooks.js +11 -0
  358. package/dist/esm/hooks/useServerHooks.js.map +7 -0
  359. package/dist/esm/hooks/useTheme.js +73 -45
  360. package/dist/esm/hooks/useTheme.js.map +2 -2
  361. package/dist/esm/hooks/useUnmountEffect.js +0 -0
  362. package/dist/esm/hooks/useUnmountEffect.js.map +0 -0
  363. package/dist/esm/index.js +3 -1
  364. package/dist/esm/index.js.map +2 -2
  365. package/dist/esm/injectStyles.js +16 -0
  366. package/dist/esm/injectStyles.js.map +7 -0
  367. package/dist/esm/insertFont.js +1 -1
  368. package/dist/esm/insertFont.js.map +1 -1
  369. package/dist/esm/static.js +0 -0
  370. package/dist/esm/static.js.map +0 -0
  371. package/dist/esm/styled.js +11 -1
  372. package/dist/esm/styled.js.map +2 -2
  373. package/dist/esm/types-rnw.js +0 -0
  374. package/dist/esm/types-rnw.js.map +0 -0
  375. package/dist/esm/types.js +0 -0
  376. package/dist/esm/types.js.map +0 -0
  377. package/dist/esm/updateTheme.js +0 -0
  378. package/dist/esm/updateTheme.js.map +0 -0
  379. package/dist/esm/vendor/Pressability.js +0 -0
  380. package/dist/esm/vendor/Pressability.js.map +0 -0
  381. package/dist/esm/vendor/Pressability.native.js +0 -0
  382. package/dist/esm/vendor/Pressability.native.js.map +0 -0
  383. package/dist/esm/views/FontLanguage.js +0 -0
  384. package/dist/esm/views/FontLanguage.js.map +0 -0
  385. package/dist/esm/views/FontLanguage.native.js +0 -0
  386. package/dist/esm/views/FontLanguage.native.js.map +0 -0
  387. package/dist/esm/views/FontLanguage.types.js +0 -0
  388. package/dist/esm/views/FontLanguage.types.js.map +0 -0
  389. package/dist/esm/views/Slot.js +0 -0
  390. package/dist/esm/views/Slot.js.map +0 -0
  391. package/dist/esm/views/Stack.js +0 -0
  392. package/dist/esm/views/Stack.js.map +0 -0
  393. package/dist/esm/views/TamaguiProvider.js +46 -0
  394. package/dist/esm/views/TamaguiProvider.js.map +7 -0
  395. package/dist/esm/views/Text.js +0 -0
  396. package/dist/esm/views/Text.js.map +0 -0
  397. package/dist/esm/views/Theme.js +4 -3
  398. package/dist/esm/views/Theme.js.map +2 -2
  399. package/dist/esm/views/ThemeInverse.js +0 -0
  400. package/dist/esm/views/ThemeInverse.js.map +0 -0
  401. package/dist/esm/views/ThemeProvider.js +10 -6
  402. package/dist/esm/views/ThemeProvider.js.map +2 -2
  403. package/dist/esm/views/ThemeReset.js +0 -0
  404. package/dist/esm/views/ThemeReset.js.map +0 -0
  405. package/package.json +36 -14
  406. package/src/Tamagui.ts +44 -0
  407. package/src/addTheme.ts +66 -0
  408. package/src/config.ts +38 -0
  409. package/src/constants/constants.ts +15 -0
  410. package/src/constants/platform.native.ts +14 -0
  411. package/src/constants/platform.ts +24 -0
  412. package/src/contexts/ButtonInsideButtonContext.tsx +3 -0
  413. package/src/contexts/FontLanguageContext.tsx +5 -0
  414. package/src/contexts/TextAncestorContext.tsx +10 -0
  415. package/src/contexts/ThemeContext.tsx +5 -0
  416. package/src/createComponent.tsx +1338 -0
  417. package/src/createFont.ts +26 -0
  418. package/src/createShorthands.ts +5 -0
  419. package/src/createTamagui.ts +232 -0
  420. package/src/createTheme.ts +13 -0
  421. package/src/createTokens.ts +35 -0
  422. package/src/createVariable.ts +77 -0
  423. package/src/createVariables.ts +42 -0
  424. package/src/helpers/RNComponents.tsx +14 -0
  425. package/src/helpers/ThemeManager.tsx +229 -0
  426. package/src/helpers/areEqualSets.tsx +9 -0
  427. package/src/helpers/assignNativePropsToWeb.native.tsx +1 -0
  428. package/src/helpers/assignNativePropsToWeb.tsx +178 -0
  429. package/src/helpers/calc.ts +65 -0
  430. package/src/helpers/createMediaStyle.ts +48 -0
  431. package/src/helpers/createPropMapper.ts +457 -0
  432. package/src/helpers/createShallowUpdate.tsx +20 -0
  433. package/src/helpers/cssHash.ts +28 -0
  434. package/src/helpers/expandStyle.ts +81 -0
  435. package/src/helpers/expandStyles.ts +105 -0
  436. package/src/helpers/extendStaticConfig.ts +76 -0
  437. package/src/helpers/fixNativeShadow.tsx +2 -0
  438. package/src/helpers/getAnimationDriver.tsx +5 -0
  439. package/src/helpers/getExpandedShorthands.ts +15 -0
  440. package/src/helpers/getFont.tsx +40 -0
  441. package/src/helpers/getFontLanguage.ts +2 -0
  442. package/src/helpers/getSize.ts +22 -0
  443. package/src/helpers/getSplitStyles.tsx +685 -0
  444. package/src/helpers/getStackSize.ts +22 -0
  445. package/src/helpers/getStylesAtomic.native.ts +3 -0
  446. package/src/helpers/getStylesAtomic.ts +292 -0
  447. package/src/helpers/getThemeCSSRules.native.ts +3 -0
  448. package/src/helpers/getThemeCSSRules.ts +105 -0
  449. package/src/helpers/getVariantExtras.tsx +83 -0
  450. package/src/helpers/insertStyleRule.tsx +150 -0
  451. package/src/helpers/isObj.ts +1 -0
  452. package/src/helpers/isTamaguiComponent.tsx +15 -0
  453. package/src/helpers/isTamaguiElement.tsx +14 -0
  454. package/src/helpers/matchMedia.native.ts +6 -0
  455. package/src/helpers/matchMedia.ts +16 -0
  456. package/src/helpers/mergeProps.ts +56 -0
  457. package/src/helpers/mergeTransform.ts +14 -0
  458. package/src/helpers/normalizeColor.ts +53 -0
  459. package/src/helpers/normalizeValueWithProperty.ts +78 -0
  460. package/src/helpers/proxyThemeVariables.tsx +13 -0
  461. package/src/helpers/pseudoDescriptors.ts +18 -0
  462. package/src/helpers/registerCSSVariable.ts +11 -0
  463. package/src/helpers/startTransition.ts +4 -0
  464. package/src/helpers/themeable.tsx +45 -0
  465. package/src/helpers/themes.ts +69 -0
  466. package/src/helpers/validate.ts +80 -0
  467. package/src/helpers/withStaticProperties.tsx +7 -0
  468. package/src/hooks/getThemeUnwrapped.tsx +8 -0
  469. package/src/hooks/useConstant.tsx +19 -0
  470. package/src/hooks/useFeatures.tsx +289 -0
  471. package/src/hooks/useId.tsx +1 -0
  472. package/src/hooks/useIsMounted.ts +17 -0
  473. package/src/hooks/useIsSSR.tsx +20 -0
  474. package/src/hooks/useIsTouchDevice.tsx +21 -0
  475. package/src/hooks/useMedia.tsx +167 -0
  476. package/src/hooks/usePressable.tsx +9 -0
  477. package/src/hooks/useSafeRef.ts +50 -0
  478. package/src/hooks/useServerHooks.tsx +13 -0
  479. package/src/hooks/useTheme.tsx +264 -0
  480. package/src/hooks/useUnmountEffect.ts +5 -0
  481. package/src/index.ts +80 -0
  482. package/src/injectStyles.ts +20 -0
  483. package/src/insertFont.ts +69 -0
  484. package/src/static.ts +15 -0
  485. package/src/styled.tsx +149 -0
  486. package/src/types-rnw.tsx +162 -0
  487. package/src/types.tsx +1267 -0
  488. package/src/updateTheme.ts +23 -0
  489. package/src/vendor/Pressability.native.tsx +3 -0
  490. package/src/vendor/Pressability.tsx +2 -0
  491. package/src/views/FontLanguage.native.tsx +9 -0
  492. package/src/views/FontLanguage.tsx +18 -0
  493. package/src/views/FontLanguage.types.ts +13 -0
  494. package/src/views/Slot.tsx +152 -0
  495. package/src/views/Stack.tsx +24 -0
  496. package/src/views/TamaguiProvider.tsx +57 -0
  497. package/src/views/Text.tsx +79 -0
  498. package/src/views/Theme.tsx +72 -0
  499. package/src/views/ThemeInverse.tsx +33 -0
  500. package/src/views/ThemeProvider.tsx +62 -0
  501. package/src/views/ThemeReset.tsx +43 -0
  502. package/types/conf.d.ts +1 -1
  503. package/types/config.d.ts +27 -0
  504. package/types/constants/platform.d.ts +3 -2
  505. package/types/constants/platform.native.d.ts +13 -0
  506. package/types/createComponent.server.d.ts +36 -0
  507. package/types/createTamagui.d.ts +1 -1
  508. package/types/createTheme.d.ts +1 -1
  509. package/types/createVariable.d.ts +15 -12
  510. package/types/helpers/RNComponents.d.ts +1 -1
  511. package/types/helpers/ThemeManager.d.ts +2 -8
  512. package/types/helpers/getAnimationDriver.d.ts +6 -0
  513. package/types/helpers/registerCSSVariable.d.ts +2 -2
  514. package/types/helpers/useAnimationDriver.d.ts +1 -0
  515. package/types/hooks/useAnimationDriver.d.ts +1 -0
  516. package/types/hooks/useServerContext.d.ts +2 -0
  517. package/types/hooks/useServerHooks.d.ts +4 -0
  518. package/types/hooks/useTheme.d.ts +5 -21
  519. package/types/index.d.ts +3 -1
  520. package/types/injectStyles.d.ts +7 -0
  521. package/types/types.d.ts +24 -1
  522. package/types/views/TamaguiProvider.d.ts +4 -0
  523. package/types/views/ThemeProvider.d.ts +0 -1
  524. package/dist/cjs/Pressability.js.map +0 -7
  525. package/dist/cjs/Pressability.native.js.map +0 -7
  526. package/dist/cjs/ThemeContext.js.map +0 -7
  527. package/dist/cjs/ThemeManager.js +0 -211
  528. package/dist/cjs/ThemeManager.js.map +0 -7
  529. package/dist/cjs/defaultComponentState.js +0 -2
  530. package/dist/cjs/ensureThemeVariable.js +0 -152
  531. package/dist/cjs/ensureThemeVariable.js.map +0 -7
  532. package/dist/cjs/helpers/createTamaguiProvider.js.map +0 -7
  533. package/dist/cjs/helpers/ensureThemeVariable.js +0 -152
  534. package/dist/cjs/helpers/ensureThemeVariable.js.map +0 -7
  535. package/dist/cjs/helpers/nativeGestureHandler.native.js.map +0 -7
  536. package/dist/cjs/loadTheme.js +0 -64
  537. package/dist/cjs/loadTheme.js.map +0 -7
  538. package/dist/cjs/views/TextAncestorContext.js +0 -44
  539. package/dist/cjs/views/TextAncestorContext.js.map +0 -7
  540. package/dist/esm/Pressability.js +0 -7
  541. package/dist/esm/Pressability.js.map +0 -7
  542. package/dist/esm/Pressability.native.js +0 -7
  543. package/dist/esm/Pressability.native.js.map +0 -7
  544. package/dist/esm/ThemeContext.js +0 -6
  545. package/dist/esm/ThemeContext.js.map +0 -7
  546. package/dist/esm/ThemeManager.js +0 -185
  547. package/dist/esm/ThemeManager.js.map +0 -7
  548. package/dist/esm/defaultComponentState.js +0 -1
  549. package/dist/esm/ensureThemeVariable.js +0 -125
  550. package/dist/esm/ensureThemeVariable.js.map +0 -7
  551. package/dist/esm/helpers/createTamaguiProvider.js +0 -42
  552. package/dist/esm/helpers/createTamaguiProvider.js.map +0 -7
  553. package/dist/esm/helpers/ensureThemeVariable.js +0 -125
  554. package/dist/esm/helpers/ensureThemeVariable.js.map +0 -7
  555. package/dist/esm/helpers/nativeGestureHandler.native.js +0 -2
  556. package/dist/esm/helpers/nativeGestureHandler.native.js.map +0 -7
  557. package/dist/esm/loadTheme.js +0 -40
  558. package/dist/esm/loadTheme.js.map +0 -7
  559. package/dist/esm/views/TextAncestorContext.js +0 -15
  560. package/dist/esm/views/TextAncestorContext.js.map +0 -7
  561. package/types/helpers/createTamaguiProvider.d.ts +0 -3
@@ -0,0 +1,1338 @@
1
+ /* eslint-disable react-hooks/rules-of-hooks */
2
+ import {
3
+ composeEventHandlers,
4
+ stylePropsView,
5
+ validPseudoKeys,
6
+ validStyles,
7
+ } from '@tamagui/helpers'
8
+ import {
9
+ useElementLayout,
10
+ useMergeRefs,
11
+ usePlatformMethods,
12
+ useResponderEvents,
13
+ } from '@tamagui/rnw'
14
+ import { useForceUpdate } from '@tamagui/use-force-update'
15
+ import React, {
16
+ Children,
17
+ Fragment,
18
+ createElement,
19
+ forwardRef,
20
+ memo,
21
+ useCallback,
22
+ useContext,
23
+ } from 'react'
24
+ import { StyleSheet, Text, View, ViewStyle } from 'react-native'
25
+
26
+ import { getConfig, onConfiguredOnce } from './config'
27
+ import { stackDefaultStyles } from './constants/constants'
28
+ import { isClient, isRSC, isWeb, useIsomorphicLayoutEffect } from './constants/platform'
29
+ import { FontLanguageContext } from './contexts/FontLanguageContext'
30
+ import { TextAncestorContext } from './contexts/TextAncestorContext'
31
+ import { assignNativePropsToWeb } from './helpers/assignNativePropsToWeb'
32
+ import { getReturnVariablesAs } from './helpers/createPropMapper'
33
+ import { createShallowUpdate } from './helpers/createShallowUpdate'
34
+ import { extendStaticConfig, parseStaticConfig } from './helpers/extendStaticConfig'
35
+ import { SplitStyleResult, insertSplitStyles, useSplitStyles } from './helpers/getSplitStyles'
36
+ import { getAllSelectors } from './helpers/insertStyleRule'
37
+ import { mergeProps } from './helpers/mergeProps'
38
+ import { proxyThemeVariables } from './helpers/proxyThemeVariables'
39
+ import { useFeatures } from './hooks/useFeatures'
40
+ import { mediaState } from './hooks/useMedia'
41
+ import { usePressable } from './hooks/usePressable'
42
+ import { useServerRef, useServerState } from './hooks/useServerHooks'
43
+ import { getThemeManager, useTheme } from './hooks/useTheme'
44
+ import {
45
+ SpaceDirection,
46
+ SpaceTokens,
47
+ SpacerProps,
48
+ StaticConfig,
49
+ StaticConfigParsed,
50
+ StylableComponent,
51
+ TamaguiComponent,
52
+ TamaguiComponentState,
53
+ TamaguiConfig,
54
+ TamaguiElement,
55
+ TamaguiInternalConfig,
56
+ UseAnimationHook,
57
+ } from './types'
58
+ import { usePressability } from './vendor/Pressability'
59
+ import { Slot, mergeEvent } from './views/Slot'
60
+ import { wrapThemeManagerContext } from './views/Theme'
61
+
62
+ React['keep']
63
+
64
+ const defaultComponentState: TamaguiComponentState = Object.freeze({
65
+ hover: false,
66
+ press: false,
67
+ pressIn: false,
68
+ focus: false,
69
+ // only used by enterStyle
70
+ mounted: false,
71
+ animation: null,
72
+ })
73
+
74
+ export const mouseUps = new Set<Function>()
75
+ if (typeof document !== 'undefined') {
76
+ const cancelTouches = () => {
77
+ mouseUps.forEach((x) => x())
78
+ mouseUps.clear()
79
+ }
80
+ document.addEventListener('mouseup', cancelTouches)
81
+ document.addEventListener('touchend', cancelTouches)
82
+ document.addEventListener('touchcancel', cancelTouches)
83
+ }
84
+
85
+ // mutates
86
+ function mergeShorthands({ defaultProps }: StaticConfigParsed, { shorthands }: TamaguiConfig) {
87
+ // they are defined in correct order already { ...parent, ...child }
88
+ for (const key of Object.keys(defaultProps)) {
89
+ defaultProps[shorthands[key] || key] = defaultProps[key]
90
+ }
91
+ }
92
+
93
+ let initialTheme: any
94
+ let config: TamaguiInternalConfig
95
+
96
+ export function createComponent<
97
+ ComponentPropTypes extends Object = {},
98
+ Ref = TamaguiElement,
99
+ BaseProps = never
100
+ >(configIn: Partial<StaticConfig> | StaticConfigParsed, ParentComponent?: StylableComponent) {
101
+ const staticConfig = (() => {
102
+ const next = extendStaticConfig(configIn, ParentComponent)
103
+ if ('parsed' in next) {
104
+ return next
105
+ } else {
106
+ return parseStaticConfig(next)
107
+ }
108
+ })()
109
+
110
+ const defaultComponentClassName = `is_${staticConfig.componentName}`
111
+ let tamaguiConfig: TamaguiInternalConfig
112
+ let AnimatedText: any
113
+ let AnimatedView: any
114
+ let avoidClasses = true
115
+ let defaultNativeStyle: any
116
+ let defaultNativeStyleSheet: StyleSheet.NamedStyles<{ base: {} }>
117
+ let tamaguiDefaultProps: any
118
+ let initialSplitStyles: SplitStyleResult
119
+
120
+ // see onConfiguredOnce below which attaches a name then to this component
121
+ const component = forwardRef<Ref, ComponentPropTypes>((propsIn: any, forwardedRef) => {
122
+ // React inserts default props after your props for some reason...
123
+ // order important so we do loops, you can't just spread because JS does weird things
124
+ let props: any
125
+ if (tamaguiDefaultProps && !propsIn.asChild) {
126
+ props = mergeProps(tamaguiDefaultProps, propsIn)[0]
127
+ } else {
128
+ props = propsIn
129
+ }
130
+
131
+ const { Component, isText, isZStack } = staticConfig
132
+ const componentName = props.componentName || staticConfig.componentName
133
+ const componentClassName = props.asChild
134
+ ? ''
135
+ : props.componentName
136
+ ? `is_${props.componentName}`
137
+ : defaultComponentClassName
138
+
139
+ const forceUpdate = useForceUpdate()
140
+ config = config || getConfig()
141
+ const theme = useTheme(props.theme, componentName, props, forceUpdate)
142
+
143
+ const states = useServerState<TamaguiComponentState>(defaultComponentState)
144
+ const state = propsIn.forceStyle ? { ...states[0], [propsIn.forceStyle]: true } : states[0]
145
+
146
+ const shouldAvoidClasses = !!(props.animation && avoidClasses)
147
+ const shouldForcePseudo = !!propsIn.forceStyle
148
+ // eslint-disable-next-line react-hooks/rules-of-hooks
149
+ const hasTextAncestor = !!(isWeb && isText ? useContext(TextAncestorContext) : false)
150
+ const splitStyleState =
151
+ !shouldAvoidClasses && !shouldForcePseudo
152
+ ? {
153
+ ...state,
154
+ hasTextAncestor,
155
+ dynamicStylesInline: true,
156
+ }
157
+ : ({
158
+ ...state,
159
+ noClassNames: true,
160
+ dynamicStylesInline: true,
161
+ hasTextAncestor,
162
+ resolveVariablesAs: 'value',
163
+ } as const)
164
+
165
+ const languageContext = isRSC ? null : useContext(FontLanguageContext)
166
+
167
+ const splitStyles = useSplitStyles(
168
+ props,
169
+ staticConfig,
170
+ theme,
171
+ splitStyleState,
172
+ props.asChild ? null : initialSplitStyles?.classNames,
173
+ languageContext || undefined,
174
+ props['debug']
175
+ )
176
+
177
+ const hostRef = useServerRef<HTMLElement | View>(null)
178
+ const setState = states[1]
179
+ const setStateShallow = createShallowUpdate(setState)
180
+
181
+ if (process.env.NODE_ENV === 'development') {
182
+ if (props['debug']) {
183
+ const name = `${
184
+ componentName || Component?.displayName || Component?.name || '[Unnamed Component]'
185
+ }`
186
+ const type = staticConfig.isReactNativeWeb ? 'rnw' : 'tamagui'
187
+ const banner = `${name} ${propsIn['data-is'] || ''} ${type}`
188
+ // eslint-disable-next-line no-console
189
+ console.group(`%c 🐛 ${banner}`, 'background: yellow;')
190
+ // eslint-disable-next-line no-console
191
+ console.log('props in', propsIn)
192
+ if (typeof window !== 'undefined') {
193
+ // eslint-disable-next-line no-console
194
+ console.log('ref', hostRef, '(click to view)')
195
+ }
196
+ if (props['debug'] === 'break') {
197
+ // eslint-disable-next-line no-debugger
198
+ debugger
199
+ }
200
+ }
201
+ }
202
+
203
+ const { viewProps: viewPropsIn, pseudos, medias, style, classNames } = splitStyles
204
+ const useAnimations = tamaguiConfig?.animations?.useAnimations as UseAnimationHook | undefined
205
+ const isAnimated = !!(useAnimations && props.animation)
206
+ const hasEnterStyle = !!props.enterStyle
207
+
208
+ const animationFeatureStylesIn = props.animation ? { ...defaultNativeStyle, ...style } : null
209
+
210
+ const features = useFeatures(props, {
211
+ forceUpdate,
212
+ setStateShallow,
213
+ useAnimations,
214
+ state,
215
+ style: animationFeatureStylesIn,
216
+ pseudos,
217
+ staticConfig,
218
+ theme,
219
+ hostRef,
220
+ onDidAnimate: props.onDidAnimate,
221
+ })
222
+
223
+ const {
224
+ tag,
225
+ hitSlop,
226
+ asChild,
227
+ children,
228
+ onPress,
229
+ onPressIn,
230
+ onPressOut,
231
+ onHoverIn,
232
+ onHoverOut,
233
+ themeShallow,
234
+ space: spaceProp,
235
+ spaceDirection: _spaceDirection,
236
+ disabled: disabledProp,
237
+ onMouseUp,
238
+ onMouseDown,
239
+ onMouseEnter,
240
+ onMouseLeave,
241
+ hrefAttrs,
242
+ separator,
243
+ // ignore from here on out
244
+ forceStyle: _forceStyle,
245
+ // @ts-ignore for next/link compat etc
246
+ onClick,
247
+ theme: _themeProp,
248
+ // @ts-ignore
249
+ defaultVariants,
250
+
251
+ ...nonTamaguiProps
252
+ } = viewPropsIn
253
+
254
+ // get the right component
255
+ const isTaggable = !Component || typeof Component === 'string'
256
+
257
+ // default to tag, fallback to component (when both strings)
258
+ const element = isWeb ? (isTaggable ? tag || Component : Component) : Component
259
+ const BaseTextComponent = !isWeb ? Text : element || 'span'
260
+ const BaseViewComponent = !isWeb ? View : element || (hasTextAncestor ? 'span' : 'div')
261
+ let elementType = isText
262
+ ? (isAnimated ? AnimatedText || Text : null) || BaseTextComponent
263
+ : (isAnimated ? AnimatedView || View : null) || BaseViewComponent
264
+
265
+ elementType = Component || elementType
266
+ const isStringElement = typeof elementType === 'string'
267
+
268
+ const disabled =
269
+ (props.accessibilityState != null && props.accessibilityState.disabled === true) ||
270
+ props.accessibilityDisabled
271
+
272
+ // these can ultimately be for DOM, react-native-web views, or animated views
273
+ // so the type is pretty loose
274
+ let viewProps: Record<string, any>
275
+
276
+ // if react-native-web view just pass all props down
277
+ if (process.env.TAMAGUI_TARGET === 'web' && !staticConfig.isReactNativeWeb) {
278
+ // otherwise replicate react-native-web functionality
279
+ const {
280
+ // event props
281
+ onMoveShouldSetResponder,
282
+ onMoveShouldSetResponderCapture,
283
+ onResponderEnd,
284
+ onResponderGrant,
285
+ onResponderMove,
286
+ onResponderReject,
287
+ onResponderRelease,
288
+ onResponderStart,
289
+ onResponderTerminate,
290
+ onResponderTerminationRequest,
291
+ onScrollShouldSetResponder,
292
+ onScrollShouldSetResponderCapture,
293
+ onSelectionChangeShouldSetResponder,
294
+ onSelectionChangeShouldSetResponderCapture,
295
+ onStartShouldSetResponder,
296
+ onStartShouldSetResponderCapture,
297
+
298
+ // react-native props
299
+ nativeID,
300
+
301
+ // react-native-web accessibility props
302
+ // @ts-ignore
303
+ accessibilityActiveDescendant,
304
+ // @ts-ignore
305
+ accessibilityAtomic,
306
+ // @ts-ignore
307
+ accessibilityAutoComplete,
308
+ // @ts-ignore
309
+ accessibilityBusy,
310
+ // @ts-ignore
311
+ accessibilityChecked,
312
+ // @ts-ignore
313
+ accessibilityColumnCount,
314
+ // @ts-ignore
315
+ accessibilityColumnIndex,
316
+ // @ts-ignore
317
+ accessibilityColumnSpan,
318
+ // @ts-ignore
319
+ accessibilityControls,
320
+ // @ts-ignore
321
+ accessibilityCurrent,
322
+ // @ts-ignore
323
+ accessibilityDescribedBy,
324
+ // @ts-ignore
325
+ accessibilityDetails,
326
+ // @ts-ignore
327
+ accessibilityDisabled,
328
+ // @ts-ignore
329
+ accessibilityErrorMessage,
330
+ // @ts-ignore
331
+ accessibilityExpanded,
332
+ // @ts-ignore
333
+ accessibilityFlowTo,
334
+ // @ts-ignore
335
+ accessibilityHasPopup,
336
+ // @ts-ignore
337
+ accessibilityHidden,
338
+ // @ts-ignore
339
+ accessibilityInvalid,
340
+ // @ts-ignore
341
+ accessibilityKeyShortcuts,
342
+ // @ts-ignore
343
+ accessibilityLabel,
344
+ // @ts-ignore
345
+ accessibilityLabelledBy,
346
+ // @ts-ignore
347
+ accessibilityLevel,
348
+ // @ts-ignore
349
+ accessibilityLiveRegion,
350
+ // @ts-ignore
351
+ accessibilityModal,
352
+ // @ts-ignore
353
+ accessibilityMultiline,
354
+ // @ts-ignore
355
+ accessibilityMultiSelectable,
356
+ // @ts-ignore
357
+ accessibilityOrientation,
358
+ // @ts-ignore
359
+ accessibilityOwns,
360
+ // @ts-ignore
361
+ accessibilityPlaceholder,
362
+ // @ts-ignore
363
+ accessibilityPosInSet,
364
+ // @ts-ignore
365
+ accessibilityPressed,
366
+ // @ts-ignore
367
+ accessibilityReadOnly,
368
+ // @ts-ignore
369
+ accessibilityRequired,
370
+ // @ts-ignore
371
+ accessibilityRole,
372
+ // @ts-ignore
373
+ accessibilityRoleDescription,
374
+ // @ts-ignore
375
+ accessibilityRowCount,
376
+ // @ts-ignore
377
+ accessibilityRowIndex,
378
+ // @ts-ignore
379
+ accessibilityRowSpan,
380
+ // @ts-ignore
381
+ accessibilitySelected,
382
+ // @ts-ignore
383
+ accessibilitySetSize,
384
+ // @ts-ignore
385
+ accessibilitySort,
386
+ // @ts-ignore
387
+ accessibilityValueMax,
388
+ // @ts-ignore
389
+ accessibilityValueMin,
390
+ // @ts-ignore
391
+ accessibilityValueNow,
392
+ // @ts-ignore
393
+ accessibilityValueText,
394
+
395
+ // deprecated
396
+ accessible,
397
+ accessibilityState,
398
+ accessibilityValue,
399
+
400
+ // android
401
+ collapsable,
402
+ focusable,
403
+
404
+ onLayout,
405
+
406
+ ...webProps
407
+ } = nonTamaguiProps
408
+
409
+ viewProps = webProps
410
+
411
+ assignNativePropsToWeb(elementType, viewProps, nonTamaguiProps)
412
+
413
+ if (!isRSC) {
414
+ useElementLayout(hostRef, onLayout)
415
+
416
+ // from react-native-web
417
+ useResponderEvents(hostRef, {
418
+ onMoveShouldSetResponder,
419
+ onMoveShouldSetResponderCapture,
420
+ onResponderEnd,
421
+ onResponderGrant,
422
+ onResponderMove,
423
+ onResponderReject,
424
+ onResponderRelease,
425
+ onResponderStart,
426
+ onResponderTerminate,
427
+ onResponderTerminationRequest,
428
+ onScrollShouldSetResponder,
429
+ onScrollShouldSetResponderCapture,
430
+ onSelectionChangeShouldSetResponder,
431
+ onSelectionChangeShouldSetResponderCapture,
432
+ onStartShouldSetResponder,
433
+ onStartShouldSetResponderCapture,
434
+ })
435
+
436
+ // from react-native-web
437
+ const platformMethodsRef = usePlatformMethods(viewProps)
438
+ const setRef = useMergeRefs(hostRef, platformMethodsRef, forwardedRef as any)
439
+ viewProps.ref = setRef
440
+ }
441
+
442
+ if (props.href != undefined && hrefAttrs != undefined) {
443
+ const { download, rel, target } = hrefAttrs
444
+ if (download != null) {
445
+ viewProps.download = download
446
+ }
447
+ if (rel != null) {
448
+ viewProps.rel = rel
449
+ }
450
+ if (typeof target === 'string') {
451
+ viewProps.target = target.charAt(0) !== '_' ? '_' + target : target
452
+ }
453
+ }
454
+
455
+ // FOCUS
456
+ // "focusable" indicates that an element may be a keyboard tab-stop.
457
+ const _focusable = focusable != undefined ? focusable : accessible
458
+ const role = viewProps.role
459
+ if (_focusable === false) {
460
+ viewProps.tabIndex = '-1'
461
+ }
462
+ if (
463
+ // These native elements are focusable by default
464
+ elementType === 'a' ||
465
+ elementType === 'button' ||
466
+ elementType === 'input' ||
467
+ elementType === 'select' ||
468
+ elementType === 'textarea'
469
+ ) {
470
+ if (_focusable === false || accessibilityDisabled === true) {
471
+ viewProps.tabIndex = '-1'
472
+ }
473
+ } else if (
474
+ // These roles are made focusable by default
475
+ role === 'button' ||
476
+ role === 'checkbox' ||
477
+ role === 'link' ||
478
+ role === 'radio' ||
479
+ role === 'textbox' ||
480
+ role === 'switch'
481
+ ) {
482
+ if (_focusable !== false) {
483
+ viewProps.tabIndex = '0'
484
+ }
485
+ }
486
+ // Everything else must explicitly set the prop
487
+ if (_focusable === true) {
488
+ viewProps.tabIndex = '0'
489
+ }
490
+ } else {
491
+ viewProps = nonTamaguiProps
492
+ if (forwardedRef) {
493
+ // @ts-ignore
494
+ viewProps.ref = forwardedRef
495
+ }
496
+ }
497
+
498
+ if (process.env.NODE_ENV === 'development' && !isText && isWeb) {
499
+ Children.toArray(props.children).forEach((item) => {
500
+ if (typeof item === 'string') {
501
+ // eslint-disable-next-line no-console
502
+ console.error(`Unexpected text node: ${item}. A text node cannot be a child of a <View>.`)
503
+ }
504
+ })
505
+ }
506
+
507
+ // isMounted
508
+ const internal = useServerRef<{ isMounted: boolean; unmountEffects?: Function[] }>()
509
+ if (!internal.current) {
510
+ internal.current = {
511
+ isMounted: true,
512
+ }
513
+ }
514
+
515
+ useIsomorphicLayoutEffect(() => {
516
+ // we need to use state to properly have mounted go from false => true
517
+ if (isClient && (hasEnterStyle || props.animation) && !state.mounted) {
518
+ // for SSR we never set mounted, ensuring enterStyle={{}} is set by default
519
+ setStateShallow({
520
+ mounted: true,
521
+ })
522
+ }
523
+
524
+ internal.current!.isMounted = true
525
+ return () => {
526
+ mouseUps.delete(unPress)
527
+ internal.current!.isMounted = false
528
+ internal.current!.unmountEffects?.forEach((cb) => cb())
529
+ }
530
+ }, [hasEnterStyle, props.animation])
531
+
532
+ let styles: any[]
533
+
534
+ const animationStyles = state.animation ? state.animation.style : null
535
+
536
+ if (isStringElement && shouldAvoidClasses && !shouldForcePseudo) {
537
+ styles = {
538
+ ...defaultNativeStyle,
539
+ ...(animationStyles ?? style),
540
+ ...medias,
541
+ }
542
+ } else {
543
+ styles = [
544
+ isWeb ? null : defaultNativeStyleSheet ? (defaultNativeStyleSheet.base as ViewStyle) : null,
545
+ animationStyles ?? style,
546
+ medias,
547
+ ]
548
+ if (!animationStyles && initialSplitStyles) {
549
+ const initPseudos = initialSplitStyles.pseudos
550
+ const force = shouldForcePseudo
551
+ !state.mounted && addPseudoToStyles(styles, initPseudos, pseudos, 'enterStyle')
552
+ state.hover && addPseudoToStyles(styles, initPseudos, pseudos, 'hoverStyle', force)
553
+ state.focus && addPseudoToStyles(styles, initPseudos, pseudos, 'focusStyle', force)
554
+ state.press && addPseudoToStyles(styles, initPseudos, pseudos, 'pressStyle', force)
555
+ }
556
+ // ugly but for now...
557
+ if (shouldForcePseudo) {
558
+ const next = {}
559
+ for (const style of styles) {
560
+ if (style) {
561
+ Object.assign(next, style)
562
+ }
563
+ }
564
+ // @ts-ignore
565
+ Object.assign(splitStyles.style, next)
566
+ }
567
+ }
568
+
569
+ if (process.env.TAMAGUI_TARGET === 'web') {
570
+ let fontFamily = isText
571
+ ? splitStyles.fontFamily || staticConfig.defaultProps.fontFamily
572
+ : null
573
+ if (fontFamily && fontFamily[0] === '$') {
574
+ fontFamily = fontFamily.slice(1)
575
+ }
576
+
577
+ const classList = [
578
+ componentName ? componentClassName : '',
579
+ fontFamily ? `font_${fontFamily}` : '',
580
+ theme.className,
581
+ classNames ? Object.values(classNames).join(' ') : '',
582
+ ]
583
+
584
+ const className = classList.join(' ')
585
+ const style = animationStyles ?? splitStyles.style
586
+
587
+ // TODO this is specific to reanimated rn
588
+ const isAnimatedReactNativeWeb = props.animation && avoidClasses
589
+
590
+ if (staticConfig.isReactNativeWeb || isAnimatedReactNativeWeb) {
591
+ viewProps.dataSet = {
592
+ ...viewProps.dataSet,
593
+ className,
594
+ id: props.id,
595
+ }
596
+ if (process.env.NODE_ENV === 'development') {
597
+ // turn debug data- props into dataSet in dev mode
598
+ Object.keys(viewProps).forEach((key) => {
599
+ if (key.startsWith('data-')) {
600
+ viewProps.dataSet[key.replace('data-', '')] = viewProps[key]
601
+ delete viewProps[key]
602
+ }
603
+ })
604
+ }
605
+ } else {
606
+ viewProps.className = className
607
+ }
608
+
609
+ viewProps.style = style
610
+ } else {
611
+ viewProps.style = styles
612
+ }
613
+
614
+ // TODO need to loop active variants and see if they have matchin pseudos and apply as well
615
+ const initialPseudos = initialSplitStyles?.pseudos
616
+ const attachPress = !!(
617
+ pseudos?.pressStyle ||
618
+ initialPseudos?.pressStyle ||
619
+ onPress ||
620
+ onPressOut ||
621
+ onPressIn ||
622
+ onClick
623
+ )
624
+
625
+ const isHoverable = isWeb
626
+ const attachHover =
627
+ isHoverable &&
628
+ !!((pseudos && pseudos.hoverStyle) || onHoverIn || onHoverOut || onMouseEnter || onMouseLeave)
629
+
630
+ const handlesPressEvents = !isStringElement && !asChild
631
+ const pressKey = handlesPressEvents ? 'onPress' : 'onClick'
632
+ const pressInKey = handlesPressEvents ? 'onPressIn' : 'onMouseDown'
633
+ const pressOutKey = handlesPressEvents ? 'onPressOut' : 'onMouseUp'
634
+
635
+ // check presence to prevent reparenting bugs, allows for onPress={x ? function : undefined} usage
636
+ const shouldAttach =
637
+ !asChild &&
638
+ (attachPress ||
639
+ attachHover ||
640
+ 'pressStyle' in props ||
641
+ 'onPress' in props ||
642
+ 'onPressIn' in props ||
643
+ 'onPressOut' in props ||
644
+ (isWeb &&
645
+ ('hoverStyle' in props ||
646
+ 'onHoverIn' in props ||
647
+ 'onHoverOut' in props ||
648
+ 'onMouseEnter' in props ||
649
+ 'onMouseLeave' in props)))
650
+
651
+ const unPress = useCallback(() => {
652
+ if (!internal.current!.isMounted) return
653
+ setStateShallow({
654
+ press: false,
655
+ pressIn: false,
656
+ })
657
+ }, [])
658
+
659
+ const events =
660
+ shouldAttach && !isRSC
661
+ ? {
662
+ [pressOutKey]: attachPress
663
+ ? (e) => {
664
+ unPress()
665
+ onPressOut?.(e)
666
+ onMouseUp?.(e)
667
+ }
668
+ : undefined,
669
+ ...(isHoverable && {
670
+ onMouseEnter: attachHover
671
+ ? (e) => {
672
+ const next: Partial<typeof state> = {}
673
+ if (attachHover) {
674
+ next.hover = true
675
+ }
676
+ if (state.pressIn) {
677
+ next.press = true
678
+ }
679
+ if (Object.keys(next).length) {
680
+ setStateShallow(next)
681
+ }
682
+ onHoverIn?.(e)
683
+ onMouseEnter?.(e)
684
+ }
685
+ : undefined,
686
+ onMouseLeave: attachHover
687
+ ? (e) => {
688
+ const next: Partial<typeof state> = {}
689
+ mouseUps.add(unPress)
690
+ if (attachHover) {
691
+ next.hover = false
692
+ }
693
+ if (state.pressIn) {
694
+ next.press = false
695
+ next.pressIn = false
696
+ }
697
+ if (Object.keys(next).length) {
698
+ setStateShallow(next)
699
+ }
700
+ onHoverOut?.(e)
701
+ onMouseLeave?.(e)
702
+ }
703
+ : undefined,
704
+ }),
705
+ [pressInKey]: attachPress
706
+ ? (e) => {
707
+ setStateShallow({
708
+ press: true,
709
+ pressIn: true,
710
+ hover: false,
711
+ })
712
+ onPressIn?.(e)
713
+ onMouseDown?.(e)
714
+ if (isWeb) {
715
+ mouseUps.add(unPress)
716
+ }
717
+ }
718
+ : null,
719
+ [pressKey]: attachPress
720
+ ? (e) => {
721
+ unPress()
722
+ onClick?.(e)
723
+ onPress?.(e)
724
+ }
725
+ : null,
726
+
727
+ // replicating TouchableWithoutFeedback
728
+ ...(!isWeb && {
729
+ cancelable: !props.rejectResponderTermination,
730
+ disabled:
731
+ props.disabled !== null ? props.disabled : props.accessibilityState?.disabled,
732
+ hitSlop: props.hitSlop,
733
+ delayLongPress: props.delayLongPress,
734
+ delayPressIn: props.delayPressIn,
735
+ delayPressOut: props.delayPressOut,
736
+ focusable: viewProps.focusable ?? true,
737
+ minPressDuration: 0,
738
+ }),
739
+ }
740
+ : null
741
+
742
+ let space = spaceProp
743
+ // find space by media query
744
+ if (features.enabled.mediaQuery) {
745
+ for (const key in mediaState) {
746
+ if (!mediaState[key]) continue
747
+ if (props[key] && props[key].space !== undefined) {
748
+ space = props[key].space
749
+ }
750
+ }
751
+ }
752
+
753
+ const themeManager = getThemeManager(theme)
754
+
755
+ const shouldSetChildrenThemeToParent = Boolean(
756
+ themeShallow && themeManager && themeManager.didChangeTheme
757
+ )
758
+
759
+ const shouldProvideThemeManager =
760
+ shouldSetChildrenThemeToParent || (themeManager && themeManager.didChangeTheme)
761
+
762
+ const childEls =
763
+ !children || asChild
764
+ ? children
765
+ : wrapThemeManagerContext(
766
+ spacedChildren({
767
+ separator,
768
+ children,
769
+ space,
770
+ direction: props.spaceDirection || 'both',
771
+ isZStack,
772
+ }),
773
+ // only set context if changed theme
774
+ shouldProvideThemeManager ? themeManager : undefined,
775
+ shouldSetChildrenThemeToParent
776
+ )
777
+
778
+ let content: any
779
+
780
+ if (asChild) {
781
+ elementType = Slot
782
+ viewProps = {
783
+ ...viewProps,
784
+ onPress,
785
+ onPressIn,
786
+ onPressOut,
787
+ }
788
+ }
789
+
790
+ // EVENTS: web
791
+ if (!isRSC && isWeb) {
792
+ // eslint-disable-next-line react-hooks/rules-of-hooks
793
+ const [pressableProps] = usePressable(
794
+ events
795
+ ? {
796
+ disabled,
797
+ ...(hitSlop && {
798
+ hitSlop,
799
+ }),
800
+ onPressOut: events[pressOutKey],
801
+ onPressIn: events[pressInKey],
802
+ onPress: events[pressKey],
803
+ }
804
+ : {
805
+ disabled: true,
806
+ }
807
+ )
808
+ if (events) {
809
+ if (handlesPressEvents) {
810
+ Object.assign(viewProps, pressableProps)
811
+ } else {
812
+ Object.assign(viewProps, events)
813
+ }
814
+ }
815
+ }
816
+
817
+ // EVENTS native
818
+ if (process.env.TAMAGUI_TARGET === 'native') {
819
+ // add focus events
820
+ const attachFocus = !!(
821
+ (pseudos && pseudos.focusStyle) ||
822
+ (initialPseudos && initialPseudos.focusStyle)
823
+ )
824
+ if (attachFocus) {
825
+ viewProps.onFocus = mergeEvent(viewProps.onFocus, () => {
826
+ setStateShallow({ focus: true })
827
+ })
828
+ viewProps.onBlur = mergeEvent(viewProps.onBlur, () => {
829
+ setStateShallow({ focus: false })
830
+ })
831
+ }
832
+
833
+ // use Pressability to get smooth unPress when you press + hold + move out
834
+ // only ever create once, use .configure() to update later
835
+ const pressability = usePressability(events)
836
+ if (attachPress && events) {
837
+ const dontComposePressabilityKeys = {
838
+ onClick: true,
839
+ }
840
+ if (hitSlop) {
841
+ viewProps.hitSlop = hitSlop
842
+ }
843
+ for (const key in pressability) {
844
+ const og = props[key]
845
+ const val = pressability[key]
846
+ viewProps[key] =
847
+ og && !dontComposePressabilityKeys[key] ? composeEventHandlers(og, val) : val
848
+ }
849
+ }
850
+ }
851
+
852
+ content = createElement(elementType, viewProps, childEls)
853
+
854
+ if (process.env.TAMAGUI_TARGET === 'web') {
855
+ // only necessary when animating because some AnimatedView which wraps RNW View doesn't forward dataSet className
856
+ const isAnimatedRNWView = isAnimated && typeof elementType !== 'string' // assuming for now as reanimated is only driver
857
+ const shouldWrapWithComponentTheme =
858
+ isAnimatedRNWView && getReturnVariablesAs(props, splitStyleState) === 'non-color-value'
859
+ const shouldWrapWithHover = Boolean(events || isRSC) && attachHover
860
+
861
+ if (shouldWrapWithHover || shouldWrapWithComponentTheme) {
862
+ const themeClassName = shouldWrapWithComponentTheme ? `${theme.className}` : ''
863
+ const hoverClassName = shouldWrapWithHover ? 't_Hoverable' : ''
864
+ content = (
865
+ <span
866
+ className={`${hoverClassName} ${themeClassName}`}
867
+ style={{
868
+ display: 'contents',
869
+ }}
870
+ {...(events &&
871
+ shouldWrapWithHover && {
872
+ onMouseEnter: events.onMouseEnter,
873
+ onMouseLeave: events.onMouseLeave,
874
+ })}
875
+ >
876
+ {content}
877
+ </span>
878
+ )
879
+ }
880
+ }
881
+
882
+ if (process.env.NODE_ENV === 'development') {
883
+ if (props['debug']) {
884
+ const element = typeof elementType === 'string' ? elementType : 'Component'
885
+ // eslint-disable-next-line no-console
886
+ console.groupCollapsed(`render <${element} /> with props`, viewProps)
887
+ for (const key in viewProps) {
888
+ // eslint-disable-next-line no-console
889
+ console.log(key, viewProps[key])
890
+ }
891
+ // eslint-disable-next-line no-console
892
+ console.log('children', content)
893
+ // eslint-disable-next-line no-console
894
+ console.groupEnd()
895
+ if (typeof window !== 'undefined') {
896
+ // prettier-ignore
897
+ // eslint-disable-next-line no-console
898
+ console.log({ state, shouldProvideThemeManager, tamaguiDefaultProps, viewProps, splitStyles, animationStyles, handlesPressEvents, isStringElement, classNamesIn: props.className?.split(' '), classNamesOut: viewProps.className?.split(' '), events, shouldAttach, styles, pseudos, content, childEls, shouldAvoidClasses, avoidClasses, animation: props.animation, style, defaultNativeStyle, initialSplitStyles, ...(typeof window !== 'undefined' ? { theme, themeClassName: theme.className, staticConfig, tamaguiConfig, events, shouldAvoidClasses, shouldForcePseudo, classNames: Object.fromEntries(Object.entries(classNames).map(([k, v]) => [v, getAllSelectors()[v]])) } : null) })
899
+ }
900
+ // eslint-disable-next-line no-console
901
+ console.groupEnd()
902
+ }
903
+ }
904
+
905
+ return !isRSC && features.elements.length ? (
906
+ <>
907
+ {features.elements}
908
+ {content}
909
+ </>
910
+ ) : (
911
+ content
912
+ )
913
+ })
914
+
915
+ if (staticConfig.componentName) {
916
+ component.displayName = staticConfig.componentName
917
+ }
918
+
919
+ // Once configuration is run and all components are registered
920
+ // get default props + className and analyze styles
921
+ onConfiguredOnce((conf) => {
922
+ // in static mode we just use these to lookup configuration
923
+ // ... we likely want this? need to test
924
+ if (process.env.IS_STATIC === 'is_static') return
925
+
926
+ tamaguiConfig = conf
927
+
928
+ // do this to make sure shorthands don't duplicate with.. longhands
929
+ mergeShorthands(staticConfig, tamaguiConfig)
930
+
931
+ if (tamaguiConfig.animations) {
932
+ avoidClasses = !!tamaguiConfig.animations.avoidClasses
933
+ AnimatedText = tamaguiConfig.animations.Text
934
+ AnimatedView = tamaguiConfig.animations.View
935
+ }
936
+
937
+ initialTheme =
938
+ initialTheme ||
939
+ proxyThemeVariables(conf.themes[conf.defaultTheme || Object.keys(conf.themes)[0]])
940
+
941
+ // adds in user defined default props
942
+ config = getConfig()
943
+
944
+ let defaultPropsIn = staticConfig.defaultProps || {}
945
+
946
+ // because we run createTamagui after styled() defs, have to do some work here
947
+ // gather defaults props one time and merge downwards
948
+ // find last unprocessed and process
949
+ const parentNames = [...(staticConfig.parentNames || []), staticConfig.componentName]
950
+
951
+ if (config.defaultProps && parentNames && staticConfig.componentName) {
952
+ defaultPropsIn = mergeConfigDefaultProps(
953
+ staticConfig.componentName,
954
+ defaultPropsIn,
955
+ config.defaultProps,
956
+ parentNames,
957
+ conf
958
+ )
959
+ }
960
+
961
+ const debug = true ? defaultPropsIn['debug'] : false
962
+
963
+ if (process.env.NODE_ENV === 'development' && debug === 'break') {
964
+ // eslint-disable-next-line no-debugger
965
+ debugger
966
+ }
967
+
968
+ // remove all classNames
969
+ const [parentProps, parentClassNames] = mergeProps(defaultPropsIn, {}, true)
970
+
971
+ initialSplitStyles = insertSplitStyles(
972
+ parentProps,
973
+ staticConfig,
974
+ initialTheme,
975
+ {
976
+ mounted: true,
977
+ hover: false,
978
+ press: false,
979
+ pressIn: false,
980
+ focus: false,
981
+ resolveVariablesAs: 'both',
982
+ keepVariantsAsProps: true,
983
+ },
984
+ undefined,
985
+ undefined,
986
+ debug
987
+ )
988
+
989
+ // must preserve prop order
990
+ // leave out className because we handle that already with initialSplitStyles.classNames
991
+ // otherwise it confuses variant functions getting className props
992
+ const [defaults, defaultsClassnames] = mergeProps(
993
+ component.defaultProps as any,
994
+ initialSplitStyles.viewProps,
995
+ true
996
+ // conf.inverseShorthands
997
+ )
998
+
999
+ // avoid passing className props to variants
1000
+ initialSplitStyles.classNames = {
1001
+ ...parentClassNames,
1002
+ ...defaultsClassnames,
1003
+ ...initialSplitStyles.classNames,
1004
+ }
1005
+
1006
+ defaultNativeStyle = {}
1007
+
1008
+ const validStyles = staticConfig.validStyles || stylePropsView
1009
+
1010
+ // split - keep variables on props to be processed using theme values at runtime (native)
1011
+ if (!isWeb) {
1012
+ for (const key in staticConfig.defaultProps) {
1013
+ const val = staticConfig.defaultProps[key]
1014
+ if (validPseudoKeys[key]) continue
1015
+ if ((typeof val === 'string' && val[0] === '$') || !validStyles[key]) {
1016
+ defaults[key] = val
1017
+ } else {
1018
+ defaultNativeStyle[key] = val
1019
+ }
1020
+ }
1021
+ }
1022
+
1023
+ defaultNativeStyleSheet = StyleSheet.create({
1024
+ base: defaultNativeStyle,
1025
+ })
1026
+
1027
+ if (Object.keys(defaults).length) {
1028
+ tamaguiDefaultProps = defaults
1029
+ }
1030
+
1031
+ // add debug logs
1032
+ if (process.env.NODE_ENV === 'development' && debug) {
1033
+ if (process.env.IS_STATIC !== 'is_static') {
1034
+ // eslint-disable-next-line no-console
1035
+ console.log(`🐛 [${staticConfig.componentName || 'Component'}]`, {
1036
+ staticConfig,
1037
+ initialSplitStyles,
1038
+ tamaguiDefaultProps,
1039
+ defaultNativeStyle,
1040
+ defaults,
1041
+ defaultPropsIn,
1042
+ })
1043
+ }
1044
+ }
1045
+ })
1046
+
1047
+ let res: TamaguiComponent<ComponentPropTypes, Ref, BaseProps> = component as any
1048
+
1049
+ if (configIn.memo) {
1050
+ res = memo(res) as any
1051
+ }
1052
+
1053
+ res.staticConfig = {
1054
+ validStyles: staticConfig.validStyles || stylePropsView,
1055
+ ...staticConfig,
1056
+ }
1057
+
1058
+ // res.extractable HoC
1059
+ res.extractable = (Component: any, conf?: Partial<StaticConfig>) => {
1060
+ Component.staticConfig = extendStaticConfig(
1061
+ {
1062
+ Component,
1063
+ ...conf,
1064
+ neverFlatten: true,
1065
+ isExtractable: true,
1066
+ defaultProps: {
1067
+ ...Component.defaultProps,
1068
+ ...conf?.defaultProps,
1069
+ },
1070
+ },
1071
+ res
1072
+ )
1073
+ return Component
1074
+ }
1075
+
1076
+ return res
1077
+ }
1078
+
1079
+ // for elements to avoid spacing
1080
+ export const Unspaced = (props: { children?: any }) => {
1081
+ return props.children
1082
+ }
1083
+ Unspaced['isUnspaced'] = true
1084
+
1085
+ // dont used styled() here to avoid circular deps
1086
+ // keep inline to avoid circular deps
1087
+
1088
+ export const Spacer = createComponent<SpacerProps>({
1089
+ memo: true,
1090
+ componentName: 'Spacer',
1091
+ validStyles,
1092
+ defaultProps: {
1093
+ ...stackDefaultStyles,
1094
+ // avoid nesting issues
1095
+ tag: 'span',
1096
+ size: true,
1097
+ },
1098
+ variants: {
1099
+ size: {
1100
+ '...size': (size, { tokens }) => {
1101
+ size = size == true ? '$true' : size
1102
+ const sizePx = tokens.space[size] ?? size
1103
+ return {
1104
+ width: sizePx,
1105
+ height: sizePx,
1106
+ minWidth: sizePx,
1107
+ minHeight: sizePx,
1108
+ }
1109
+ },
1110
+ },
1111
+
1112
+ flex: {
1113
+ true: {
1114
+ flexGrow: 1,
1115
+ },
1116
+ },
1117
+
1118
+ direction: {
1119
+ horizontal: {
1120
+ height: 0,
1121
+ minHeight: 0,
1122
+ },
1123
+ vertical: {
1124
+ width: 0,
1125
+ minWidth: 0,
1126
+ },
1127
+ both: {},
1128
+ },
1129
+ },
1130
+
1131
+ defaultVariants: {
1132
+ direction: 'both',
1133
+ },
1134
+ })
1135
+
1136
+ export type SpacedChildrenProps = {
1137
+ isZStack?: boolean
1138
+ children?: React.ReactNode
1139
+ space?: SpaceTokens | number | null
1140
+ spaceFlex?: boolean | number
1141
+ direction?: SpaceDirection
1142
+ separator?: React.ReactNode
1143
+ }
1144
+
1145
+ export function spacedChildren({
1146
+ isZStack,
1147
+ children,
1148
+ space,
1149
+ direction,
1150
+ spaceFlex,
1151
+ separator,
1152
+ }: SpacedChildrenProps) {
1153
+ const hasSpace = !!(space || spaceFlex)
1154
+ const hasSeparator = !(separator === undefined || separator === null)
1155
+ if (!hasSpace && !hasSeparator && !isZStack) {
1156
+ return children
1157
+ }
1158
+ const childrenList = Children.toArray(children)
1159
+ if (childrenList.length <= 1 && !isZStack) {
1160
+ return childrenList
1161
+ }
1162
+ const final: React.ReactNode[] = []
1163
+ for (const [index, child] of childrenList.entries()) {
1164
+ const isEmpty =
1165
+ child === null || child === undefined || (Array.isArray(child) && child.length === 0)
1166
+
1167
+ // push them all, but wrap some in Fragment
1168
+ if (isEmpty || !child || (child['key'] && !isZStack)) {
1169
+ final.push(child)
1170
+ } else {
1171
+ final.push(
1172
+ <Fragment key={index}>{isZStack ? <AbsoluteFill>{child}</AbsoluteFill> : child}</Fragment>
1173
+ )
1174
+ }
1175
+
1176
+ // first child unspaced avoid insert space
1177
+ if (isUnspaced(child) && index === 0) {
1178
+ continue
1179
+ }
1180
+
1181
+ // no spacing on ZStack
1182
+ if (isZStack) {
1183
+ continue
1184
+ }
1185
+
1186
+ const next = childrenList[index + 1]
1187
+
1188
+ if (next && !isUnspaced(next)) {
1189
+ if (separator) {
1190
+ if (hasSpace) {
1191
+ final.push(
1192
+ createSpacer({
1193
+ key: `_${index}_before_sep_spacer`,
1194
+ direction,
1195
+ space,
1196
+ spaceFlex,
1197
+ })
1198
+ )
1199
+ }
1200
+ final.push(
1201
+ React.isValidElement(separator)
1202
+ ? React.cloneElement(separator, { key: `sep_${index}` })
1203
+ : separator
1204
+ )
1205
+ if (hasSpace) {
1206
+ final.push(
1207
+ createSpacer({
1208
+ key: `_${index}_after_sep_spacer`,
1209
+ direction,
1210
+ space,
1211
+ spaceFlex,
1212
+ })
1213
+ )
1214
+ }
1215
+ } else {
1216
+ final.push(
1217
+ createSpacer({
1218
+ key: `_${index}_spacer`,
1219
+ direction,
1220
+ space,
1221
+ spaceFlex,
1222
+ })
1223
+ )
1224
+ }
1225
+ }
1226
+ }
1227
+
1228
+ return final
1229
+ }
1230
+
1231
+ type CreateSpacerProps = SpacedChildrenProps & { key: string }
1232
+
1233
+ function createSpacer({ key, direction, space, spaceFlex }: CreateSpacerProps) {
1234
+ return (
1235
+ <Spacer
1236
+ key={key}
1237
+ size={space}
1238
+ direction={direction}
1239
+ {...(spaceFlex && {
1240
+ flex: spaceFlex,
1241
+ })}
1242
+ />
1243
+ )
1244
+ }
1245
+
1246
+ function isUnspaced(child: React.ReactNode) {
1247
+ // console.log('unspaced?', child, getMedia())
1248
+ return child?.['type']?.['isVisuallyHidden'] || child?.['type']?.['isUnspaced']
1249
+ }
1250
+
1251
+ function AbsoluteFill(props: { children?: any }) {
1252
+ return (
1253
+ <View pointerEvents="box-none" style={StyleSheet.absoluteFill}>
1254
+ {props.children}
1255
+ </View>
1256
+ )
1257
+ }
1258
+
1259
+ // this can be done with CSS entirely right?
1260
+ // const shouldWrapTextAncestor = isWeb && isText && !hasTextAncestor
1261
+ // if (shouldWrapTextAncestor) {
1262
+ // // from react-native-web
1263
+ // content = createElement(TextAncestorContext.Provider, { value: true }, content)
1264
+ // }
1265
+
1266
+ export function processIDRefList(idRefList: string | Array<string>): string {
1267
+ return Array.isArray(idRefList) ? idRefList.join(' ') : idRefList
1268
+ }
1269
+
1270
+ export const accessibilityRoleToWebRole = {
1271
+ adjustable: 'slider',
1272
+ button: 'button',
1273
+ header: 'heading',
1274
+ image: 'img',
1275
+ imagebutton: null,
1276
+ keyboardkey: null,
1277
+ label: null,
1278
+ link: 'link',
1279
+ none: 'presentation',
1280
+ search: 'search',
1281
+ summary: 'region',
1282
+ text: null,
1283
+ }
1284
+
1285
+ function addPseudoToStyles(
1286
+ styles: any[],
1287
+ initialPseudos: SplitStyleResult['pseudos'],
1288
+ pseudos: any,
1289
+ name: string,
1290
+ force = false
1291
+ ) {
1292
+ // on web use pseudo object { hoverStyle } to keep specificity with concatClassName
1293
+ const pseudoStyle = pseudos[name]
1294
+ const shouldNestObject = isWeb && name !== 'enterStyle' && name !== 'exitStyle'
1295
+ const defaultPseudoStyle = initialPseudos[name]
1296
+ const style = defaultPseudoStyle ? { ...defaultPseudoStyle, ...pseudoStyle } : pseudoStyle
1297
+ if (style) {
1298
+ styles.push(shouldNestObject && !force ? { [name]: style } : style)
1299
+ }
1300
+ }
1301
+
1302
+ const DefaultProps = new Map()
1303
+
1304
+ function mergeConfigDefaultProps(
1305
+ name: string,
1306
+ props: Record<string, any>,
1307
+ configDefaults: Record<string, Object>,
1308
+ parentNames: (string | undefined)[],
1309
+ conf: TamaguiInternalConfig
1310
+ ) {
1311
+ const len = parentNames.length
1312
+ let prev
1313
+
1314
+ for (let i = 0; i < len; i++) {
1315
+ const n = parentNames[i]
1316
+ if (!n) continue
1317
+ if (DefaultProps.has(n)) {
1318
+ prev = DefaultProps.get(n)
1319
+ continue
1320
+ }
1321
+ const props = configDefaults[n]
1322
+ if (!props) {
1323
+ if (prev) {
1324
+ DefaultProps.set(n, prev)
1325
+ }
1326
+ continue
1327
+ }
1328
+ prev = mergeProps(prev || {}, props, false, conf.inverseShorthands)[0]
1329
+ DefaultProps.set(n, prev)
1330
+ }
1331
+
1332
+ // overwrite the user defined defaults on top of internal defined defaults
1333
+ const ourDefaultsMerged = DefaultProps.get(name)
1334
+ if (ourDefaultsMerged) {
1335
+ return mergeProps(props, ourDefaultsMerged, false, conf.inverseShorthands)[0]
1336
+ }
1337
+ return props
1338
+ }