@tamagui/web 1.2.5

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 (556) hide show
  1. package/README.md +1 -0
  2. package/dist/cjs/Tamagui.js +77 -0
  3. package/dist/cjs/Tamagui.js.map +7 -0
  4. package/dist/cjs/addTheme.js +78 -0
  5. package/dist/cjs/addTheme.js.map +7 -0
  6. package/dist/cjs/config.js +91 -0
  7. package/dist/cjs/config.js.map +7 -0
  8. package/dist/cjs/constants/constants.js +49 -0
  9. package/dist/cjs/constants/constants.js.map +7 -0
  10. package/dist/cjs/constants/isDevTools.js +37 -0
  11. package/dist/cjs/constants/isDevTools.js.map +7 -0
  12. package/dist/cjs/contexts/ButtonNestingContext.js +30 -0
  13. package/dist/cjs/contexts/ButtonNestingContext.js.map +7 -0
  14. package/dist/cjs/contexts/FontLanguageContext.js +30 -0
  15. package/dist/cjs/contexts/FontLanguageContext.js.map +7 -0
  16. package/dist/cjs/contexts/TextAncestorContext.js +30 -0
  17. package/dist/cjs/contexts/TextAncestorContext.js.map +7 -0
  18. package/dist/cjs/createComponent.js +874 -0
  19. package/dist/cjs/createComponent.js.map +7 -0
  20. package/dist/cjs/createFont.js +69 -0
  21. package/dist/cjs/createFont.js.map +7 -0
  22. package/dist/cjs/createShorthands.js +31 -0
  23. package/dist/cjs/createShorthands.js.map +7 -0
  24. package/dist/cjs/createTamagui.js +206 -0
  25. package/dist/cjs/createTamagui.js.map +7 -0
  26. package/dist/cjs/createTheme.js +31 -0
  27. package/dist/cjs/createTheme.js.map +7 -0
  28. package/dist/cjs/createTokens.js +39 -0
  29. package/dist/cjs/createTokens.js.map +7 -0
  30. package/dist/cjs/createVariable.js +111 -0
  31. package/dist/cjs/createVariable.js.map +7 -0
  32. package/dist/cjs/createVariables.js +60 -0
  33. package/dist/cjs/createVariables.js.map +7 -0
  34. package/dist/cjs/helpers/RNComponents.js +40 -0
  35. package/dist/cjs/helpers/RNComponents.js.map +7 -0
  36. package/dist/cjs/helpers/ThemeManager.js +234 -0
  37. package/dist/cjs/helpers/ThemeManager.js.map +7 -0
  38. package/dist/cjs/helpers/ThemeManagerContext.js +30 -0
  39. package/dist/cjs/helpers/ThemeManagerContext.js.map +7 -0
  40. package/dist/cjs/helpers/createMediaStyle.js +67 -0
  41. package/dist/cjs/helpers/createMediaStyle.js.map +7 -0
  42. package/dist/cjs/helpers/createPropMapper.js +423 -0
  43. package/dist/cjs/helpers/createPropMapper.js.map +7 -0
  44. package/dist/cjs/helpers/createProxy.js +43 -0
  45. package/dist/cjs/helpers/createProxy.js.map +7 -0
  46. package/dist/cjs/helpers/expandStyle.js +95 -0
  47. package/dist/cjs/helpers/expandStyle.js.map +7 -0
  48. package/dist/cjs/helpers/expandStyles.js +116 -0
  49. package/dist/cjs/helpers/expandStyles.js.map +7 -0
  50. package/dist/cjs/helpers/extendStaticConfig.js +91 -0
  51. package/dist/cjs/helpers/extendStaticConfig.js.map +7 -0
  52. package/dist/cjs/helpers/getAnimationDriver.js +32 -0
  53. package/dist/cjs/helpers/getAnimationDriver.js.map +7 -0
  54. package/dist/cjs/helpers/getExpandedShorthands.js +40 -0
  55. package/dist/cjs/helpers/getExpandedShorthands.js.map +7 -0
  56. package/dist/cjs/helpers/getFontLanguage.js +29 -0
  57. package/dist/cjs/helpers/getFontLanguage.js.map +7 -0
  58. package/dist/cjs/helpers/getSplitStyles.js +850 -0
  59. package/dist/cjs/helpers/getSplitStyles.js.map +7 -0
  60. package/dist/cjs/helpers/getStylesAtomic.js +226 -0
  61. package/dist/cjs/helpers/getStylesAtomic.js.map +7 -0
  62. package/dist/cjs/helpers/getStylesAtomic.native.js +38 -0
  63. package/dist/cjs/helpers/getStylesAtomic.native.js.map +7 -0
  64. package/dist/cjs/helpers/getThemeCSSRules.js +110 -0
  65. package/dist/cjs/helpers/getThemeCSSRules.js.map +7 -0
  66. package/dist/cjs/helpers/getThemeCSSRules.native.js +31 -0
  67. package/dist/cjs/helpers/getThemeCSSRules.native.js.map +7 -0
  68. package/dist/cjs/helpers/getVariantExtras.js +92 -0
  69. package/dist/cjs/helpers/getVariantExtras.js.map +7 -0
  70. package/dist/cjs/helpers/insertStyleRule.js +218 -0
  71. package/dist/cjs/helpers/insertStyleRule.js.map +7 -0
  72. package/dist/cjs/helpers/isObj.js +29 -0
  73. package/dist/cjs/helpers/isObj.js.map +7 -0
  74. package/dist/cjs/helpers/isTamaguiComponent.js +32 -0
  75. package/dist/cjs/helpers/isTamaguiComponent.js.map +7 -0
  76. package/dist/cjs/helpers/isTamaguiElement.js +33 -0
  77. package/dist/cjs/helpers/isTamaguiElement.js.map +7 -0
  78. package/dist/cjs/helpers/matchMedia.js +42 -0
  79. package/dist/cjs/helpers/matchMedia.js.map +7 -0
  80. package/dist/cjs/helpers/matchMedia.native.js +48 -0
  81. package/dist/cjs/helpers/matchMedia.native.js.map +7 -0
  82. package/dist/cjs/helpers/mergeProps.js +54 -0
  83. package/dist/cjs/helpers/mergeProps.js.map +7 -0
  84. package/dist/cjs/helpers/mergeTransform.js +47 -0
  85. package/dist/cjs/helpers/mergeTransform.js.map +7 -0
  86. package/dist/cjs/helpers/normalizeColor.js +71 -0
  87. package/dist/cjs/helpers/normalizeColor.js.map +7 -0
  88. package/dist/cjs/helpers/normalizeValueWithProperty.js +138 -0
  89. package/dist/cjs/helpers/normalizeValueWithProperty.js.map +7 -0
  90. package/dist/cjs/helpers/proxyThemeVariables.js +40 -0
  91. package/dist/cjs/helpers/proxyThemeVariables.js.map +7 -0
  92. package/dist/cjs/helpers/pseudoDescriptors.js +53 -0
  93. package/dist/cjs/helpers/pseudoDescriptors.js.map +7 -0
  94. package/dist/cjs/helpers/registerCSSVariable.js +40 -0
  95. package/dist/cjs/helpers/registerCSSVariable.js.map +7 -0
  96. package/dist/cjs/helpers/themeable.js +62 -0
  97. package/dist/cjs/helpers/themeable.js.map +7 -0
  98. package/dist/cjs/helpers/themes.js +78 -0
  99. package/dist/cjs/helpers/themes.js.map +7 -0
  100. package/dist/cjs/helpers/timer.js +35 -0
  101. package/dist/cjs/helpers/timer.js.map +7 -0
  102. package/dist/cjs/helpers/useShallowSetState.js +59 -0
  103. package/dist/cjs/helpers/useShallowSetState.js.map +7 -0
  104. package/dist/cjs/helpers/warnOnce.js +38 -0
  105. package/dist/cjs/helpers/warnOnce.js.map +7 -0
  106. package/dist/cjs/helpers/withStaticProperties.js +32 -0
  107. package/dist/cjs/helpers/withStaticProperties.js.map +7 -0
  108. package/dist/cjs/hooks/getThemeUnwrapped.js +34 -0
  109. package/dist/cjs/hooks/getThemeUnwrapped.js.map +7 -0
  110. package/dist/cjs/hooks/useId.js +29 -0
  111. package/dist/cjs/hooks/useId.js.map +7 -0
  112. package/dist/cjs/hooks/useIsTouchDevice.js +33 -0
  113. package/dist/cjs/hooks/useIsTouchDevice.js.map +7 -0
  114. package/dist/cjs/hooks/useMedia.js +263 -0
  115. package/dist/cjs/hooks/useMedia.js.map +7 -0
  116. package/dist/cjs/hooks/useSafeRef.js +59 -0
  117. package/dist/cjs/hooks/useSafeRef.js.map +7 -0
  118. package/dist/cjs/hooks/useServerHooks.js +36 -0
  119. package/dist/cjs/hooks/useServerHooks.js.map +7 -0
  120. package/dist/cjs/hooks/useStyle.js +61 -0
  121. package/dist/cjs/hooks/useStyle.js.map +7 -0
  122. package/dist/cjs/hooks/useTheme.js +230 -0
  123. package/dist/cjs/hooks/useTheme.js.map +7 -0
  124. package/dist/cjs/hooks/useThemeName.js +52 -0
  125. package/dist/cjs/hooks/useThemeName.js.map +7 -0
  126. package/dist/cjs/index.js +104 -0
  127. package/dist/cjs/index.js.map +7 -0
  128. package/dist/cjs/inject-styles.js +40 -0
  129. package/dist/cjs/inject-styles.js.map +7 -0
  130. package/dist/cjs/insertFont.js +93 -0
  131. package/dist/cjs/insertFont.js.map +7 -0
  132. package/dist/cjs/setupHooks.js +34 -0
  133. package/dist/cjs/setupHooks.js.map +7 -0
  134. package/dist/cjs/setupReactNative.js +51 -0
  135. package/dist/cjs/setupReactNative.js.map +7 -0
  136. package/dist/cjs/styled.js +95 -0
  137. package/dist/cjs/styled.js.map +7 -0
  138. package/dist/cjs/types.js +17 -0
  139. package/dist/cjs/types.js.map +7 -0
  140. package/dist/cjs/updateTheme.js +47 -0
  141. package/dist/cjs/updateTheme.js.map +7 -0
  142. package/dist/cjs/views/FontLanguage.js +41 -0
  143. package/dist/cjs/views/FontLanguage.js.map +7 -0
  144. package/dist/cjs/views/FontLanguage.native.js +35 -0
  145. package/dist/cjs/views/FontLanguage.native.js.map +7 -0
  146. package/dist/cjs/views/FontLanguage.types.js +17 -0
  147. package/dist/cjs/views/FontLanguage.types.js.map +7 -0
  148. package/dist/cjs/views/Slot.js +92 -0
  149. package/dist/cjs/views/Slot.js.map +7 -0
  150. package/dist/cjs/views/Stack.js +38 -0
  151. package/dist/cjs/views/Stack.js.map +7 -0
  152. package/dist/cjs/views/TamaguiProvider.js +90 -0
  153. package/dist/cjs/views/TamaguiProvider.js.map +7 -0
  154. package/dist/cjs/views/Text.js +94 -0
  155. package/dist/cjs/views/Text.js.map +7 -0
  156. package/dist/cjs/views/Theme.js +88 -0
  157. package/dist/cjs/views/Theme.js.map +7 -0
  158. package/dist/cjs/views/ThemeProvider.js +70 -0
  159. package/dist/cjs/views/ThemeProvider.js.map +7 -0
  160. package/dist/esm/Tamagui.js +41 -0
  161. package/dist/esm/Tamagui.js.map +7 -0
  162. package/dist/esm/addTheme.js +54 -0
  163. package/dist/esm/addTheme.js.map +7 -0
  164. package/dist/esm/config.js +58 -0
  165. package/dist/esm/config.js.map +7 -0
  166. package/dist/esm/constants/constants.js +22 -0
  167. package/dist/esm/constants/constants.js.map +7 -0
  168. package/dist/esm/constants/isDevTools.js +13 -0
  169. package/dist/esm/constants/isDevTools.js.map +7 -0
  170. package/dist/esm/contexts/ButtonNestingContext.js +6 -0
  171. package/dist/esm/contexts/ButtonNestingContext.js.map +7 -0
  172. package/dist/esm/contexts/FontLanguageContext.js +6 -0
  173. package/dist/esm/contexts/FontLanguageContext.js.map +7 -0
  174. package/dist/esm/contexts/TextAncestorContext.js +6 -0
  175. package/dist/esm/contexts/TextAncestorContext.js.map +7 -0
  176. package/dist/esm/createComponent.js +849 -0
  177. package/dist/esm/createComponent.js.map +7 -0
  178. package/dist/esm/createFont.js +45 -0
  179. package/dist/esm/createFont.js.map +7 -0
  180. package/dist/esm/createShorthands.js +7 -0
  181. package/dist/esm/createShorthands.js.map +7 -0
  182. package/dist/esm/createTamagui.js +190 -0
  183. package/dist/esm/createTamagui.js.map +7 -0
  184. package/dist/esm/createTheme.js +7 -0
  185. package/dist/esm/createTheme.js.map +7 -0
  186. package/dist/esm/createTokens.js +15 -0
  187. package/dist/esm/createTokens.js.map +7 -0
  188. package/dist/esm/createVariable.js +78 -0
  189. package/dist/esm/createVariable.js.map +7 -0
  190. package/dist/esm/createVariables.js +35 -0
  191. package/dist/esm/createVariables.js.map +7 -0
  192. package/dist/esm/helpers/RNComponents.js +16 -0
  193. package/dist/esm/helpers/RNComponents.js.map +7 -0
  194. package/dist/esm/helpers/ThemeManager.js +209 -0
  195. package/dist/esm/helpers/ThemeManager.js.map +7 -0
  196. package/dist/esm/helpers/ThemeManagerContext.js +6 -0
  197. package/dist/esm/helpers/ThemeManagerContext.js.map +7 -0
  198. package/dist/esm/helpers/createMediaStyle.js +42 -0
  199. package/dist/esm/helpers/createMediaStyle.js.map +7 -0
  200. package/dist/esm/helpers/createPropMapper.js +396 -0
  201. package/dist/esm/helpers/createPropMapper.js.map +7 -0
  202. package/dist/esm/helpers/createProxy.js +19 -0
  203. package/dist/esm/helpers/createProxy.js.map +7 -0
  204. package/dist/esm/helpers/expandStyle.js +71 -0
  205. package/dist/esm/helpers/expandStyle.js.map +7 -0
  206. package/dist/esm/helpers/expandStyles.js +90 -0
  207. package/dist/esm/helpers/expandStyles.js.map +7 -0
  208. package/dist/esm/helpers/extendStaticConfig.js +66 -0
  209. package/dist/esm/helpers/extendStaticConfig.js.map +7 -0
  210. package/dist/esm/helpers/getAnimationDriver.js +8 -0
  211. package/dist/esm/helpers/getAnimationDriver.js.map +7 -0
  212. package/dist/esm/helpers/getExpandedShorthands.js +16 -0
  213. package/dist/esm/helpers/getExpandedShorthands.js.map +7 -0
  214. package/dist/esm/helpers/getFontLanguage.js +5 -0
  215. package/dist/esm/helpers/getFontLanguage.js.map +7 -0
  216. package/dist/esm/helpers/getSplitStyles.js +849 -0
  217. package/dist/esm/helpers/getSplitStyles.js.map +7 -0
  218. package/dist/esm/helpers/getStylesAtomic.js +200 -0
  219. package/dist/esm/helpers/getStylesAtomic.js.map +7 -0
  220. package/dist/esm/helpers/getStylesAtomic.native.js +12 -0
  221. package/dist/esm/helpers/getStylesAtomic.native.js.map +7 -0
  222. package/dist/esm/helpers/getThemeCSSRules.js +86 -0
  223. package/dist/esm/helpers/getThemeCSSRules.js.map +7 -0
  224. package/dist/esm/helpers/getThemeCSSRules.native.js +7 -0
  225. package/dist/esm/helpers/getThemeCSSRules.native.js.map +7 -0
  226. package/dist/esm/helpers/getVariantExtras.js +67 -0
  227. package/dist/esm/helpers/getVariantExtras.js.map +7 -0
  228. package/dist/esm/helpers/insertStyleRule.js +186 -0
  229. package/dist/esm/helpers/insertStyleRule.js.map +7 -0
  230. package/dist/esm/helpers/isObj.js +5 -0
  231. package/dist/esm/helpers/isObj.js.map +7 -0
  232. package/dist/esm/helpers/isTamaguiComponent.js +8 -0
  233. package/dist/esm/helpers/isTamaguiComponent.js.map +7 -0
  234. package/dist/esm/helpers/isTamaguiElement.js +9 -0
  235. package/dist/esm/helpers/isTamaguiElement.js.map +7 -0
  236. package/dist/esm/helpers/matchMedia.js +17 -0
  237. package/dist/esm/helpers/matchMedia.js.map +7 -0
  238. package/dist/esm/helpers/matchMedia.native.js +23 -0
  239. package/dist/esm/helpers/matchMedia.native.js.map +7 -0
  240. package/dist/esm/helpers/mergeProps.js +30 -0
  241. package/dist/esm/helpers/mergeProps.js.map +7 -0
  242. package/dist/esm/helpers/mergeTransform.js +21 -0
  243. package/dist/esm/helpers/mergeTransform.js.map +7 -0
  244. package/dist/esm/helpers/normalizeColor.js +36 -0
  245. package/dist/esm/helpers/normalizeColor.js.map +7 -0
  246. package/dist/esm/helpers/normalizeValueWithProperty.js +113 -0
  247. package/dist/esm/helpers/normalizeValueWithProperty.js.map +7 -0
  248. package/dist/esm/helpers/proxyThemeVariables.js +16 -0
  249. package/dist/esm/helpers/proxyThemeVariables.js.map +7 -0
  250. package/dist/esm/helpers/pseudoDescriptors.js +29 -0
  251. package/dist/esm/helpers/pseudoDescriptors.js.map +7 -0
  252. package/dist/esm/helpers/registerCSSVariable.js +14 -0
  253. package/dist/esm/helpers/registerCSSVariable.js.map +7 -0
  254. package/dist/esm/helpers/themeable.js +28 -0
  255. package/dist/esm/helpers/themeable.js.map +7 -0
  256. package/dist/esm/helpers/themes.js +53 -0
  257. package/dist/esm/helpers/themes.js.map +7 -0
  258. package/dist/esm/helpers/timer.js +11 -0
  259. package/dist/esm/helpers/timer.js.map +7 -0
  260. package/dist/esm/helpers/useShallowSetState.js +35 -0
  261. package/dist/esm/helpers/useShallowSetState.js.map +7 -0
  262. package/dist/esm/helpers/warnOnce.js +14 -0
  263. package/dist/esm/helpers/warnOnce.js.map +7 -0
  264. package/dist/esm/helpers/withStaticProperties.js +8 -0
  265. package/dist/esm/helpers/withStaticProperties.js.map +7 -0
  266. package/dist/esm/hooks/getThemeUnwrapped.js +9 -0
  267. package/dist/esm/hooks/getThemeUnwrapped.js.map +7 -0
  268. package/dist/esm/hooks/useId.js +5 -0
  269. package/dist/esm/hooks/useId.js.map +7 -0
  270. package/dist/esm/hooks/useIsTouchDevice.js +9 -0
  271. package/dist/esm/hooks/useIsTouchDevice.js.map +7 -0
  272. package/dist/esm/hooks/useMedia.js +225 -0
  273. package/dist/esm/hooks/useMedia.js.map +7 -0
  274. package/dist/esm/hooks/useSafeRef.js +35 -0
  275. package/dist/esm/hooks/useSafeRef.js.map +7 -0
  276. package/dist/esm/hooks/useServerHooks.js +11 -0
  277. package/dist/esm/hooks/useServerHooks.js.map +7 -0
  278. package/dist/esm/hooks/useStyle.js +37 -0
  279. package/dist/esm/hooks/useStyle.js.map +7 -0
  280. package/dist/esm/hooks/useTheme.js +205 -0
  281. package/dist/esm/hooks/useTheme.js.map +7 -0
  282. package/dist/esm/hooks/useThemeName.js +28 -0
  283. package/dist/esm/hooks/useThemeName.js.map +7 -0
  284. package/dist/esm/index.js +77 -0
  285. package/dist/esm/index.js.map +7 -0
  286. package/dist/esm/inject-styles.js +16 -0
  287. package/dist/esm/inject-styles.js.map +7 -0
  288. package/dist/esm/insertFont.js +67 -0
  289. package/dist/esm/insertFont.js.map +7 -0
  290. package/dist/esm/setupHooks.js +9 -0
  291. package/dist/esm/setupHooks.js.map +7 -0
  292. package/dist/esm/setupReactNative.js +25 -0
  293. package/dist/esm/setupReactNative.js.map +7 -0
  294. package/dist/esm/styled.js +71 -0
  295. package/dist/esm/styled.js.map +7 -0
  296. package/dist/esm/types.js +1 -0
  297. package/dist/esm/types.js.map +7 -0
  298. package/dist/esm/updateTheme.js +23 -0
  299. package/dist/esm/updateTheme.js.map +7 -0
  300. package/dist/esm/views/FontLanguage.js +17 -0
  301. package/dist/esm/views/FontLanguage.js.map +7 -0
  302. package/dist/esm/views/FontLanguage.native.js +11 -0
  303. package/dist/esm/views/FontLanguage.native.js.map +7 -0
  304. package/dist/esm/views/FontLanguage.types.js +1 -0
  305. package/dist/esm/views/FontLanguage.types.js.map +7 -0
  306. package/dist/esm/views/Slot.js +66 -0
  307. package/dist/esm/views/Slot.js.map +7 -0
  308. package/dist/esm/views/Stack.js +14 -0
  309. package/dist/esm/views/Stack.js.map +7 -0
  310. package/dist/esm/views/TamaguiProvider.js +56 -0
  311. package/dist/esm/views/TamaguiProvider.js.map +7 -0
  312. package/dist/esm/views/Text.js +70 -0
  313. package/dist/esm/views/Text.js.map +7 -0
  314. package/dist/esm/views/Theme.js +63 -0
  315. package/dist/esm/views/Theme.js.map +7 -0
  316. package/dist/esm/views/ThemeProvider.js +45 -0
  317. package/dist/esm/views/ThemeProvider.js.map +7 -0
  318. package/package.json +73 -0
  319. package/reset.css +37 -0
  320. package/src/Tamagui.ts +48 -0
  321. package/src/addTheme.ts +65 -0
  322. package/src/config.ts +62 -0
  323. package/src/constants/constants.ts +17 -0
  324. package/src/constants/isDevTools.ts +12 -0
  325. package/src/contexts/ButtonNestingContext.tsx +3 -0
  326. package/src/contexts/FontLanguageContext.tsx +5 -0
  327. package/src/contexts/TextAncestorContext.tsx +3 -0
  328. package/src/createComponent.tsx +1133 -0
  329. package/src/createFont.ts +50 -0
  330. package/src/createShorthands.ts +7 -0
  331. package/src/createTamagui.ts +253 -0
  332. package/src/createTheme.ts +13 -0
  333. package/src/createTokens.ts +46 -0
  334. package/src/createVariable.ts +93 -0
  335. package/src/createVariables.ts +55 -0
  336. package/src/helpers/RNComponents.tsx +14 -0
  337. package/src/helpers/ThemeManager.tsx +285 -0
  338. package/src/helpers/ThemeManagerContext.tsx +5 -0
  339. package/src/helpers/createMediaStyle.ts +55 -0
  340. package/src/helpers/createPropMapper.ts +562 -0
  341. package/src/helpers/createProxy.ts +16 -0
  342. package/src/helpers/expandStyle.ts +82 -0
  343. package/src/helpers/expandStyles.ts +107 -0
  344. package/src/helpers/extendStaticConfig.ts +78 -0
  345. package/src/helpers/getAnimationDriver.tsx +5 -0
  346. package/src/helpers/getExpandedShorthands.ts +17 -0
  347. package/src/helpers/getFontLanguage.ts +2 -0
  348. package/src/helpers/getSplitStyles.tsx +1133 -0
  349. package/src/helpers/getStylesAtomic.native.ts +8 -0
  350. package/src/helpers/getStylesAtomic.ts +274 -0
  351. package/src/helpers/getThemeCSSRules.native.ts +3 -0
  352. package/src/helpers/getThemeCSSRules.ts +120 -0
  353. package/src/helpers/getVariantExtras.tsx +85 -0
  354. package/src/helpers/insertStyleRule.tsx +218 -0
  355. package/src/helpers/isObj.ts +1 -0
  356. package/src/helpers/isTamaguiComponent.tsx +11 -0
  357. package/src/helpers/isTamaguiElement.tsx +11 -0
  358. package/src/helpers/matchMedia.native.ts +23 -0
  359. package/src/helpers/matchMedia.ts +16 -0
  360. package/src/helpers/mergeProps.ts +56 -0
  361. package/src/helpers/mergeTransform.ts +30 -0
  362. package/src/helpers/normalizeColor.ts +38 -0
  363. package/src/helpers/normalizeValueWithProperty.ts +129 -0
  364. package/src/helpers/proxyThemeVariables.tsx +15 -0
  365. package/src/helpers/pseudoDescriptors.ts +40 -0
  366. package/src/helpers/registerCSSVariable.ts +13 -0
  367. package/src/helpers/themeable.tsx +44 -0
  368. package/src/helpers/themes.ts +67 -0
  369. package/src/helpers/timer.ts +9 -0
  370. package/src/helpers/useShallowSetState.tsx +41 -0
  371. package/src/helpers/warnOnce.tsx +11 -0
  372. package/src/helpers/withStaticProperties.tsx +7 -0
  373. package/src/hooks/getThemeUnwrapped.tsx +5 -0
  374. package/src/hooks/useId.tsx +1 -0
  375. package/src/hooks/useIsTouchDevice.tsx +6 -0
  376. package/src/hooks/useMedia.tsx +298 -0
  377. package/src/hooks/useSafeRef.ts +45 -0
  378. package/src/hooks/useServerHooks.tsx +12 -0
  379. package/src/hooks/useStyle.tsx +49 -0
  380. package/src/hooks/useTheme.tsx +274 -0
  381. package/src/hooks/useThemeName.tsx +27 -0
  382. package/src/index.ts +72 -0
  383. package/src/inject-styles.ts +20 -0
  384. package/src/insertFont.ts +73 -0
  385. package/src/setupHooks.ts +35 -0
  386. package/src/setupReactNative.ts +22 -0
  387. package/src/styled.tsx +195 -0
  388. package/src/types.tsx +1459 -0
  389. package/src/updateTheme.ts +26 -0
  390. package/src/views/FontLanguage.native.tsx +12 -0
  391. package/src/views/FontLanguage.tsx +16 -0
  392. package/src/views/FontLanguage.types.ts +13 -0
  393. package/src/views/Slot.tsx +95 -0
  394. package/src/views/Stack.tsx +25 -0
  395. package/src/views/TamaguiProvider.tsx +65 -0
  396. package/src/views/Text.tsx +87 -0
  397. package/src/views/Theme.tsx +83 -0
  398. package/src/views/ThemeProvider.tsx +55 -0
  399. package/types/Tamagui.d.ts +30 -0
  400. package/types/Tamagui.d.ts.map +1 -0
  401. package/types/addTheme.d.ts +32 -0
  402. package/types/addTheme.d.ts.map +1 -0
  403. package/types/config.d.ts +49 -0
  404. package/types/config.d.ts.map +1 -0
  405. package/types/constants/constants.d.ts +21 -0
  406. package/types/constants/constants.d.ts.map +1 -0
  407. package/types/constants/isDevTools.d.ts +2 -0
  408. package/types/constants/isDevTools.d.ts.map +1 -0
  409. package/types/contexts/ButtonNestingContext.d.ts +3 -0
  410. package/types/contexts/ButtonNestingContext.d.ts.map +1 -0
  411. package/types/contexts/FontLanguageContext.d.ts +5 -0
  412. package/types/contexts/FontLanguageContext.d.ts.map +1 -0
  413. package/types/contexts/TextAncestorContext.d.ts +3 -0
  414. package/types/contexts/TextAncestorContext.d.ts.map +1 -0
  415. package/types/createComponent.d.ts +23 -0
  416. package/types/createComponent.d.ts.map +1 -0
  417. package/types/createFont.d.ts +3 -0
  418. package/types/createFont.d.ts.map +1 -0
  419. package/types/createShorthands.d.ts +3 -0
  420. package/types/createShorthands.d.ts.map +1 -0
  421. package/types/createTamagui.d.ts +3 -0
  422. package/types/createTamagui.d.ts.map +1 -0
  423. package/types/createTheme.d.ts +7 -0
  424. package/types/createTheme.d.ts.map +1 -0
  425. package/types/createTokens.d.ts +28 -0
  426. package/types/createTokens.d.ts.map +1 -0
  427. package/types/createVariable.d.ts +26 -0
  428. package/types/createVariable.d.ts.map +1 -0
  429. package/types/createVariables.d.ts +11 -0
  430. package/types/createVariables.d.ts.map +1 -0
  431. package/types/helpers/RNComponents.d.ts +2 -0
  432. package/types/helpers/RNComponents.d.ts.map +1 -0
  433. package/types/helpers/ThemeManager.d.ts +36 -0
  434. package/types/helpers/ThemeManager.d.ts.map +1 -0
  435. package/types/helpers/ThemeManagerContext.d.ts +4 -0
  436. package/types/helpers/ThemeManagerContext.d.ts.map +1 -0
  437. package/types/helpers/createMediaStyle.d.ts +5 -0
  438. package/types/helpers/createMediaStyle.d.ts.map +1 -0
  439. package/types/helpers/createPropMapper.d.ts +7 -0
  440. package/types/helpers/createPropMapper.d.ts.map +1 -0
  441. package/types/helpers/createProxy.d.ts +2 -0
  442. package/types/helpers/createProxy.d.ts.map +1 -0
  443. package/types/helpers/expandStyle.d.ts +6 -0
  444. package/types/helpers/expandStyle.d.ts.map +1 -0
  445. package/types/helpers/expandStyles.d.ts +26 -0
  446. package/types/helpers/expandStyles.d.ts.map +1 -0
  447. package/types/helpers/extendStaticConfig.d.ts +4 -0
  448. package/types/helpers/extendStaticConfig.d.ts.map +1 -0
  449. package/types/helpers/getAnimationDriver.d.ts +6 -0
  450. package/types/helpers/getAnimationDriver.d.ts.map +1 -0
  451. package/types/helpers/getExpandedShorthands.d.ts +3 -0
  452. package/types/helpers/getExpandedShorthands.d.ts.map +1 -0
  453. package/types/helpers/getFontLanguage.d.ts +2 -0
  454. package/types/helpers/getFontLanguage.d.ts.map +1 -0
  455. package/types/helpers/getSplitStyles.d.ts +31 -0
  456. package/types/helpers/getSplitStyles.d.ts.map +1 -0
  457. package/types/helpers/getStylesAtomic.d.ts +18 -0
  458. package/types/helpers/getStylesAtomic.d.ts.map +1 -0
  459. package/types/helpers/getStylesAtomic.native.d.ts +4 -0
  460. package/types/helpers/getStylesAtomic.native.d.ts.map +1 -0
  461. package/types/helpers/getThemeCSSRules.d.ts +8 -0
  462. package/types/helpers/getThemeCSSRules.d.ts.map +1 -0
  463. package/types/helpers/getThemeCSSRules.native.d.ts +2 -0
  464. package/types/helpers/getThemeCSSRules.native.d.ts.map +1 -0
  465. package/types/helpers/getVariantExtras.d.ts +5 -0
  466. package/types/helpers/getVariantExtras.d.ts.map +1 -0
  467. package/types/helpers/insertStyleRule.d.ts +11 -0
  468. package/types/helpers/insertStyleRule.d.ts.map +1 -0
  469. package/types/helpers/isObj.d.ts +2 -0
  470. package/types/helpers/isObj.d.ts.map +1 -0
  471. package/types/helpers/isTamaguiComponent.d.ts +5 -0
  472. package/types/helpers/isTamaguiComponent.d.ts.map +1 -0
  473. package/types/helpers/isTamaguiElement.d.ts +3 -0
  474. package/types/helpers/isTamaguiElement.d.ts.map +1 -0
  475. package/types/helpers/matchMedia.d.ts +6 -0
  476. package/types/helpers/matchMedia.d.ts.map +1 -0
  477. package/types/helpers/matchMedia.native.d.ts +4 -0
  478. package/types/helpers/matchMedia.native.d.ts.map +1 -0
  479. package/types/helpers/mergeProps.d.ts +17 -0
  480. package/types/helpers/mergeProps.d.ts.map +1 -0
  481. package/types/helpers/mergeTransform.d.ts +9 -0
  482. package/types/helpers/mergeTransform.d.ts.map +1 -0
  483. package/types/helpers/normalizeColor.d.ts +4 -0
  484. package/types/helpers/normalizeColor.d.ts.map +1 -0
  485. package/types/helpers/normalizeValueWithProperty.d.ts +7 -0
  486. package/types/helpers/normalizeValueWithProperty.d.ts.map +1 -0
  487. package/types/helpers/proxyThemeVariables.d.ts +2 -0
  488. package/types/helpers/proxyThemeVariables.d.ts.map +1 -0
  489. package/types/helpers/pseudoDescriptors.d.ts +10 -0
  490. package/types/helpers/pseudoDescriptors.d.ts.map +1 -0
  491. package/types/helpers/registerCSSVariable.d.ts +5 -0
  492. package/types/helpers/registerCSSVariable.d.ts.map +1 -0
  493. package/types/helpers/themeable.d.ts +12 -0
  494. package/types/helpers/themeable.d.ts.map +1 -0
  495. package/types/helpers/themes.d.ts +4 -0
  496. package/types/helpers/themes.d.ts.map +1 -0
  497. package/types/helpers/timer.d.ts +2 -0
  498. package/types/helpers/timer.d.ts.map +1 -0
  499. package/types/helpers/useShallowSetState.d.ts +5 -0
  500. package/types/helpers/useShallowSetState.d.ts.map +1 -0
  501. package/types/helpers/warnOnce.d.ts +2 -0
  502. package/types/helpers/warnOnce.d.ts.map +1 -0
  503. package/types/helpers/withStaticProperties.d.ts +2 -0
  504. package/types/helpers/withStaticProperties.d.ts.map +1 -0
  505. package/types/hooks/getThemeUnwrapped.d.ts +3 -0
  506. package/types/hooks/getThemeUnwrapped.d.ts.map +1 -0
  507. package/types/hooks/useId.d.ts +2 -0
  508. package/types/hooks/useId.d.ts.map +1 -0
  509. package/types/hooks/useIsTouchDevice.d.ts +2 -0
  510. package/types/hooks/useIsTouchDevice.d.ts.map +1 -0
  511. package/types/hooks/useMedia.d.ts +33 -0
  512. package/types/hooks/useMedia.d.ts.map +1 -0
  513. package/types/hooks/useSafeRef.d.ts +4 -0
  514. package/types/hooks/useSafeRef.d.ts.map +1 -0
  515. package/types/hooks/useServerHooks.d.ts +4 -0
  516. package/types/hooks/useServerHooks.d.ts.map +1 -0
  517. package/types/hooks/useStyle.d.ts +8 -0
  518. package/types/hooks/useStyle.d.ts.map +1 -0
  519. package/types/hooks/useTheme.d.ts +25 -0
  520. package/types/hooks/useTheme.d.ts.map +1 -0
  521. package/types/hooks/useThemeName.d.ts +5 -0
  522. package/types/hooks/useThemeName.d.ts.map +1 -0
  523. package/types/index.d.ts +56 -0
  524. package/types/index.d.ts.map +1 -0
  525. package/types/inject-styles.d.ts +7 -0
  526. package/types/inject-styles.d.ts.map +1 -0
  527. package/types/insertFont.d.ts +9 -0
  528. package/types/insertFont.d.ts.map +1 -0
  529. package/types/setupHooks.d.ts +14 -0
  530. package/types/setupHooks.d.ts.map +1 -0
  531. package/types/setupReactNative.d.ts +5 -0
  532. package/types/setupReactNative.d.ts.map +1 -0
  533. package/types/styled.d.ts +20 -0
  534. package/types/styled.d.ts.map +1 -0
  535. package/types/types.d.ts +715 -0
  536. package/types/types.d.ts.map +1 -0
  537. package/types/updateTheme.d.ts +30 -0
  538. package/types/updateTheme.d.ts.map +1 -0
  539. package/types/views/FontLanguage.d.ts +4 -0
  540. package/types/views/FontLanguage.d.ts.map +1 -0
  541. package/types/views/FontLanguage.native.d.ts +4 -0
  542. package/types/views/FontLanguage.native.d.ts.map +1 -0
  543. package/types/views/FontLanguage.types.d.ts +11 -0
  544. package/types/views/FontLanguage.types.d.ts.map +1 -0
  545. package/types/views/Slot.d.ts +11 -0
  546. package/types/views/Slot.d.ts.map +1 -0
  547. package/types/views/Stack.d.ts +4 -0
  548. package/types/views/Stack.d.ts.map +1 -0
  549. package/types/views/TamaguiProvider.d.ts +4 -0
  550. package/types/views/TamaguiProvider.d.ts.map +1 -0
  551. package/types/views/Text.d.ts +4 -0
  552. package/types/views/Text.d.ts.map +1 -0
  553. package/types/views/Theme.d.ts +8 -0
  554. package/types/views/Theme.d.ts.map +1 -0
  555. package/types/views/ThemeProvider.d.ts +12 -0
  556. package/types/views/ThemeProvider.d.ts.map +1 -0
@@ -0,0 +1,298 @@
1
+ import { startTransition, useEffect, useMemo, useSyncExternalStore } from 'react'
2
+
3
+ import { getConfig } from '../config'
4
+ import { createProxy } from '../helpers/createProxy'
5
+ import { matchMedia } from '../helpers/matchMedia'
6
+ import {
7
+ MediaQueries,
8
+ MediaQueryKey,
9
+ MediaQueryObject,
10
+ MediaQueryState,
11
+ TamaguiInternalConfig,
12
+ } from '../types'
13
+ import { useSafeRef } from './useSafeRef'
14
+
15
+ export let mediaState: MediaQueryState =
16
+ // development only safeguard
17
+ process.env.NODE_ENV === 'development'
18
+ ? createProxy(
19
+ {},
20
+ {
21
+ get(target, key) {
22
+ if (
23
+ typeof key === 'string' &&
24
+ key[0] === '$' &&
25
+ // dont error on $$typeof
26
+ key[1] !== '$'
27
+ ) {
28
+ throw new Error(`Access mediaState should not use "$": ${key}`)
29
+ }
30
+ return Reflect.get(target, key)
31
+ },
32
+ }
33
+ )
34
+ : ({} as any)
35
+
36
+ export const mediaQueryConfig: MediaQueries = {}
37
+ export const getMedia = () => mediaState
38
+ export const mediaKeysWithAndWithout$ = new Set<string>()
39
+
40
+ // for SSR capture it at time of startup
41
+ let initState: MediaQueryState
42
+ export const getInitialMediaState = () => {
43
+ return (getConfig().disableSSR ? mediaState : initState) || {}
44
+ }
45
+
46
+ let mediaKeysOrdered: string[]
47
+ export const getMediaKeyImportance = (key: string) => {
48
+ if (process.env.NODE_ENV === 'development' && key[0] === '$') {
49
+ throw new Error('use short key')
50
+ }
51
+ // + 2 because we set base usedKeys=1 in getSplitStyles and all media go above 1
52
+ return mediaKeysOrdered.indexOf(key) + 2
53
+ }
54
+
55
+ const dispose = new Set<Function>()
56
+
57
+ export const configureMedia = (config: TamaguiInternalConfig) => {
58
+ const { media, mediaQueryDefaultActive } = config
59
+ if (!media) return
60
+ for (const key in media) {
61
+ mediaState[key] = mediaQueryDefaultActive?.[key] || false
62
+ mediaKeysWithAndWithout$.add(key)
63
+ mediaKeysWithAndWithout$.add(`$${key}`)
64
+ }
65
+ Object.assign(mediaQueryConfig, media)
66
+ initState = { ...mediaState }
67
+ updateCurrentState()
68
+ mediaKeysOrdered = Object.keys(media)
69
+ if (config.disableSSR) {
70
+ setupMediaListeners()
71
+ }
72
+ }
73
+
74
+ function unlisten() {
75
+ dispose.forEach((cb) => cb())
76
+ dispose.clear()
77
+ }
78
+
79
+ /**
80
+ * Note: This should *not* set the state on the first render!
81
+ * Because to avoid hydration issues SSR must match the server
82
+ * *and then* re-render with the actual media query state.
83
+ */
84
+ let configuredKey = ''
85
+ function setupMediaListeners() {
86
+ // avoid setting up more than once per config
87
+ const nextKey = JSON.stringify(mediaQueryConfig)
88
+ if (nextKey === configuredKey) return
89
+ configuredKey = nextKey
90
+
91
+ // hmr, undo existing before re-binding
92
+ unlisten()
93
+
94
+ for (const key in mediaQueryConfig) {
95
+ const str = mediaObjectToString(mediaQueryConfig[key])
96
+ const getMatch = () => matchMedia(str)
97
+ const match = getMatch()
98
+ if (!match) {
99
+ throw new Error('⚠️ No match')
100
+ }
101
+ // react native needs these deprecated apis for now
102
+ match.addListener(update)
103
+ dispose.add(() => {
104
+ match.removeListener(update)
105
+ })
106
+
107
+ update()
108
+
109
+ function update() {
110
+ const next = !!getMatch().matches
111
+ if (next === mediaState[key]) return
112
+ mediaState = { ...mediaState, [key]: next }
113
+ updateCurrentState()
114
+ }
115
+ }
116
+ }
117
+
118
+ export function useMediaListeners(config: TamaguiInternalConfig) {
119
+ if (config.disableSSR) return
120
+ useEffect(() => {
121
+ setupMediaListeners()
122
+ }, [])
123
+ }
124
+
125
+ const listeners = new Set<any>()
126
+ let flushing = false
127
+ function updateCurrentState() {
128
+ if (flushing) return
129
+ flushing = true
130
+ Promise.resolve().then(() => {
131
+ flushing = false
132
+ startTransition(() => {
133
+ listeners.forEach((cb) => cb(mediaState))
134
+ })
135
+ })
136
+ }
137
+
138
+ type MediaKeysState = {
139
+ [key: string]: any
140
+ }
141
+
142
+ type UseMediaState = {
143
+ [key in MediaQueryKey]: boolean
144
+ }
145
+
146
+ type UpdateState = {
147
+ enabled: boolean
148
+ keys: MediaQueryKey[]
149
+ }
150
+
151
+ const shouldUpdate = new WeakMap<any, UpdateState>()
152
+
153
+ export function setMediaShouldUpdate(ref: any, props: UpdateState) {
154
+ return shouldUpdate.set(ref, props)
155
+ }
156
+
157
+ type UseMediaInternalState = {
158
+ prev: MediaKeysState
159
+ touched?: Set<string>
160
+ }
161
+
162
+ function subscribe(subscriber: any) {
163
+ listeners.add(subscriber)
164
+ return () => listeners.delete(subscriber)
165
+ }
166
+
167
+ export function useMedia(uid?: any, debug?: any): UseMediaState {
168
+ const internal = useSafeRef<UseMediaInternalState>(undefined as any)
169
+ if (!internal.current) {
170
+ internal.current = {
171
+ prev: initState,
172
+ }
173
+ }
174
+ const state = useSyncExternalStore<MediaQueryState>(
175
+ subscribe,
176
+ () => {
177
+ const { touched, prev } = internal.current
178
+ const componentState = uid ? shouldUpdate.get(uid) : undefined
179
+ if (componentState?.enabled === false) {
180
+ return prev
181
+ }
182
+
183
+ const testKeys =
184
+ componentState?.keys ??
185
+ ((!componentState || componentState.enabled) && touched ? [...touched] : null)
186
+
187
+ const hasntUpdated = testKeys?.every((key) => mediaState[key] === prev[key])
188
+ if (hasntUpdated) {
189
+ return prev
190
+ }
191
+
192
+ internal.current.prev = mediaState
193
+ return mediaState
194
+ },
195
+ () => initState
196
+ )
197
+
198
+ return useMemo(() => {
199
+ return new Proxy(state, {
200
+ get(_, key) {
201
+ if (typeof key === 'string') {
202
+ internal.current.touched ||= new Set()
203
+ internal.current.touched.add(key)
204
+ }
205
+ return Reflect.get(state, key)
206
+ },
207
+ })
208
+ }, [state])
209
+ }
210
+
211
+ /**
212
+ * Useful for more complex components that need access to the currently active props,
213
+ * accounting for the currently active media queries.
214
+ *
215
+ * Use sparingly, it will loop props and trigger re-render on all media queries.
216
+ *
217
+ * */
218
+ export function useMediaPropsActive<A extends Object>(
219
+ props: A
220
+ ): {
221
+ // remove all media
222
+ [Key in keyof A extends `$${string}` ? never : keyof A]?: A[Key]
223
+ } {
224
+ const media = useMedia()
225
+
226
+ return useMemo(() => {
227
+ const next = {} as A
228
+ const importancesUsed = {}
229
+ const propNames = Object.keys(props)
230
+
231
+ for (let i = propNames.length - 1; i >= 0; i--) {
232
+ const key = propNames[i]
233
+ const val = props[key]
234
+ if (key[0] === '$') {
235
+ const mediaKey = key.slice(1)
236
+ if (!media[mediaKey]) continue
237
+ if (val && typeof val === 'object') {
238
+ const subKeys = Object.keys(val)
239
+ for (let j = subKeys.length; j--; j >= 0) {
240
+ const subKey = subKeys[j]
241
+ mergeMediaByImportance(next, mediaKey, subKey, val[subKey], importancesUsed)
242
+ }
243
+ }
244
+ } else {
245
+ mergeMediaByImportance(next, '', key, val, importancesUsed)
246
+ }
247
+ }
248
+
249
+ return next
250
+ }, [media, props])
251
+ }
252
+
253
+ export const getMediaImportanceIfMoreImportant = (
254
+ mediaKey: string,
255
+ key: string,
256
+ importancesUsed: Record<string, number>
257
+ ) => {
258
+ const importance = getMediaKeyImportance(mediaKey)
259
+ return !importancesUsed[key] || importance > importancesUsed[key] ? importance : null
260
+ }
261
+
262
+ export function mergeMediaByImportance(
263
+ onto: Record<string, any>,
264
+ mediaKey: string,
265
+ key: string,
266
+ value: any,
267
+ importancesUsed: Record<string, number>
268
+ ) {
269
+ const importance = getMediaImportanceIfMoreImportant(mediaKey, key, importancesUsed)
270
+ if (importance === null) {
271
+ return false
272
+ }
273
+ importancesUsed[key] = importance
274
+ onto[key] = value
275
+ return true
276
+ }
277
+
278
+ function camelToHyphen(str: string) {
279
+ return str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`).toLowerCase()
280
+ }
281
+
282
+ export function mediaObjectToString(query: string | MediaQueryObject) {
283
+ if (typeof query === 'string') {
284
+ return query
285
+ }
286
+ return Object.entries(query)
287
+ .map(([feature, value]) => {
288
+ feature = camelToHyphen(feature)
289
+ if (typeof value === 'string') {
290
+ return `(${feature}: ${value})`
291
+ }
292
+ if (typeof value === 'number' && /[height|width]$/.test(feature)) {
293
+ value = `${value}px`
294
+ }
295
+ return `(${feature}: ${value})`
296
+ })
297
+ .join(' and ')
298
+ }
@@ -0,0 +1,45 @@
1
+ import { useIsomorphicLayoutEffect } from '@tamagui/constants'
2
+ import { useRef } from 'react'
3
+
4
+ // dai-shi 🙏
5
+ // https://dev.to/uhyo_/a-concurrent-mode-safe-version-of-useref-1325
6
+ // probably can live without it though to save a bit of b
7
+
8
+ type Raw<T> = {
9
+ hold: boolean
10
+ next: T
11
+ cur: T
12
+ ref: { current: T }
13
+ }
14
+
15
+ export const useSafeRef = <T>(initialValue: T) => {
16
+ const rawRef = useRef<Raw<T>>()
17
+ if (!rawRef.current) {
18
+ rawRef.current = {
19
+ hold: true,
20
+ next: initialValue,
21
+ cur: initialValue,
22
+ ref: {
23
+ get current() {
24
+ return raw.hold ? raw.cur : raw.next
25
+ },
26
+ set current(v) {
27
+ if (!raw.hold) {
28
+ raw.next = v
29
+ }
30
+ raw.cur = v
31
+ },
32
+ },
33
+ }
34
+ }
35
+
36
+ const raw: Raw<T> = rawRef.current
37
+ raw.hold = true
38
+ raw.cur = raw.next
39
+ useIsomorphicLayoutEffect(() => {
40
+ raw.hold = false
41
+ raw.next = raw.cur
42
+ })
43
+
44
+ return raw.ref
45
+ }
@@ -0,0 +1,12 @@
1
+ import { isRSC } from '@tamagui/constants'
2
+ import { useRef, useState } from 'react'
3
+
4
+ export const useServerState = isRSC
5
+ ? (((val: any) => [val, idFn]) as unknown as typeof useState)
6
+ : useState
7
+
8
+ export const useServerRef = isRSC
9
+ ? (((val: any) => ({ current: val })) as unknown as typeof useRef)
10
+ : useRef
11
+
12
+ const idFn = () => {}
@@ -0,0 +1,49 @@
1
+ import { isRSC, isWeb } from '@tamagui/constants'
2
+ import { useContext } from 'react'
3
+
4
+ import { FontLanguageContext } from '../contexts/FontLanguageContext'
5
+ import { TextAncestorContext } from '../contexts/TextAncestorContext'
6
+ import { useSplitStyles } from '../helpers/getSplitStyles'
7
+ import {
8
+ DebugProp,
9
+ GetProps,
10
+ SplitStyleState,
11
+ TamaguiComponent,
12
+ TextNonStyleProps,
13
+ } from '../types'
14
+ import { useMedia } from './useMedia'
15
+ import { useTheme } from './useTheme'
16
+
17
+ export function useStyle<
18
+ Component extends TamaguiComponent,
19
+ StyleProps = Omit<GetProps<Component>, keyof TextNonStyleProps>
20
+ >(
21
+ base: Component,
22
+ style: StyleProps,
23
+ options?: Partial<SplitStyleState> & { debug?: DebugProp }
24
+ ) {
25
+ const isText = base.staticConfig.isText
26
+ const hasTextAncestor = !!(isWeb && isText ? useContext(TextAncestorContext) : false)
27
+ const languageContext = isRSC ? null : useContext(FontLanguageContext)
28
+ const theme = useTheme()
29
+ const media = useMedia()
30
+ const out = useSplitStyles(
31
+ style as any,
32
+ base.staticConfig,
33
+ theme,
34
+ {
35
+ ...(options as any),
36
+ mediaState: media,
37
+ hasTextAncestor,
38
+ resolveVariablesAs: 'auto',
39
+ },
40
+ null,
41
+ languageContext || undefined,
42
+ isText ? 'span' : 'div',
43
+ options?.debug
44
+ )
45
+ return {
46
+ style: Object.keys(out.style).length ? out.style : null,
47
+ classNames: out.classNames,
48
+ }
49
+ }
@@ -0,0 +1,274 @@
1
+ /* eslint-disable no-console */
2
+ import { isClient, isRSC, isServer, isWeb } from '@tamagui/constants'
3
+ import { useContext, useEffect, useMemo, useState } from 'react'
4
+
5
+ import { getConfig } from '../config'
6
+ import { isDevTools } from '../constants/isDevTools'
7
+ import { createProxy } from '../helpers/createProxy'
8
+ import {
9
+ ThemeManager,
10
+ ThemeManagerState,
11
+ hasNoThemeUpdatingProps,
12
+ } from '../helpers/ThemeManager'
13
+ import { ThemeManagerContext } from '../helpers/ThemeManagerContext'
14
+ import { ThemeParsed, ThemeProps } from '../types'
15
+ import { GetThemeUnwrapped } from './getThemeUnwrapped'
16
+ import { useServerRef } from './useServerHooks'
17
+
18
+ export type ChangedThemeResponse = {
19
+ themeManager: ThemeManager | null
20
+ name: string
21
+ isNewTheme?: boolean
22
+ theme?: ThemeParsed | null
23
+ className?: string
24
+ }
25
+
26
+ const emptyProps = { name: null }
27
+
28
+ function getDefaultThemeProxied() {
29
+ const config = getConfig()
30
+ const name = Object.keys(config.themes)[0]
31
+ return getThemeProxied({
32
+ theme: config.themes[name],
33
+ name,
34
+ })
35
+ }
36
+
37
+ export const useTheme = (props: ThemeProps = emptyProps): ThemeParsed => {
38
+ return (isRSC ? null : useThemeWithState(props)?.theme) || getDefaultThemeProxied()
39
+ }
40
+
41
+ export const useThemeWithState = (props: ThemeProps) => {
42
+ const keys = useServerRef([])
43
+
44
+ const changedTheme = useChangeThemeEffect(
45
+ props,
46
+ false,
47
+ isClient
48
+ ? () => {
49
+ return props.shouldUpdate?.() ?? keys.current.length === 0
50
+ }
51
+ : undefined
52
+ )
53
+
54
+ const { themeManager, isNewTheme, theme, name, className } = changedTheme
55
+
56
+ if (process.env.NODE_ENV === 'development') {
57
+ // ensure we aren't creating too many ThemeManagers
58
+ // prettier-ignore
59
+ if (isWeb && isNewTheme && className === themeManager?.parentManager?.state.className) {
60
+ console.error('Should always change, duplicating ThemeMananger bug', themeManager)
61
+ }
62
+ if (props.debug === 'verbose') {
63
+ console.groupCollapsed(' 🔹 useTheme =>', name)
64
+ const logs = { ...props, name, className, ...(isDevTools && { theme }) }
65
+ for (const key in logs) {
66
+ console.log(' ', key, logs[key])
67
+ }
68
+ console.groupEnd()
69
+ }
70
+ }
71
+
72
+ if (!changedTheme.theme) {
73
+ if (process.env.NODE_ENV === 'development') {
74
+ console.warn('No theme found', name, props, themeManager)
75
+ }
76
+ return null
77
+ }
78
+
79
+ const proxiedTheme = useMemo(() => {
80
+ return getThemeProxied(changedTheme as any)
81
+ }, [theme, isNewTheme, name, className, themeManager])
82
+
83
+ return {
84
+ ...changedTheme,
85
+ theme: proxiedTheme,
86
+ }
87
+ }
88
+
89
+ export function getThemeProxied({
90
+ theme,
91
+ themeManager,
92
+ keys,
93
+ }: Partial<ChangedThemeResponse> & {
94
+ theme: ThemeParsed
95
+ keys?: React.RefObject<string[]>
96
+ }) {
97
+ return createProxy(theme, {
98
+ has(_, key) {
99
+ if (typeof key === 'string') {
100
+ if (key[0] === '$') key = key.slice(1)
101
+ return themeManager?.allKeys.has(key)
102
+ }
103
+ return Reflect.has(theme, key)
104
+ },
105
+ get(_, key) {
106
+ if (key === GetThemeUnwrapped) {
107
+ return theme
108
+ }
109
+ if (
110
+ key === 'undefined' ||
111
+ key === '__proto__' ||
112
+ key === '$typeof' ||
113
+ typeof key !== 'string' ||
114
+ !themeManager
115
+ ) {
116
+ return Reflect.get(_, key)
117
+ }
118
+ const keyString = key
119
+ // auto convert variables to plain
120
+ if (key[0] === '$') {
121
+ key = key.slice(1)
122
+ }
123
+ const val = themeManager.getValue(key)
124
+ const currentKeys = keys?.current
125
+ if (val && currentKeys) {
126
+ return new Proxy(val as any, {
127
+ // when they touch the actual value we only track it
128
+ // if its a variable (web), its ignored!
129
+ get(_, subkey) {
130
+ if (subkey === 'val' && !currentKeys.includes(keyString)) {
131
+ currentKeys.push(keyString)
132
+ }
133
+ return Reflect.get(val as any, subkey)
134
+ },
135
+ })
136
+ }
137
+ return val
138
+ },
139
+ })
140
+ }
141
+
142
+ export const activeThemeManagers = new Set<ThemeManager>()
143
+
144
+ export const useChangeThemeEffect = (
145
+ props: ThemeProps,
146
+ root = false,
147
+ disableUpdate?: () => boolean
148
+ ): ChangedThemeResponse => {
149
+ if (isRSC) {
150
+ // we need context working for this to work well
151
+ return {
152
+ ...createState().state,
153
+ themeManager: null,
154
+ }
155
+ }
156
+ const parentManager = useContext(ThemeManagerContext)
157
+
158
+ const {
159
+ debug,
160
+ // @ts-expect-error internal use only
161
+ disable,
162
+ } = props
163
+
164
+ if (disable) {
165
+ if (!parentManager) throw `❌`
166
+ return {
167
+ ...parentManager.state,
168
+ isNewTheme: false,
169
+ themeManager: parentManager,
170
+ }
171
+ }
172
+
173
+ type State = {
174
+ isNewTheme: boolean
175
+ state: ThemeManagerState
176
+ themeManager: ThemeManager
177
+ mounted?: boolean
178
+ }
179
+
180
+ const [themeState, setThemeState] = useState<State>(createState)
181
+ const { isNewTheme, state, themeManager, mounted } = themeState
182
+
183
+ if (!isServer) {
184
+ useEffect(() => {
185
+ if (disable) return
186
+ // SSR safe inverse (because server can't know prefers scheme)
187
+ // could be done through fancy selectors like how we do prefers-media
188
+ // but may be a bit of explosion of selectors
189
+ if (props.inverse && !mounted) {
190
+ setThemeState({ ...themeState, mounted: true })
191
+ return
192
+ }
193
+ activeThemeManagers.add(themeManager)
194
+ // const disposeChangeListener = parentManager?.onChangeTheme((name, manager) => {
195
+ // // console.log('hi', props, state, name, manager)
196
+ // if (state.theme !== manager.state.theme) {
197
+ // console.warn('now update to', manager.state.name)
198
+ // updateState(manager)
199
+ // }
200
+ // })
201
+ return () => {
202
+ activeThemeManagers.delete(themeManager)
203
+ // disposeChangeListener?.()
204
+ }
205
+ }, [disable, state, isNewTheme, debug])
206
+ }
207
+
208
+ const isInversingOnMount = Boolean(!themeState.mounted && props.inverse)
209
+ const shouldReturnParentState = hasNoThemeUpdatingProps(props) || isInversingOnMount
210
+
211
+ if (shouldReturnParentState) {
212
+ if (!parentManager) throw 'impossible'
213
+ // prettier-ignore
214
+ if (process.env.NODE_ENV === 'development' && props.debug === 'verbose') console.log('useTheme hasNoThemeUpdatingProps', parentManager.state.name, 'isInversingOnMount', isInversingOnMount)
215
+ return {
216
+ ...parentManager.state,
217
+ className: isInversingOnMount ? '' : parentManager.state.className,
218
+ themeManager: parentManager,
219
+ isNewTheme: false,
220
+ }
221
+ }
222
+
223
+ // run inline in render
224
+ updateState()
225
+
226
+ return {
227
+ ...state,
228
+ isNewTheme,
229
+ themeManager,
230
+ }
231
+
232
+ function createState(prev?: State) {
233
+ if (prev && disableUpdate?.()) {
234
+ return prev
235
+ }
236
+ // returns previous theme manager if no change
237
+ const _ = new ThemeManager(props, root ? 'root' : parentManager)
238
+ const isNewTheme = _ !== parentManager
239
+ // prettier-ignore
240
+
241
+ // if (prev?.isNewTheme && _.state.theme !== parentManager?.state.theme) {
242
+ // console.warn('notify')
243
+ // _.notify()
244
+ // }
245
+
246
+ // only inverse relies on this for ssr
247
+ const mounted = !props.inverse ? true : root || prev?.mounted
248
+ return {
249
+ // ThemeManager returns parentManager if no change
250
+ isNewTheme,
251
+ state: { ..._.state },
252
+ themeManager: _,
253
+ mounted,
254
+ }
255
+ }
256
+
257
+ function updateState(updatingManager?: ThemeManager) {
258
+ if (disableUpdate?.()) {
259
+ return
260
+ }
261
+ const manager = updatingManager ?? themeManager
262
+ const next = manager.getState(props, parentManager)
263
+ const shouldChange = manager.getStateShouldChange(next, isNewTheme ? state : null)
264
+ // console.log(`got it`, next, isNewTheme, shouldChange, { ...updatingManager?.state })
265
+ if (shouldChange) {
266
+ setThemeState(createState)
267
+ } else {
268
+ if (!next && parentManager?.state.name !== state.name) {
269
+ // were changing back to parent state
270
+ setThemeState(createState)
271
+ }
272
+ }
273
+ }
274
+ }
@@ -0,0 +1,27 @@
1
+ import { isRSC, useIsomorphicLayoutEffect } from '@tamagui/constants'
2
+ import { useContext, useState } from 'react'
3
+
4
+ import { getConfig } from '../config'
5
+ import { ThemeManagerContext } from '../helpers/ThemeManagerContext'
6
+ import { ThemeName } from '../types'
7
+
8
+ export function useThemeName(opts?: { parent?: true }): ThemeName {
9
+ if (isRSC) {
10
+ const config = getConfig()
11
+ return config.themes[Object.keys(config.themes)[0]] as any
12
+ }
13
+ const manager = useContext(ThemeManagerContext)
14
+ const [name, setName] = useState(manager?.state.name || '')
15
+
16
+ useIsomorphicLayoutEffect(() => {
17
+ if (!manager) return
18
+ setName(manager.state.name)
19
+ return manager.onChangeTheme((next, manager) => {
20
+ const name = opts?.parent ? manager.state.parentName || next : next
21
+ if (!name) return
22
+ setName(name)
23
+ })
24
+ }, [manager?.state.name])
25
+
26
+ return name
27
+ }