@tamagui/core 1.0.1-beta.99 → 1.0.1-rc.0.1

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