@tamagui/web 3.0.0-beta.924.1 → 3.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 (636) hide show
  1. package/dist/cjs/_withNativeStyle.cjs +3 -0
  2. package/dist/cjs/_withNativeStyle.native.cjs +3 -0
  3. package/dist/cjs/_withNativeStyle.native.js +3 -0
  4. package/dist/cjs/_withNativeStyle.native.js.map +1 -1
  5. package/dist/cjs/_withStableStyle.native.cjs +1 -5
  6. package/dist/cjs/_withStableStyle.native.js +1 -5
  7. package/dist/cjs/_withStableStyle.native.js.map +1 -1
  8. package/dist/cjs/config.cjs +6 -3
  9. package/dist/cjs/config.native.cjs +7 -5
  10. package/dist/cjs/config.native.js +7 -5
  11. package/dist/cjs/config.native.js.map +1 -1
  12. package/dist/cjs/contexts/ComponentContext.cjs +1 -0
  13. package/dist/cjs/contexts/ComponentContext.native.cjs +8 -0
  14. package/dist/cjs/contexts/ComponentContext.native.js +8 -0
  15. package/dist/cjs/contexts/ComponentContext.native.js.map +1 -1
  16. package/dist/cjs/createComponent.cjs +46 -32
  17. package/dist/cjs/createComponent.native.cjs +92 -72
  18. package/dist/cjs/createComponent.native.js +92 -72
  19. package/dist/cjs/createComponent.native.js.map +1 -1
  20. package/dist/cjs/createTamagui.cjs +32 -14
  21. package/dist/cjs/createTamagui.native.cjs +33 -19
  22. package/dist/cjs/createTamagui.native.js +33 -19
  23. package/dist/cjs/createTamagui.native.js.map +1 -1
  24. package/dist/cjs/createTokens.native.cjs +1 -5
  25. package/dist/cjs/createTokens.native.js +1 -5
  26. package/dist/cjs/createTokens.native.js.map +1 -1
  27. package/dist/cjs/createVariable.native.cjs +1 -5
  28. package/dist/cjs/createVariable.native.js +1 -5
  29. package/dist/cjs/createVariable.native.js.map +1 -1
  30. package/dist/cjs/createVariables.native.cjs +2 -6
  31. package/dist/cjs/createVariables.native.js +2 -6
  32. package/dist/cjs/createVariables.native.js.map +1 -1
  33. package/dist/cjs/dom/html.cjs +87 -329
  34. package/dist/cjs/dom/html.native.cjs +53 -2
  35. package/dist/cjs/dom/html.native.js +53 -2
  36. package/dist/cjs/dom/html.native.js.map +1 -1
  37. package/dist/cjs/{helpers/timer.native.js → dom/htmlReset.cjs} +6 -12
  38. package/dist/cjs/{helpers/timer.native.cjs → dom/htmlReset.native.cjs} +6 -8
  39. package/dist/cjs/dom/htmlReset.native.js +30 -0
  40. package/dist/cjs/dom/htmlReset.native.js.map +1 -0
  41. package/dist/cjs/dom/htmlRuntime.native.cjs +4 -0
  42. package/dist/cjs/dom/htmlRuntime.native.js +4 -0
  43. package/dist/cjs/dom/htmlRuntime.native.js.map +1 -1
  44. package/dist/cjs/dom/htmlStaticConfig.cjs +44 -0
  45. package/dist/cjs/dom/htmlStaticConfig.native.cjs +46 -0
  46. package/dist/cjs/dom/htmlStaticConfig.native.js +48 -0
  47. package/dist/cjs/dom/htmlStaticConfig.native.js.map +1 -0
  48. package/dist/cjs/dom/primitives.native.cjs +81 -34
  49. package/dist/cjs/dom/primitives.native.js +81 -34
  50. package/dist/cjs/dom/primitives.native.js.map +1 -1
  51. package/dist/cjs/eventHandling.cjs +10 -4
  52. package/dist/cjs/eventHandling.native.cjs +52 -16
  53. package/dist/cjs/eventHandling.native.js +52 -16
  54. package/dist/cjs/eventHandling.native.js.map +1 -1
  55. package/dist/cjs/helpers/NativeTextBinding.cjs +36 -0
  56. package/dist/cjs/helpers/NativeTextBinding.native.cjs +39 -0
  57. package/dist/cjs/helpers/NativeTextBinding.native.js +41 -0
  58. package/dist/cjs/helpers/NativeTextBinding.native.js.map +1 -0
  59. package/dist/cjs/helpers/configVariables.native.cjs +2 -6
  60. package/dist/cjs/helpers/configVariables.native.js +2 -6
  61. package/dist/cjs/helpers/configVariables.native.js.map +1 -1
  62. package/dist/cjs/helpers/createDesignSystem.cjs +14 -10
  63. package/dist/cjs/helpers/createDesignSystem.native.cjs +5 -4
  64. package/dist/cjs/helpers/createDesignSystem.native.js +5 -4
  65. package/dist/cjs/helpers/createDesignSystem.native.js.map +1 -1
  66. package/dist/cjs/helpers/createStyledContext.native.cjs +1 -5
  67. package/dist/cjs/helpers/createStyledContext.native.js +1 -5
  68. package/dist/cjs/helpers/createStyledContext.native.js.map +1 -1
  69. package/dist/cjs/helpers/expandStyle.cjs +45 -1
  70. package/dist/cjs/helpers/expandStyle.native.cjs +38 -2
  71. package/dist/cjs/helpers/expandStyle.native.js +38 -2
  72. package/dist/cjs/helpers/expandStyle.native.js.map +1 -1
  73. package/dist/cjs/helpers/expandStyles.cjs +15 -3
  74. package/dist/cjs/helpers/expandStyles.native.cjs +14 -8
  75. package/dist/cjs/helpers/expandStyles.native.js +14 -8
  76. package/dist/cjs/helpers/expandStyles.native.js.map +1 -1
  77. package/dist/cjs/helpers/fluid.cjs +56 -0
  78. package/dist/cjs/helpers/fluid.native.cjs +58 -0
  79. package/dist/cjs/helpers/fluid.native.js +60 -0
  80. package/dist/cjs/helpers/fluid.native.js.map +1 -0
  81. package/dist/cjs/helpers/formatDiagnostic.native.cjs +2 -6
  82. package/dist/cjs/helpers/formatDiagnostic.native.js +2 -6
  83. package/dist/cjs/helpers/formatDiagnostic.native.js.map +1 -1
  84. package/dist/cjs/helpers/getCSSStylesAtomic.cjs +6 -6
  85. package/dist/cjs/helpers/getSplitStyles.cjs +366 -150
  86. package/dist/cjs/helpers/getSplitStyles.native.cjs +584 -184
  87. package/dist/cjs/helpers/getSplitStyles.native.js +584 -184
  88. package/dist/cjs/helpers/getSplitStyles.native.js.map +1 -1
  89. package/dist/cjs/helpers/getThemeCSSRules.cjs +37 -25
  90. package/dist/cjs/helpers/grammarConfig.cjs +6 -14
  91. package/dist/cjs/helpers/grammarConfig.native.cjs +32 -22
  92. package/dist/cjs/helpers/grammarConfig.native.js +32 -22
  93. package/dist/cjs/helpers/grammarConfig.native.js.map +1 -1
  94. package/dist/cjs/helpers/insertStyleRule.cjs +11 -4
  95. package/dist/cjs/helpers/insertStyleRule.native.cjs +8 -11
  96. package/dist/cjs/helpers/insertStyleRule.native.js +8 -11
  97. package/dist/cjs/helpers/insertStyleRule.native.js.map +1 -1
  98. package/dist/cjs/helpers/isObj.native.cjs +1 -5
  99. package/dist/cjs/helpers/isObj.native.js +1 -5
  100. package/dist/cjs/helpers/isObj.native.js.map +1 -1
  101. package/dist/cjs/helpers/mainThreadPressEvents.native.cjs +48 -100
  102. package/dist/cjs/helpers/mainThreadPressEvents.native.js +48 -100
  103. package/dist/cjs/helpers/mainThreadPressEvents.native.js.map +1 -1
  104. package/dist/cjs/helpers/mergeProps.cjs +18 -21
  105. package/dist/cjs/helpers/mergeProps.native.cjs +20 -23
  106. package/dist/cjs/helpers/mergeProps.native.js +20 -23
  107. package/dist/cjs/helpers/mergeProps.native.js.map +1 -1
  108. package/dist/cjs/helpers/nativeOnlyProps.cjs +0 -1
  109. package/dist/cjs/helpers/nativeOnlyProps.native.cjs +0 -1
  110. package/dist/cjs/helpers/nativeOnlyProps.native.js +0 -1
  111. package/dist/cjs/helpers/nativeOnlyProps.native.js.map +1 -1
  112. package/dist/cjs/helpers/nativeTextMetrics.cjs +74 -0
  113. package/dist/cjs/helpers/nativeTextMetrics.native.cjs +77 -0
  114. package/dist/cjs/helpers/nativeTextMetrics.native.js +79 -0
  115. package/dist/cjs/helpers/nativeTextMetrics.native.js.map +1 -0
  116. package/dist/cjs/helpers/normalizeColor.native.cjs +17 -2
  117. package/dist/cjs/helpers/normalizeColor.native.js +17 -2
  118. package/dist/cjs/helpers/normalizeColor.native.js.map +1 -1
  119. package/dist/cjs/helpers/normalizeValueWithProperty.cjs +2 -1
  120. package/dist/cjs/helpers/normalizeValueWithProperty.native.cjs +3 -6
  121. package/dist/cjs/helpers/normalizeValueWithProperty.native.js +3 -6
  122. package/dist/cjs/helpers/normalizeValueWithProperty.native.js.map +1 -1
  123. package/dist/cjs/helpers/objectIdentityKey.native.cjs +1 -5
  124. package/dist/cjs/helpers/objectIdentityKey.native.js +1 -5
  125. package/dist/cjs/helpers/objectIdentityKey.native.js.map +1 -1
  126. package/dist/cjs/helpers/parseNativeStyle.cjs +187 -0
  127. package/dist/cjs/helpers/parseNativeStyle.native.cjs +6 -4
  128. package/dist/cjs/helpers/parseNativeStyle.native.js +6 -4
  129. package/dist/cjs/helpers/parseNativeStyle.native.js.map +1 -1
  130. package/dist/cjs/helpers/proxyThemeToParents.cjs +9 -2
  131. package/dist/cjs/helpers/proxyThemeToParents.native.cjs +28 -2
  132. package/dist/cjs/helpers/proxyThemeToParents.native.js +28 -2
  133. package/dist/cjs/helpers/proxyThemeToParents.native.js.map +1 -1
  134. package/dist/cjs/helpers/resolveAnimationDriver.native.cjs +1 -5
  135. package/dist/cjs/helpers/resolveAnimationDriver.native.js +1 -5
  136. package/dist/cjs/helpers/resolveAnimationDriver.native.js.map +1 -1
  137. package/dist/cjs/helpers/{timer.cjs → resolveNativeUnits.cjs} +12 -8
  138. package/dist/cjs/helpers/resolveNativeUnits.native.cjs +205 -0
  139. package/dist/cjs/helpers/resolveNativeUnits.native.js +207 -0
  140. package/dist/cjs/helpers/resolveNativeUnits.native.js.map +1 -0
  141. package/dist/cjs/helpers/resolveRem.native.cjs +18 -21
  142. package/dist/cjs/helpers/resolveRem.native.js +18 -21
  143. package/dist/cjs/helpers/resolveRem.native.js.map +1 -1
  144. package/dist/cjs/helpers/resolveSizing.cjs +124 -0
  145. package/dist/cjs/helpers/resolveSizing.native.cjs +133 -0
  146. package/dist/cjs/helpers/resolveSizing.native.js +135 -0
  147. package/dist/cjs/helpers/resolveSizing.native.js.map +1 -0
  148. package/dist/cjs/helpers/resolveVariableValue.cjs +7 -7
  149. package/dist/cjs/helpers/resolveVariableValue.native.cjs +7 -9
  150. package/dist/cjs/helpers/resolveVariableValue.native.js +7 -9
  151. package/dist/cjs/helpers/resolveVariableValue.native.js.map +1 -1
  152. package/dist/cjs/helpers/resolveVariantStyle.native.cjs +2 -6
  153. package/dist/cjs/helpers/resolveVariantStyle.native.js +2 -6
  154. package/dist/cjs/helpers/resolveVariantStyle.native.js.map +1 -1
  155. package/dist/cjs/helpers/skipProps.cjs +0 -1
  156. package/dist/cjs/helpers/skipProps.native.cjs +0 -1
  157. package/dist/cjs/helpers/skipProps.native.js +0 -1
  158. package/dist/cjs/helpers/skipProps.native.js.map +1 -1
  159. package/dist/cjs/helpers/styleFrontend.cjs +23 -1
  160. package/dist/cjs/helpers/styleFrontend.native.cjs +23 -1
  161. package/dist/cjs/helpers/styleFrontend.native.js +23 -1
  162. package/dist/cjs/helpers/styleFrontend.native.js.map +1 -1
  163. package/dist/cjs/helpers/styleStaticConfigCore.cjs +5 -4
  164. package/dist/cjs/helpers/styleStaticConfigCore.native.cjs +7 -4
  165. package/dist/cjs/helpers/styleStaticConfigCore.native.js +7 -4
  166. package/dist/cjs/helpers/styleStaticConfigCore.native.js.map +1 -1
  167. package/dist/cjs/helpers/styledDynamic.cjs +5 -0
  168. package/dist/cjs/helpers/styledDynamic.native.cjs +8 -7
  169. package/dist/cjs/helpers/styledDynamic.native.js +8 -7
  170. package/dist/cjs/helpers/styledDynamic.native.js.map +1 -1
  171. package/dist/cjs/helpers/subscribeToContextGroup.cjs +16 -7
  172. package/dist/cjs/helpers/subscribeToContextGroup.native.cjs +18 -8
  173. package/dist/cjs/helpers/subscribeToContextGroup.native.js +18 -8
  174. package/dist/cjs/helpers/subscribeToContextGroup.native.js.map +1 -1
  175. package/dist/cjs/helpers/themeRef.native.cjs +1 -5
  176. package/dist/cjs/helpers/themeRef.native.js +1 -5
  177. package/dist/cjs/helpers/themeRef.native.js.map +1 -1
  178. package/dist/cjs/helpers/themes.cjs +26 -11
  179. package/dist/cjs/helpers/themes.native.cjs +26 -11
  180. package/dist/cjs/helpers/themes.native.js +26 -11
  181. package/dist/cjs/helpers/themes.native.js.map +1 -1
  182. package/dist/cjs/helpers/tokenCategories.cjs +2 -2
  183. package/dist/cjs/helpers/tokenCategories.native.cjs +2 -2
  184. package/dist/cjs/helpers/tokenCategories.native.js +2 -2
  185. package/dist/cjs/helpers/tokenCategories.native.js.map +1 -1
  186. package/dist/cjs/helpers/variables.cjs +1 -1
  187. package/dist/cjs/helpers/variables.native.cjs +4 -8
  188. package/dist/cjs/helpers/variables.native.js +4 -8
  189. package/dist/cjs/helpers/variables.native.js.map +1 -1
  190. package/dist/cjs/helpers/warnOnce.cjs +6 -0
  191. package/dist/cjs/helpers/warnOnce.native.cjs +6 -0
  192. package/dist/cjs/helpers/warnOnce.native.js +6 -0
  193. package/dist/cjs/helpers/warnOnce.native.js.map +1 -1
  194. package/dist/cjs/helpers/webPropsToSkip.native.cjs +3 -3
  195. package/dist/cjs/helpers/webPropsToSkip.native.js +3 -3
  196. package/dist/cjs/helpers/webPropsToSkip.native.js.map +1 -1
  197. package/dist/cjs/helpers/wrapStyleTags.cjs +1 -1
  198. package/dist/cjs/helpers/wrapStyleTags.native.cjs +1 -1
  199. package/dist/cjs/helpers/wrapStyleTags.native.js +1 -1
  200. package/dist/cjs/helpers/wrapStyleTags.native.js.map +1 -1
  201. package/dist/cjs/hooks/useComponentState.native.cjs +1 -5
  202. package/dist/cjs/hooks/useComponentState.native.js +1 -5
  203. package/dist/cjs/hooks/useComponentState.native.js.map +1 -1
  204. package/dist/cjs/hooks/useMedia.cjs +27 -34
  205. package/dist/cjs/hooks/useMedia.native.cjs +45 -51
  206. package/dist/cjs/hooks/useMedia.native.js +45 -51
  207. package/dist/cjs/hooks/useMedia.native.js.map +1 -1
  208. package/dist/cjs/hooks/useSplitStyles.cjs +1 -1
  209. package/dist/cjs/hooks/useSplitStyles.native.cjs +1 -1
  210. package/dist/cjs/hooks/useSplitStyles.native.js +1 -1
  211. package/dist/cjs/hooks/useSplitStyles.native.js.map +1 -1
  212. package/dist/cjs/hooks/useThemeState.cjs +37 -47
  213. package/dist/cjs/hooks/useThemeState.native.cjs +44 -50
  214. package/dist/cjs/hooks/useThemeState.native.js +44 -50
  215. package/dist/cjs/hooks/useThemeState.native.js.map +1 -1
  216. package/dist/cjs/index.cjs +7 -0
  217. package/dist/cjs/index.native.cjs +7 -0
  218. package/dist/cjs/index.native.js +7 -0
  219. package/dist/cjs/index.native.js.map +1 -1
  220. package/dist/cjs/internal-runtime.cjs +22 -0
  221. package/dist/cjs/internal-runtime.native.cjs +22 -0
  222. package/dist/cjs/internal-runtime.native.js +22 -0
  223. package/dist/cjs/internal-runtime.native.js.map +1 -1
  224. package/dist/cjs/static-resolve.native.cjs +2 -9
  225. package/dist/cjs/static-resolve.native.js +2 -9
  226. package/dist/cjs/static-resolve.native.js.map +1 -1
  227. package/dist/cjs/style.cjs +1 -1
  228. package/dist/cjs/style.native.cjs +4 -7
  229. package/dist/cjs/style.native.js +4 -7
  230. package/dist/cjs/style.native.js.map +1 -1
  231. package/dist/cjs/views/Theme.cjs +10 -17
  232. package/dist/cjs/views/Theme.native.cjs +9 -11
  233. package/dist/cjs/views/Theme.native.js +9 -11
  234. package/dist/cjs/views/Theme.native.js.map +1 -1
  235. package/dist/cjs/views/ThemeDebug.cjs +1 -1
  236. package/dist/cjs/views/ThemeUpdate.cjs +1 -1
  237. package/dist/cjs/views/ThemeUpdate.native.cjs +1 -1
  238. package/dist/cjs/views/ThemeUpdate.native.js +1 -1
  239. package/dist/cjs/views/ThemeUpdate.native.js.map +1 -1
  240. package/dist/esm/_withNativeStyle.mjs +4 -1
  241. package/dist/esm/_withNativeStyle.mjs.map +1 -1
  242. package/dist/esm/_withNativeStyle.native.js +4 -1
  243. package/dist/esm/_withNativeStyle.native.js.map +1 -1
  244. package/dist/esm/_withStableStyle.native.js +1 -5
  245. package/dist/esm/_withStableStyle.native.js.map +1 -1
  246. package/dist/esm/config.mjs +6 -3
  247. package/dist/esm/config.mjs.map +1 -1
  248. package/dist/esm/config.native.js +7 -5
  249. package/dist/esm/config.native.js.map +1 -1
  250. package/dist/esm/contexts/ComponentContext.mjs +9 -9
  251. package/dist/esm/contexts/ComponentContext.mjs.map +1 -1
  252. package/dist/esm/contexts/ComponentContext.native.js +16 -9
  253. package/dist/esm/contexts/ComponentContext.native.js.map +1 -1
  254. package/dist/esm/createComponent.mjs +45 -42
  255. package/dist/esm/createComponent.mjs.map +1 -1
  256. package/dist/esm/createComponent.native.js +93 -82
  257. package/dist/esm/createComponent.native.js.map +1 -1
  258. package/dist/esm/createTamagui.mjs +33 -15
  259. package/dist/esm/createTamagui.mjs.map +1 -1
  260. package/dist/esm/createTamagui.native.js +34 -20
  261. package/dist/esm/createTamagui.native.js.map +1 -1
  262. package/dist/esm/createTokens.native.js +1 -5
  263. package/dist/esm/createTokens.native.js.map +1 -1
  264. package/dist/esm/createVariable.native.js +1 -5
  265. package/dist/esm/createVariable.native.js.map +1 -1
  266. package/dist/esm/createVariables.native.js +2 -6
  267. package/dist/esm/createVariables.native.js.map +1 -1
  268. package/dist/esm/dom/html.mjs +87 -329
  269. package/dist/esm/dom/html.mjs.map +1 -1
  270. package/dist/esm/dom/html.native.js +53 -2
  271. package/dist/esm/dom/html.native.js.map +1 -1
  272. package/dist/esm/dom/htmlReset.mjs +6 -0
  273. package/dist/esm/dom/htmlReset.mjs.map +1 -0
  274. package/dist/esm/dom/htmlReset.native.js +6 -0
  275. package/dist/esm/dom/htmlReset.native.js.map +1 -0
  276. package/dist/esm/dom/htmlRuntime.native.js +4 -0
  277. package/dist/esm/dom/htmlRuntime.native.js.map +1 -1
  278. package/dist/esm/dom/htmlStaticConfig.mjs +22 -0
  279. package/dist/esm/dom/htmlStaticConfig.mjs.map +1 -0
  280. package/dist/esm/dom/htmlStaticConfig.native.js +22 -0
  281. package/dist/esm/dom/htmlStaticConfig.native.js.map +1 -0
  282. package/dist/esm/dom/primitives.native.js +81 -34
  283. package/dist/esm/dom/primitives.native.js.map +1 -1
  284. package/dist/esm/eventHandling.mjs +10 -4
  285. package/dist/esm/eventHandling.mjs.map +1 -1
  286. package/dist/esm/eventHandling.native.js +52 -16
  287. package/dist/esm/eventHandling.native.js.map +1 -1
  288. package/dist/esm/helpers/NativeTextBinding.mjs +17 -0
  289. package/dist/esm/helpers/NativeTextBinding.mjs.map +1 -0
  290. package/dist/esm/helpers/NativeTextBinding.native.js +18 -0
  291. package/dist/esm/helpers/NativeTextBinding.native.js.map +1 -0
  292. package/dist/esm/helpers/configVariables.native.js +2 -6
  293. package/dist/esm/helpers/configVariables.native.js.map +1 -1
  294. package/dist/esm/helpers/createDesignSystem.mjs +14 -10
  295. package/dist/esm/helpers/createDesignSystem.mjs.map +1 -1
  296. package/dist/esm/helpers/createDesignSystem.native.js +4 -4
  297. package/dist/esm/helpers/createDesignSystem.native.js.map +1 -1
  298. package/dist/esm/helpers/createStyledContext.native.js +1 -5
  299. package/dist/esm/helpers/createStyledContext.native.js.map +1 -1
  300. package/dist/esm/helpers/expandStyle.mjs +41 -1
  301. package/dist/esm/helpers/expandStyle.mjs.map +1 -1
  302. package/dist/esm/helpers/expandStyle.native.js +36 -3
  303. package/dist/esm/helpers/expandStyle.native.js.map +1 -1
  304. package/dist/esm/helpers/expandStyles.mjs +15 -3
  305. package/dist/esm/helpers/expandStyles.mjs.map +1 -1
  306. package/dist/esm/helpers/expandStyles.native.js +14 -8
  307. package/dist/esm/helpers/expandStyles.native.js.map +1 -1
  308. package/dist/esm/helpers/fluid.mjs +36 -0
  309. package/dist/esm/helpers/fluid.mjs.map +1 -0
  310. package/dist/esm/helpers/fluid.native.js +36 -0
  311. package/dist/esm/helpers/fluid.native.js.map +1 -0
  312. package/dist/esm/helpers/formatDiagnostic.native.js +2 -6
  313. package/dist/esm/helpers/formatDiagnostic.native.js.map +1 -1
  314. package/dist/esm/helpers/getCSSStylesAtomic.mjs +6 -6
  315. package/dist/esm/helpers/getCSSStylesAtomic.mjs.map +1 -1
  316. package/dist/esm/helpers/getSplitStyles.mjs +364 -150
  317. package/dist/esm/helpers/getSplitStyles.mjs.map +1 -1
  318. package/dist/esm/helpers/getSplitStyles.native.js +588 -188
  319. package/dist/esm/helpers/getSplitStyles.native.js.map +1 -1
  320. package/dist/esm/helpers/getThemeCSSRules.mjs +37 -25
  321. package/dist/esm/helpers/getThemeCSSRules.mjs.map +1 -1
  322. package/dist/esm/helpers/grammarConfig.mjs +6 -14
  323. package/dist/esm/helpers/grammarConfig.mjs.map +1 -1
  324. package/dist/esm/helpers/grammarConfig.native.js +32 -22
  325. package/dist/esm/helpers/grammarConfig.native.js.map +1 -1
  326. package/dist/esm/helpers/insertStyleRule.mjs +11 -4
  327. package/dist/esm/helpers/insertStyleRule.mjs.map +1 -1
  328. package/dist/esm/helpers/insertStyleRule.native.js +4 -4
  329. package/dist/esm/helpers/insertStyleRule.native.js.map +1 -1
  330. package/dist/esm/helpers/isObj.native.js +1 -5
  331. package/dist/esm/helpers/isObj.native.js.map +1 -1
  332. package/dist/esm/helpers/mainThreadPressEvents.native.js +48 -100
  333. package/dist/esm/helpers/mainThreadPressEvents.native.js.map +1 -1
  334. package/dist/esm/helpers/mergeProps.mjs +18 -21
  335. package/dist/esm/helpers/mergeProps.mjs.map +1 -1
  336. package/dist/esm/helpers/mergeProps.native.js +20 -23
  337. package/dist/esm/helpers/mergeProps.native.js.map +1 -1
  338. package/dist/esm/helpers/nativeOnlyProps.mjs +0 -1
  339. package/dist/esm/helpers/nativeOnlyProps.mjs.map +1 -1
  340. package/dist/esm/helpers/nativeOnlyProps.native.js +0 -1
  341. package/dist/esm/helpers/nativeOnlyProps.native.js.map +1 -1
  342. package/dist/esm/helpers/nativeTextMetrics.mjs +55 -0
  343. package/dist/esm/helpers/nativeTextMetrics.mjs.map +1 -0
  344. package/dist/esm/helpers/nativeTextMetrics.native.js +56 -0
  345. package/dist/esm/helpers/nativeTextMetrics.native.js.map +1 -0
  346. package/dist/esm/helpers/normalizeColor.native.js +17 -2
  347. package/dist/esm/helpers/normalizeColor.native.js.map +1 -1
  348. package/dist/esm/helpers/normalizeValueWithProperty.mjs +2 -1
  349. package/dist/esm/helpers/normalizeValueWithProperty.mjs.map +1 -1
  350. package/dist/esm/helpers/normalizeValueWithProperty.native.js +3 -6
  351. package/dist/esm/helpers/normalizeValueWithProperty.native.js.map +1 -1
  352. package/dist/esm/helpers/objectIdentityKey.native.js +1 -5
  353. package/dist/esm/helpers/objectIdentityKey.native.js.map +1 -1
  354. package/dist/esm/helpers/parseNativeStyle.mjs +168 -0
  355. package/dist/esm/helpers/parseNativeStyle.mjs.map +1 -0
  356. package/dist/esm/helpers/parseNativeStyle.native.js +4 -1
  357. package/dist/esm/helpers/parseNativeStyle.native.js.map +1 -1
  358. package/dist/esm/helpers/proxyThemeToParents.mjs +10 -2
  359. package/dist/esm/helpers/proxyThemeToParents.mjs.map +1 -1
  360. package/dist/esm/helpers/proxyThemeToParents.native.js +29 -2
  361. package/dist/esm/helpers/proxyThemeToParents.native.js.map +1 -1
  362. package/dist/esm/helpers/resolveAnimationDriver.native.js +1 -5
  363. package/dist/esm/helpers/resolveAnimationDriver.native.js.map +1 -1
  364. package/dist/esm/helpers/resolveNativeUnits.mjs +9 -0
  365. package/dist/esm/helpers/resolveNativeUnits.mjs.map +1 -0
  366. package/dist/esm/helpers/resolveNativeUnits.native.js +178 -0
  367. package/dist/esm/helpers/resolveNativeUnits.native.js.map +1 -0
  368. package/dist/esm/helpers/resolveRem.native.js +18 -21
  369. package/dist/esm/helpers/resolveRem.native.js.map +1 -1
  370. package/dist/esm/helpers/resolveSizing.mjs +102 -0
  371. package/dist/esm/helpers/resolveSizing.mjs.map +1 -0
  372. package/dist/esm/helpers/resolveSizing.native.js +109 -0
  373. package/dist/esm/helpers/resolveSizing.native.js.map +1 -0
  374. package/dist/esm/helpers/resolveVariableValue.mjs +7 -7
  375. package/dist/esm/helpers/resolveVariableValue.mjs.map +1 -1
  376. package/dist/esm/helpers/resolveVariableValue.native.js +7 -9
  377. package/dist/esm/helpers/resolveVariableValue.native.js.map +1 -1
  378. package/dist/esm/helpers/resolveVariantStyle.native.js +2 -6
  379. package/dist/esm/helpers/resolveVariantStyle.native.js.map +1 -1
  380. package/dist/esm/helpers/skipProps.mjs +0 -1
  381. package/dist/esm/helpers/skipProps.mjs.map +1 -1
  382. package/dist/esm/helpers/skipProps.native.js +0 -1
  383. package/dist/esm/helpers/skipProps.native.js.map +1 -1
  384. package/dist/esm/helpers/styleFrontend.mjs +20 -1
  385. package/dist/esm/helpers/styleFrontend.mjs.map +1 -1
  386. package/dist/esm/helpers/styleFrontend.native.js +20 -1
  387. package/dist/esm/helpers/styleFrontend.native.js.map +1 -1
  388. package/dist/esm/helpers/styleStaticConfigCore.mjs +5 -4
  389. package/dist/esm/helpers/styleStaticConfigCore.mjs.map +1 -1
  390. package/dist/esm/helpers/styleStaticConfigCore.native.js +7 -4
  391. package/dist/esm/helpers/styleStaticConfigCore.native.js.map +1 -1
  392. package/dist/esm/helpers/styledDynamic.mjs +5 -0
  393. package/dist/esm/helpers/styledDynamic.mjs.map +1 -1
  394. package/dist/esm/helpers/styledDynamic.native.js +8 -7
  395. package/dist/esm/helpers/styledDynamic.native.js.map +1 -1
  396. package/dist/esm/helpers/subscribeToContextGroup.mjs +16 -7
  397. package/dist/esm/helpers/subscribeToContextGroup.mjs.map +1 -1
  398. package/dist/esm/helpers/subscribeToContextGroup.native.js +18 -8
  399. package/dist/esm/helpers/subscribeToContextGroup.native.js.map +1 -1
  400. package/dist/esm/helpers/themeRef.native.js +1 -5
  401. package/dist/esm/helpers/themeRef.native.js.map +1 -1
  402. package/dist/esm/helpers/themes.mjs +20 -11
  403. package/dist/esm/helpers/themes.mjs.map +1 -1
  404. package/dist/esm/helpers/themes.native.js +20 -11
  405. package/dist/esm/helpers/themes.native.js.map +1 -1
  406. package/dist/esm/helpers/tokenCategories.mjs +2 -2
  407. package/dist/esm/helpers/tokenCategories.mjs.map +1 -1
  408. package/dist/esm/helpers/tokenCategories.native.js +2 -2
  409. package/dist/esm/helpers/tokenCategories.native.js.map +1 -1
  410. package/dist/esm/helpers/variables.mjs +1 -1
  411. package/dist/esm/helpers/variables.mjs.map +1 -1
  412. package/dist/esm/helpers/variables.native.js +4 -8
  413. package/dist/esm/helpers/variables.native.js.map +1 -1
  414. package/dist/esm/helpers/warnOnce.mjs +6 -1
  415. package/dist/esm/helpers/warnOnce.mjs.map +1 -1
  416. package/dist/esm/helpers/warnOnce.native.js +6 -1
  417. package/dist/esm/helpers/warnOnce.native.js.map +1 -1
  418. package/dist/esm/helpers/webPropsToSkip.native.js +3 -3
  419. package/dist/esm/helpers/webPropsToSkip.native.js.map +1 -1
  420. package/dist/esm/helpers/wrapStyleTags.mjs +1 -1
  421. package/dist/esm/helpers/wrapStyleTags.mjs.map +1 -1
  422. package/dist/esm/helpers/wrapStyleTags.native.js +1 -1
  423. package/dist/esm/helpers/wrapStyleTags.native.js.map +1 -1
  424. package/dist/esm/hooks/useComponentState.native.js +1 -5
  425. package/dist/esm/hooks/useComponentState.native.js.map +1 -1
  426. package/dist/esm/hooks/useMedia.mjs +27 -34
  427. package/dist/esm/hooks/useMedia.mjs.map +1 -1
  428. package/dist/esm/hooks/useMedia.native.js +45 -51
  429. package/dist/esm/hooks/useMedia.native.js.map +1 -1
  430. package/dist/esm/hooks/useSplitStyles.mjs +1 -1
  431. package/dist/esm/hooks/useSplitStyles.mjs.map +1 -1
  432. package/dist/esm/hooks/useSplitStyles.native.js +1 -1
  433. package/dist/esm/hooks/useSplitStyles.native.js.map +1 -1
  434. package/dist/esm/hooks/useThemeState.mjs +36 -48
  435. package/dist/esm/hooks/useThemeState.mjs.map +1 -1
  436. package/dist/esm/hooks/useThemeState.native.js +44 -50
  437. package/dist/esm/hooks/useThemeState.native.js.map +1 -1
  438. package/dist/esm/index.js +4 -1
  439. package/dist/esm/index.mjs +4 -1
  440. package/dist/esm/index.native.js +4 -1
  441. package/dist/esm/internal-runtime.mjs +22 -3
  442. package/dist/esm/internal-runtime.mjs.map +1 -1
  443. package/dist/esm/internal-runtime.native.js +22 -3
  444. package/dist/esm/internal-runtime.native.js.map +1 -1
  445. package/dist/esm/static-resolve.native.js +2 -9
  446. package/dist/esm/static-resolve.native.js.map +1 -1
  447. package/dist/esm/style.mjs +1 -1
  448. package/dist/esm/style.mjs.map +1 -1
  449. package/dist/esm/style.native.js +4 -7
  450. package/dist/esm/style.native.js.map +1 -1
  451. package/dist/esm/views/Theme.mjs +15 -14
  452. package/dist/esm/views/Theme.mjs.map +1 -1
  453. package/dist/esm/views/Theme.native.js +15 -15
  454. package/dist/esm/views/Theme.native.js.map +1 -1
  455. package/dist/esm/views/ThemeDebug.mjs +1 -1
  456. package/dist/esm/views/ThemeDebug.mjs.map +1 -1
  457. package/dist/esm/views/ThemeUpdate.mjs +1 -1
  458. package/dist/esm/views/ThemeUpdate.mjs.map +1 -1
  459. package/dist/esm/views/ThemeUpdate.native.js +1 -1
  460. package/dist/esm/views/ThemeUpdate.native.js.map +1 -1
  461. package/package.json +20 -18
  462. package/reset.css +11 -0
  463. package/src/_withNativeStyle.tsx +6 -1
  464. package/src/config.ts +6 -6
  465. package/src/contexts/ComponentContext.tsx +8 -0
  466. package/src/createComponent.tsx +177 -57
  467. package/src/createStyledHOC.tsx +25 -26
  468. package/src/createTamagui.ts +47 -28
  469. package/src/dom/contract.ts +4 -1
  470. package/src/dom/html.native.tsx +55 -2
  471. package/src/dom/html.tsx +189 -388
  472. package/src/dom/htmlReset.ts +15 -0
  473. package/src/dom/htmlRuntime.native.tsx +5 -0
  474. package/src/dom/htmlStaticConfig.ts +40 -0
  475. package/src/dom/primitives.native.tsx +138 -33
  476. package/src/dom/standalone.ts +2 -1
  477. package/src/dom/styleTypes.ts +82 -92
  478. package/src/eventHandling.native.ts +61 -11
  479. package/src/eventHandling.ts +19 -4
  480. package/src/helpers/NativeTextBinding.tsx +26 -0
  481. package/src/helpers/createDesignSystem.ts +24 -8
  482. package/src/helpers/expandStyle.ts +88 -4
  483. package/src/helpers/expandStyles.ts +6 -11
  484. package/src/helpers/fluid.ts +66 -0
  485. package/src/helpers/getCSSStylesAtomic.ts +11 -6
  486. package/src/helpers/getSplitStyles.tsx +1032 -296
  487. package/src/helpers/getThemeCSSRules.ts +73 -35
  488. package/src/helpers/grammarConfig.ts +23 -8
  489. package/src/helpers/insertStyleRule.tsx +14 -8
  490. package/src/helpers/mainThreadPressEvents.native.ts +65 -141
  491. package/src/helpers/mergeProps.ts +29 -62
  492. package/src/helpers/nativeOnlyProps.ts +0 -1
  493. package/src/helpers/nativeTextMetrics.ts +77 -0
  494. package/src/helpers/normalizeColor.native.ts +29 -4
  495. package/src/helpers/normalizeValueWithProperty.ts +2 -1
  496. package/src/helpers/{parseNativeStyle.native.ts → parseNativeStyle.ts} +8 -1
  497. package/src/helpers/proxyThemeToParents.ts +13 -2
  498. package/src/helpers/resolveNativeUnits.native.ts +247 -0
  499. package/src/helpers/resolveNativeUnits.ts +10 -0
  500. package/src/helpers/resolveRem.native.ts +25 -26
  501. package/src/helpers/resolveSizing.ts +167 -0
  502. package/src/helpers/resolveVariableValue.ts +21 -17
  503. package/src/helpers/skipProps.ts +0 -1
  504. package/src/helpers/styleFrontend.ts +39 -0
  505. package/src/helpers/styleProvenance.ts +1 -1
  506. package/src/helpers/styleStaticConfigCore.ts +15 -4
  507. package/src/helpers/styledDynamic.ts +3 -1
  508. package/src/helpers/subscribeToContextGroup.tsx +16 -7
  509. package/src/helpers/themes.ts +27 -11
  510. package/src/helpers/tokenCategories.ts +15 -3
  511. package/src/helpers/variables.ts +2 -2
  512. package/src/helpers/warnOnce.ts +6 -0
  513. package/src/helpers/webPropsToSkip.native.ts +9 -3
  514. package/src/helpers/wrapStyleTags.tsx +4 -1
  515. package/src/hooks/useMedia.tsx +36 -47
  516. package/src/hooks/useSplitStyles.tsx +4 -1
  517. package/src/hooks/useThemeState.ts +69 -74
  518. package/src/index.ts +13 -0
  519. package/src/interfaces/RNExclusiveTypes.ts +1 -3
  520. package/src/internal-runtime.ts +43 -2
  521. package/src/style.ts +4 -1
  522. package/src/styled.tsx +34 -3
  523. package/src/types.tsx +412 -132
  524. package/src/views/Theme.tsx +18 -21
  525. package/src/views/ThemeDebug.tsx +1 -1
  526. package/src/views/ThemeUpdate.tsx +1 -1
  527. package/types/_withNativeStyle.d.ts.map +1 -1
  528. package/types/config.d.ts.map +1 -1
  529. package/types/contexts/ComponentContext.d.ts +1 -1
  530. package/types/contexts/ComponentContext.d.ts.map +1 -1
  531. package/types/createComponent.d.ts.map +1 -1
  532. package/types/createStyledHOC.d.ts +5 -2
  533. package/types/createStyledHOC.d.ts.map +1 -1
  534. package/types/createTamagui.d.ts.map +1 -1
  535. package/types/dom/contract.d.ts +4 -1
  536. package/types/dom/contract.d.ts.map +1 -1
  537. package/types/dom/html.d.ts +60 -51
  538. package/types/dom/html.d.ts.map +1 -1
  539. package/types/dom/html.native.d.ts.map +1 -1
  540. package/types/dom/htmlReset.d.ts +10 -0
  541. package/types/dom/htmlReset.d.ts.map +1 -0
  542. package/types/dom/htmlRuntime.native.d.ts.map +1 -1
  543. package/types/dom/htmlStaticConfig.d.ts +22 -0
  544. package/types/dom/htmlStaticConfig.d.ts.map +1 -0
  545. package/types/dom/primitives.native.d.ts.map +1 -1
  546. package/types/dom/standalone.d.ts +2 -1
  547. package/types/dom/standalone.d.ts.map +1 -1
  548. package/types/dom/styleTypes.d.ts +63 -84
  549. package/types/dom/styleTypes.d.ts.map +1 -1
  550. package/types/eventHandling.d.ts +12 -4
  551. package/types/eventHandling.d.ts.map +1 -1
  552. package/types/eventHandling.native.d.ts.map +1 -1
  553. package/types/helpers/NativeTextBinding.d.ts +11 -0
  554. package/types/helpers/NativeTextBinding.d.ts.map +1 -0
  555. package/types/helpers/createDesignSystem.d.ts.map +1 -1
  556. package/types/helpers/expandStyle.d.ts +1 -0
  557. package/types/helpers/expandStyle.d.ts.map +1 -1
  558. package/types/helpers/expandStyles.d.ts.map +1 -1
  559. package/types/helpers/fluid.d.ts +21 -0
  560. package/types/helpers/fluid.d.ts.map +1 -0
  561. package/types/helpers/getCSSStylesAtomic.d.ts +3 -1
  562. package/types/helpers/getCSSStylesAtomic.d.ts.map +1 -1
  563. package/types/helpers/getSplitStyles.d.ts +2 -1
  564. package/types/helpers/getSplitStyles.d.ts.map +1 -1
  565. package/types/helpers/getThemeCSSRules.d.ts.map +1 -1
  566. package/types/helpers/grammarConfig.d.ts.map +1 -1
  567. package/types/helpers/insertStyleRule.d.ts.map +1 -1
  568. package/types/helpers/mainThreadPressEvents.native.d.ts +0 -7
  569. package/types/helpers/mainThreadPressEvents.native.d.ts.map +1 -1
  570. package/types/helpers/mergeProps.d.ts +1 -15
  571. package/types/helpers/mergeProps.d.ts.map +1 -1
  572. package/types/helpers/nativeOnlyProps.d.ts +0 -1
  573. package/types/helpers/nativeOnlyProps.d.ts.map +1 -1
  574. package/types/helpers/nativeTextMetrics.d.ts +16 -0
  575. package/types/helpers/nativeTextMetrics.d.ts.map +1 -0
  576. package/types/helpers/normalizeColor.native.d.ts +4 -1
  577. package/types/helpers/normalizeColor.native.d.ts.map +1 -1
  578. package/types/helpers/normalizeShadow.native.d.ts +3 -1
  579. package/types/helpers/normalizeShadow.native.d.ts.map +1 -1
  580. package/types/helpers/normalizeValueWithProperty.d.ts.map +1 -1
  581. package/types/helpers/{parseNativeStyle.native.d.ts → parseNativeStyle.d.ts} +1 -1
  582. package/types/helpers/parseNativeStyle.d.ts.map +1 -0
  583. package/types/helpers/proxyThemeToParents.d.ts +1 -1
  584. package/types/helpers/proxyThemeToParents.d.ts.map +1 -1
  585. package/types/helpers/resolveNativeUnits.d.ts +6 -0
  586. package/types/helpers/resolveNativeUnits.d.ts.map +1 -0
  587. package/types/helpers/resolveNativeUnits.native.d.ts +16 -0
  588. package/types/helpers/resolveNativeUnits.native.d.ts.map +1 -0
  589. package/types/helpers/resolveRem.native.d.ts +6 -4
  590. package/types/helpers/resolveRem.native.d.ts.map +1 -1
  591. package/types/helpers/resolveSizing.d.ts +90 -0
  592. package/types/helpers/resolveSizing.d.ts.map +1 -0
  593. package/types/helpers/resolveVariableValue.d.ts.map +1 -1
  594. package/types/helpers/skipProps.d.ts +0 -1
  595. package/types/helpers/skipProps.d.ts.map +1 -1
  596. package/types/helpers/styleFrontend.d.ts +21 -0
  597. package/types/helpers/styleFrontend.d.ts.map +1 -1
  598. package/types/helpers/styleProvenance.d.ts +1 -1
  599. package/types/helpers/styleProvenance.d.ts.map +1 -1
  600. package/types/helpers/styleStaticConfigCore.d.ts.map +1 -1
  601. package/types/helpers/styledDynamic.d.ts +1 -1
  602. package/types/helpers/styledDynamic.d.ts.map +1 -1
  603. package/types/helpers/themes.d.ts +4 -0
  604. package/types/helpers/themes.d.ts.map +1 -1
  605. package/types/helpers/tokenCategories.d.ts +1 -1
  606. package/types/helpers/tokenCategories.d.ts.map +1 -1
  607. package/types/helpers/warnOnce.d.ts +1 -0
  608. package/types/helpers/warnOnce.d.ts.map +1 -1
  609. package/types/helpers/webPropsToSkip.native.d.ts +6 -2
  610. package/types/helpers/webPropsToSkip.native.d.ts.map +1 -1
  611. package/types/helpers/wrapStyleTags.d.ts.map +1 -1
  612. package/types/hooks/useMedia.d.ts +5 -2
  613. package/types/hooks/useMedia.d.ts.map +1 -1
  614. package/types/hooks/useSplitStyles.d.ts.map +1 -1
  615. package/types/hooks/useThemeState.d.ts.map +1 -1
  616. package/types/index.d.ts +4 -1
  617. package/types/index.d.ts.map +1 -1
  618. package/types/interfaces/RNExclusiveTypes.d.ts +2 -3
  619. package/types/interfaces/RNExclusiveTypes.d.ts.map +1 -1
  620. package/types/internal-runtime.d.ts +12 -1
  621. package/types/internal-runtime.d.ts.map +1 -1
  622. package/types/style.d.ts.map +1 -1
  623. package/types/styled.d.ts +7 -4
  624. package/types/styled.d.ts.map +1 -1
  625. package/types/types.d.ts +258 -102
  626. package/types/types.d.ts.map +1 -1
  627. package/types/views/Theme.d.ts.map +1 -1
  628. package/dist/cjs/helpers/timer.native.js.map +0 -1
  629. package/dist/esm/helpers/timer.mjs +0 -13
  630. package/dist/esm/helpers/timer.mjs.map +0 -1
  631. package/dist/esm/helpers/timer.native.js +0 -13
  632. package/dist/esm/helpers/timer.native.js.map +0 -1
  633. package/src/helpers/timer.ts +0 -9
  634. package/types/helpers/parseNativeStyle.native.d.ts.map +0 -1
  635. package/types/helpers/timer.d.ts +0 -2
  636. package/types/helpers/timer.d.ts.map +0 -1
@@ -5,6 +5,7 @@ import { variableToString } from '../createVariable'
5
5
  import type { CreateTamaguiProps, ThemeParsed, Variable } from '../types'
6
6
  import { getOrCreateVariable, getOrCreateMutatedVariable } from './registerCSSVariable'
7
7
  import { sortString } from './sortString'
8
+ import { getAuthoredThemeScheme, themeSchemeSelectorPrefix } from './themes'
8
9
 
9
10
  const darkLight = ['dark', 'light']
10
11
  const lightDark = ['light', 'dark']
@@ -29,6 +30,9 @@ export function getThemeCSSRules(props: {
29
30
  ) {
30
31
  const cssRuleSets: string[] = []
31
32
  const { config, themeName, theme, names } = props
33
+ const whitespace = process.env.NODE_ENV === 'development' ? ' ' : ''
34
+ const mediaIndent = process.env.NODE_ENV === 'development' ? '\n ' : ''
35
+ const mediaClose = process.env.NODE_ENV === 'development' ? '\n ' : ''
32
36
 
33
37
  // special case for SSR
34
38
  const hasDarkLight =
@@ -60,6 +64,7 @@ export function getThemeCSSRules(props: {
60
64
  const isLightBase = themeName === 'light'
61
65
  const baseSelectors = names.map((name) => `${CNP}${name}`)
62
66
  const selectorsSet = new Set(isDarkBase || isLightBase ? baseSelectors : [])
67
+ const selectorScheme = new Map<string, 'light' | 'dark'>()
63
68
 
64
69
  // The full resolved name is authoritative. `:not(#t_theme_full_name)` is
65
70
  // an always-matching specificity anchor: a bounded relative selector for
@@ -78,8 +83,16 @@ export function getThemeCSSRules(props: {
78
83
  const maxDepth = 2
79
84
 
80
85
  for (const subName of names) {
81
- const isDark = isDarkBase || subName.startsWith('dark_')
82
- const isLight = !isDark && (isLightBase || subName.startsWith('light_'))
86
+ // identical themes dedupe into one canonical name, and an alias can carry
87
+ // the opposite scheme to the name it deduped into: light_inverse IS dark,
88
+ // so it arrives here under themeName "dark". its own prefix therefore
89
+ // decides its scheme, and the base only answers for an unprefixed name.
90
+ // reading the base first pointed every cross-scheme alias at the wrong
91
+ // parent, which silently made <Theme name="inverse"> a no-op.
92
+ const hasDarkPrefix = subName === 'dark' || subName.startsWith('dark_')
93
+ const hasLightPrefix = subName === 'light' || subName.startsWith('light_')
94
+ const isDark = hasDarkPrefix || (!hasLightPrefix && isDarkBase)
95
+ const isLight = hasLightPrefix || (!hasDarkPrefix && isLightBase)
83
96
 
84
97
  if (!(isDark || isLight)) {
85
98
  // neither light nor dark subtheme, just generate one selector with :root:root which
@@ -117,12 +130,18 @@ export function getThemeCSSRules(props: {
117
130
 
118
131
  // for light/dark/light:
119
132
  const parentSelectorString = parentSelectors.join(' ')
120
- selectorsSet.add(`${parentSelectorString} ${nextChildSelector}`)
133
+ const selector = `${parentSelectorString} ${nextChildSelector}`
134
+ selectorsSet.add(selector)
135
+ // remember which scheme's root this selector was built for, so the
136
+ // prefers-color-scheme pass below can route it. a theme carrying
137
+ // aliases from both schemes has to reach both media blocks.
138
+ selectorScheme.set(selector, isDark ? 'dark' : 'light')
121
139
  }
122
140
  }
123
141
  }
124
142
 
125
143
  const selectors = [...selectorsSet].sort(sortString)
144
+ const authoredScheme = getAuthoredThemeScheme(theme)
126
145
 
127
146
  // only do our :root attach if it's not light/dark - not support sub themes on root saves a lot of effort/size
128
147
  const selectorsString =
@@ -133,44 +152,63 @@ export function getThemeCSSRules(props: {
133
152
  if (!isOnRoot) return `:root ${x}`
134
153
  return `${addTo === 'body' ? 'body' : ':root'}${x}`
135
154
  })
136
- .join(', ') + `, .tm_xxt`
155
+ .join(', ') +
156
+ `, .tm_xxt` +
157
+ (authoredScheme ? `, ${themeSchemeSelectorPrefix}${authoredScheme}` : '')
137
158
 
138
- const css = `${selectorsString} {${vars}}`
159
+ const css = `${selectorsString}${whitespace}{${vars}}`
139
160
  cssRuleSets.push(css)
140
161
 
141
162
  if (getSetting('shouldAddPrefersColorThemes')) {
142
- const isDark = themeName.startsWith('dark')
143
- const baseName = isDark ? 'dark' : 'light'
144
- const lessSpecificSelectors = selectors
145
- .map((x) => {
146
- if (x == darkSelector || x === lightSelector) return `:root`
147
- if (
148
- (isDark && x.startsWith(lightSelector)) ||
149
- (!isDark && x.startsWith(darkSelector))
150
- ) {
151
- return
152
- }
153
- return x.replace(/^\.t_(dark|light) /, '').trim()
154
- })
155
- .filter(Boolean)
156
- .join(', ')
157
-
158
- // only emit body background/color for base themes, not every sub-theme
159
- const isBase = !themeName.includes('_')
160
- let bodyRulesString = ''
161
- if (isBase) {
162
- const bgString = theme.background
163
- ? `background:${variableToString(theme.background)};`
164
- : ''
165
- const fgString = theme.color ? `color:${variableToString(theme.color)}` : ''
166
- bodyRulesString = bgString || fgString ? `body{${bgString}${fgString}}\n ` : ''
163
+ // inside a media block the root carries no theme class, so the leading
164
+ // `.t_light `/`.t_dark ` is stripped and the block itself stands in for it.
165
+ // a theme reached under BOTH roots therefore has to emit into both blocks:
166
+ // light_inverse dedupes into dark, so the dark values it holds are what an
167
+ // implicitly-light root must serve, while dark's own values serve the dark
168
+ // one. keying the whole set off themeName dropped one of the two.
169
+ const schemeOf = (x: string) => {
170
+ if (x === darkSelector) return 'dark'
171
+ if (x === lightSelector) return 'light'
172
+ if (x.startsWith(`${darkSelector} `)) return 'dark'
173
+ if (x.startsWith(`${lightSelector} `)) return 'light'
174
+ return selectorScheme.get(x)
167
175
  }
168
176
 
169
- const themeRules = `${lessSpecificSelectors} {${vars}}`
170
- const prefersMediaSelectors = `@media(prefers-color-scheme:${baseName}){
171
- ${bodyRulesString}${themeRules}
172
- }`
173
- cssRuleSets.push(prefersMediaSelectors)
177
+ for (const baseName of lightDark) {
178
+ const lessSpecificSelectors = selectors
179
+ .map((x) => {
180
+ if (x === darkSelector || x === lightSelector) {
181
+ return schemeOf(x) === baseName ? ':root' : undefined
182
+ }
183
+ // a selector rooted in the other scheme is unreachable here: that
184
+ // root would have to carry an explicit class, which the non-media
185
+ // rules above already cover at higher specificity.
186
+ const scheme = schemeOf(x)
187
+ if (scheme && scheme !== baseName) return
188
+ return x.replace(/^\.t_(dark|light) /, '').trim()
189
+ })
190
+ .filter(Boolean)
191
+ .join(', ')
192
+
193
+ if (!lessSpecificSelectors) continue
194
+
195
+ // only emit body background/color for base themes, not every sub-theme,
196
+ // and only for the scheme this theme actually grounds
197
+ const isBase = !themeName.includes('_')
198
+ let bodyRulesString = ''
199
+ if (isBase && themeName === baseName) {
200
+ const bgString = theme.background
201
+ ? `background:${variableToString(theme.background)};`
202
+ : ''
203
+ const fgString = theme.color ? `color:${variableToString(theme.color)}` : ''
204
+ bodyRulesString =
205
+ bgString || fgString ? `body{${bgString}${fgString}}${mediaIndent}` : ''
206
+ }
207
+
208
+ cssRuleSets.push(
209
+ `@media(prefers-color-scheme:${baseName}){${mediaIndent}${bodyRulesString}${lessSpecificSelectors}${whitespace}{${vars}}${mediaClose}}`
210
+ )
211
+ }
174
212
  }
175
213
 
176
214
  const selectionStyles = getSetting('selectionStyles')
@@ -1,3 +1,6 @@
1
+ // leaf subpath on purpose: the barrel pulls in the transition parser, which
2
+ // belongs to drivers and the compiler, not to every app that imports core
3
+ import { canonicalTransitionProperty } from '@tamagui/animation-helpers/propertyNames'
1
4
  import { platformMatches } from '@tamagui/constants'
2
5
  import { simpleHash } from '@tamagui/helpers'
3
6
  import {
@@ -201,6 +204,15 @@ export function prepareConfigRevision(
201
204
  borderRadius: 8,
202
205
  }
203
206
  const propertyKind = (property: string) => propertyKinds[property] || 0
207
+ // every border side width reads the one borderWidth group, as css does
208
+ const tokenCategory = (property: string): RuntimeTokenCategory | undefined =>
209
+ config.tokensParsed[property]
210
+ ? property
211
+ : config.tokensParsed.borderWidth &&
212
+ property.startsWith('border') &&
213
+ property.endsWith('Width')
214
+ ? 'borderWidth'
215
+ : getTokenCategoryForProperty(property)
204
216
  // transition strings are re-normalized on every render of every animated
205
217
  // element; the result only depends on this revision's shorthands
206
218
  const normalizedTransitions = new Map<string, string>()
@@ -209,7 +221,7 @@ export function prepareConfigRevision(
209
221
  modifiers,
210
222
  mediaQueries,
211
223
  resolveCondition,
212
- tokenCategory: getTokenCategoryForProperty,
224
+ tokenCategory,
213
225
  expandSafeArea: expandSafeAreaValue,
214
226
  safeAreaVariable: resolveSafeAreaVariable,
215
227
  parseFlatValue,
@@ -259,11 +271,10 @@ export function prepareConfigRevision(
259
271
  ) {
260
272
  return authored
261
273
  }
262
- let property = config.shorthands[authored] || authored
263
- if (property === 'x' || property === 'y') property = 'translate'
264
- else if (property === 'scaleX' || property === 'scaleY') property = 'scale'
265
- else if (propertyKind(property) === 5) property = 'transform'
266
- return property.replace(/[A-Z]/g, '-$&').toLowerCase()
274
+ // the drivers file entries under the same names through
275
+ // canonicalTransitionProperty, so a raw css string and a resolved
276
+ // transition cannot disagree about what `y` or `rotateX` targets
277
+ return canonicalTransitionProperty(config.shorthands[authored] || authored)
267
278
  }
268
279
  )
269
280
  if (normalizedTransitions.size > 2048) normalizedTransitions.clear()
@@ -272,7 +283,11 @@ export function prepareConfigRevision(
272
283
  },
273
284
  embeddedTokens: (raw, resolve) =>
274
285
  raw.replace(
275
- /\/\*[\s\S]*?\*\/|(["'])(?:\\.|(?!\1)[^\\])*\1|[$A-Za-z_][\w.$-]*(?:\/\d+)?/g,
286
+ // the alpha suffix matches decimals too, so `$color/0.7` is handed to
287
+ // resolve() whole and rejected as one token. matching only `\d+` split it
288
+ // into `$color/0` plus a stray `.7`, which left the `.7` glued onto the
289
+ // resolved value.
290
+ /\/\*[\s\S]*?\*\/|(["'])(?:\\.|(?!\1)[^\\])*\1|[$A-Za-z_][\w.$-]*(?:\/\d*\.?\d+)?/g,
276
291
  (word, quote, offset) => {
277
292
  const before = raw.charCodeAt(offset - 1)
278
293
  return quote ||
@@ -332,7 +347,7 @@ export function getConfigRevisionSnapshot(
332
347
  for (const key of Object.keys(themes[name] || {})) themeKeys.add(key)
333
348
  }
334
349
  sections.themeVariables.push(`v:${[...themeKeys].sort().join(',')}`)
335
- for (const category of ['color', 'space', 'size', 'radius', 'zIndex']) {
350
+ for (const category of Object.keys(tokensParsed).sort()) {
336
351
  const tokens = tokensParsed[category]
337
352
  sections.tokens.push(
338
353
  `${category}:${tokens ? Object.keys(tokens).sort().join(',') : ''}`
@@ -1,6 +1,7 @@
1
1
  import { StyleObjectIdentifier, StyleObjectRules } from '@tamagui/helpers'
2
2
  import { createVariable } from '../createVariable'
3
3
  import { formatDiagnostic } from './formatDiagnostic'
4
+ import { setAuthoredThemeScheme, themeSchemeSelectorPrefix } from './themes'
4
5
  import type {
5
6
  DedupedTheme,
6
7
  DedupedThemes,
@@ -10,7 +11,7 @@ import type {
10
11
  } from '../types'
11
12
 
12
13
  // only cache tamagui styles
13
- // TODO merge totalSelectorsInserted and allSelectors?
14
+ // kept separate: allSelectors stores rule text for inspection, totalSelectorsInserted counts stylesheet insertions
14
15
  const scannedCache = new WeakMap<CSSStyleSheet, string>()
15
16
  const totalSelectorsInserted = new Map<string, number>()
16
17
  const allSelectors: Record<string, string> = {}
@@ -25,7 +26,7 @@ let sortedRules: string[] = []
25
26
  let sortedRulesStale = true
26
27
 
27
28
  export const getAllRules = () => {
28
- if (!process.env.TAMAGUI_DID_OUTPUT_CSS) {
29
+ if (process.env.TAMAGUI_RUNTIME !== 'island') {
29
30
  if (sortedRulesStale) {
30
31
  // Sort by identifier to ensure deterministic CSS output order
31
32
  const sortedKeys = Object.keys(allRules).sort()
@@ -58,10 +59,9 @@ export function scanAllSheets(
58
59
  collectThemes = false,
59
60
  tokens?: TokensParsed
60
61
  ): DedupedThemes | undefined {
61
- // with a proven CSS artifact the style dedup scan is dead weight, but theme
62
- // collection must still run: a client config passing empty themes hydrates
63
- // its theme values from that same CSS artifact
64
- if (!process.env.TAMAGUI_DID_OUTPUT_CSS || collectThemes) {
62
+ // runtime components still emit styles alongside the config CSS artifact.
63
+ // an island only scans when rebuilding empty client themes from that artifact
64
+ if (process.env.TAMAGUI_RUNTIME !== 'island' || collectThemes) {
65
65
  if (process.env.NODE_ENV === 'test') return
66
66
  if (process.env.TAMAGUI_TARGET !== 'web') return
67
67
  if (typeof document === 'undefined') return
@@ -267,6 +267,12 @@ function addThemesFromCSS(cssStyleRule: CSSStyleRule, tokens?: TokensParsed) {
267
267
 
268
268
  // loop selectors and build deduped
269
269
  for (const selector of selectors) {
270
+ const marker = selector.trim()
271
+ if (marker.startsWith(themeSchemeSelectorPrefix)) {
272
+ const scheme = marker.slice(themeSchemeSelectorPrefix.length)
273
+ if (scheme === 'light' || scheme === 'dark') setAuthoredThemeScheme(values, scheme)
274
+ continue
275
+ }
270
276
  const themeName = getThemeNameFromSelector(selector)
271
277
  if (themeName) names.add(themeName)
272
278
  }
@@ -341,7 +347,7 @@ export function stopAccumulatingRules() {
341
347
  }
342
348
 
343
349
  export function updateRules(identifier: string, rules: string[]) {
344
- if (!process.env.TAMAGUI_DID_OUTPUT_CSS && trackAllRules) {
350
+ if (process.env.TAMAGUI_RUNTIME !== 'island' && trackAllRules) {
345
351
  allRules[identifier] = rules.join(' ')
346
352
  allRuleSets[identifier] = rules
347
353
  sortedRulesStale = true
@@ -355,7 +361,7 @@ export function setNonce(_: string) {
355
361
  }
356
362
 
357
363
  export function insertStyleRules(rulesToInsert: RulesToInsert) {
358
- if (process.env.TAMAGUI_DID_OUTPUT_CSS || process.env.TAMAGUI_TARGET !== 'web') {
364
+ if (process.env.TAMAGUI_RUNTIME === 'island' || process.env.TAMAGUI_TARGET !== 'web') {
359
365
  return
360
366
  }
361
367
 
@@ -1,31 +1,7 @@
1
- /**
2
- * Fallback press handling when RNGH is not available.
3
- *
4
- * Implements the responder-based press detection that usePressability provides,
5
- * without the deep RN internal import. Supports pressIn/pressOut delays,
6
- * long press, cancellation, and min press duration.
7
- */
8
-
9
1
  import { unstable_hasExternalPressOwnership } from '@tamagui/native'
10
2
  import { useRef } from 'react'
11
-
12
- type PressState =
13
- | 'idle'
14
- | 'pressing' // responder granted, waiting for delay
15
- | 'active' // pressIn fired
16
- | 'longPressed' // long press detected
17
-
18
- interface PressRef {
19
- state: PressState
20
- pressInTimer: ReturnType<typeof setTimeout> | null
21
- pressOutTimer: ReturnType<typeof setTimeout> | null
22
- longPressTimer: ReturnType<typeof setTimeout> | null
23
- activateTime: number
24
- blockedByExternalOwnership: boolean
25
- }
26
-
27
- const DEFAULT_LONG_PRESS_DELAY = 500
28
- const DEFAULT_MIN_PRESS_DURATION = 130
3
+ import type { GestureResponderEvent } from 'react-native'
4
+ import type { usePressability as usePressabilityType } from 'react-native'
29
5
 
30
6
  export function useMainThreadPressEvents(
31
7
  events: any,
@@ -33,145 +9,93 @@ export function useMainThreadPressEvents(
33
9
  enabled = true,
34
10
  debugName?: string | null
35
11
  ) {
36
- const ref = useRef<PressRef>(null as any)
37
- if (!ref.current) {
38
- ref.current = {
39
- state: 'idle',
40
- pressInTimer: null,
41
- pressOutTimer: null,
42
- longPressTimer: null,
43
- activateTime: 0,
44
- blockedByExternalOwnership: false,
45
- }
12
+ // static config evaluation does not render; load native code at render time.
13
+ const usePressability: typeof usePressabilityType =
14
+ require('react-native').usePressability
15
+ const initialized = useRef(false)
16
+ const ownsResponder = useRef(false)
17
+ const pressActive = useRef(false)
18
+ const active = enabled && Boolean(events)
19
+ if (active) initialized.current = true
20
+
21
+ function endPress(e: GestureResponderEvent) {
22
+ if (!pressActive.current) return
23
+ pressActive.current = false
24
+ events?.onPressOut?.(e)
46
25
  }
47
26
 
48
- if (!enabled || !events) return
49
-
50
- const delayPressIn = Math.max(0, events.delayPressIn ?? 0)
51
- const delayPressOut = Math.max(0, events.delayPressOut ?? 0)
52
- const delayLongPress = Math.max(0, events.delayLongPress ?? DEFAULT_LONG_PRESS_DELAY)
53
- const minPressDuration = Math.max(
54
- 0,
55
- events.minPressDuration ?? DEFAULT_MIN_PRESS_DURATION
27
+ // react native owns press geometry, timing and cancellation; initialize only
28
+ // for pressable components and remove callbacks when the responder path stops.
29
+ const handlers = usePressability(
30
+ initialized.current
31
+ ? {
32
+ ...(active ? events : {}),
33
+ disabled: !active || events?.disabled,
34
+ android_disableSound: true,
35
+ onPressIn: active
36
+ ? (e: GestureResponderEvent) => {
37
+ endPress(e)
38
+ pressActive.current = true
39
+ events.onPressIn?.(e)
40
+ }
41
+ : undefined,
42
+ onPressOut: active ? endPress : undefined,
43
+ hitSlop: viewProps.hitSlop,
44
+ pressRectOffset: viewProps.pressRetentionOffset,
45
+ }
46
+ : null
56
47
  )
48
+ if (!active || !handlers) return
57
49
 
58
- function activate(e: any) {
59
- ref.current.state = 'active'
60
- ref.current.activateTime = Date.now()
61
- events.onPressIn?.(e)
62
- }
63
-
64
- function deactivate(e: any) {
65
- const pressDuration = Date.now() - ref.current.activateTime
66
- const remaining = Math.max(minPressDuration - pressDuration, delayPressOut)
67
-
68
- if (remaining > 0) {
69
- ref.current.pressOutTimer = setTimeout(() => {
70
- events.onPressOut?.(e)
71
- }, remaining)
72
- } else {
73
- events.onPressOut?.(e)
74
- }
75
- }
76
-
77
- function cleanup() {
78
- if (ref.current.pressInTimer) clearTimeout(ref.current.pressInTimer)
79
- if (ref.current.pressOutTimer) clearTimeout(ref.current.pressOutTimer)
80
- if (ref.current.longPressTimer) clearTimeout(ref.current.longPressTimer)
81
- ref.current.pressInTimer = null
82
- ref.current.pressOutTimer = null
83
- ref.current.longPressTimer = null
84
- }
85
-
86
- // user-supplied responder props (the View's raw RN gesture API) must keep
87
- // working: blindly overwriting them here silently killed any press-hold-drag
88
- // gesture built on onResponderMove/onResponderRelease whenever the element
89
- // also had hover/press events. compose instead — user handler first, then
90
- // the press synthesis.
91
50
  const userStartShouldSet = viewProps.onStartShouldSetResponder
92
51
  const userGrant = viewProps.onResponderGrant
93
52
  const userRelease = viewProps.onResponderRelease
94
53
  const userTerminate = viewProps.onResponderTerminate
95
54
  const userTerminationRequest = viewProps.onResponderTerminationRequest
96
55
  const userMove = viewProps.onResponderMove
56
+ const userClick = viewProps.onClick
97
57
 
98
- viewProps.onStartShouldSetResponder = (e: any) => {
99
- if (userStartShouldSet?.(e)) return true
100
- return !events.disabled && !unstable_hasExternalPressOwnership()
101
- }
102
-
103
- viewProps.onResponderGrant = (e: any) => {
104
- cleanup()
105
-
106
- if (unstable_hasExternalPressOwnership()) {
107
- ref.current.state = 'idle'
108
- ref.current.blockedByExternalOwnership = true
109
- return
110
- }
58
+ viewProps.onStartShouldSetResponder = (e: GestureResponderEvent) =>
59
+ userStartShouldSet?.(e) ||
60
+ (!unstable_hasExternalPressOwnership() && handlers.onStartShouldSetResponder())
111
61
 
62
+ viewProps.onResponderGrant = (e: GestureResponderEvent) => {
63
+ endPress(e)
64
+ if (unstable_hasExternalPressOwnership()) return
112
65
  userGrant?.(e)
113
- ref.current.blockedByExternalOwnership = false
114
- ref.current.state = 'pressing'
115
-
116
- if (delayPressIn > 0) {
117
- ref.current.pressInTimer = setTimeout(() => activate(e), delayPressIn)
118
- } else {
119
- activate(e)
120
- }
121
-
122
- if (events.onLongPress) {
123
- ref.current.longPressTimer = setTimeout(() => {
124
- if (ref.current.state === 'active') {
125
- ref.current.state = 'longPressed'
126
- events.onLongPress?.(e)
127
- }
128
- }, delayLongPress + delayPressIn)
129
- }
66
+ ownsResponder.current = true
67
+ return handlers.onResponderGrant(e)
130
68
  }
131
69
 
132
- viewProps.onResponderRelease = (e: any) => {
133
- if (ref.current.blockedByExternalOwnership || unstable_hasExternalPressOwnership()) {
134
- cleanup()
135
- ref.current.blockedByExternalOwnership = false
136
- ref.current.state = 'idle'
70
+ viewProps.onResponderRelease = (e: GestureResponderEvent) => {
71
+ if (!ownsResponder.current) return
72
+ ownsResponder.current = false
73
+ if (unstable_hasExternalPressOwnership()) {
74
+ handlers.onResponderTerminate(e)
75
+ endPress(e)
137
76
  return
138
77
  }
139
-
140
78
  userRelease?.(e)
141
- const wasLongPressed = ref.current.state === 'longPressed'
142
- cleanup()
143
-
144
- // if pressIn hasn't fired yet (was in delay), fire it now then immediately deactivate
145
- if (ref.current.state === 'pressing') {
146
- activate(e)
147
- }
148
-
149
- if (!wasLongPressed) {
150
- events.onPress?.(e)
151
- }
152
-
153
- deactivate(e)
154
- ref.current.state = 'idle'
155
- ref.current.blockedByExternalOwnership = false
79
+ handlers.onResponderRelease(e)
156
80
  }
157
81
 
158
- viewProps.onResponderTerminate = (e: any) => {
82
+ viewProps.onResponderTerminate = (e: GestureResponderEvent) => {
159
83
  userTerminate?.(e)
160
- cleanup()
161
- if (ref.current.state === 'active' || ref.current.state === 'longPressed') {
162
- deactivate(e)
163
- }
164
- ref.current.state = 'idle'
165
- ref.current.blockedByExternalOwnership = false
84
+ if (ownsResponder.current) handlers.onResponderTerminate(e)
85
+ endPress(e)
86
+ ownsResponder.current = false
166
87
  }
167
88
 
168
- viewProps.onResponderTerminationRequest = (e: any) => {
169
- if (userTerminationRequest) return userTerminationRequest(e)
170
- return events.cancelable !== false
171
- }
89
+ viewProps.onResponderTerminationRequest = (e: GestureResponderEvent) =>
90
+ userTerminationRequest?.(e) ?? handlers.onResponderTerminationRequest()
172
91
 
173
- viewProps.onResponderMove = (e: any) => {
92
+ viewProps.onResponderMove = (e: GestureResponderEvent) => {
174
93
  userMove?.(e)
175
- events.onPressMove?.(e)
94
+ if (ownsResponder.current) handlers.onResponderMove(e)
95
+ }
96
+
97
+ viewProps.onClick = (e: GestureResponderEvent) => {
98
+ userClick?.(e)
99
+ if (!unstable_hasExternalPressOwnership()) handlers.onClick(e)
176
100
  }
177
101
  }
@@ -1,49 +1,31 @@
1
- /**
2
- * Preserves prop ordering, so that the order most closely matches the last spread objects
3
- * Useful for having { ...defaultProps, ...props } that ensure props ordering is always kept
4
- *
5
- * Honestly this is somehwat backwards logically from Object.assign, reason was that we typically
6
- * are merging defaultProps, givenProps, but we started using it elsewhere and now its a bit confusing
7
- * Should look into refactoring this to match common usage
8
- *
9
- * Given:
10
- * mergeProps({ a: 1, b: 2 }, { b: 1, a: 2 })
11
- * The final key order will be:
12
- * b, a
13
- *
14
- */
15
-
16
1
  export type GenericProps = Record<string, any>
17
2
 
18
- export const mergeProps = (defaultProps: object, props: object) => {
19
- const out: GenericProps = {}
20
-
21
- // in general objects keys are sorted by order of insertion
22
- // we merge "defaultProps" first as they should come first
23
- // (so Object.keys(finalProps) will list [...defaultPropKeys] first)
24
- // but we ignore any keys from props, and merge it after, that way
25
- // final order is [...defaultPropKeys, ...propKeys]
26
-
27
- // ⚠️ keep in sync with mergeComponentProps logic
28
-
29
- for (const key in defaultProps) {
30
- if (key in props) continue
31
- out[key] = defaultProps[key]
32
- }
33
-
34
- for (const key in props) {
35
- out[key] = props[key]
3
+ // layers merge in order (defaults, styled context, the caller's props), so key
4
+ // order in the result follows that order. one rule for every layer: an
5
+ // undefined value never replaces what a lower layer set (React defaultProps
6
+ // semantics); it lands only when nothing set the key, which keeps `key in
7
+ // props` true for a caller who passed the key.
8
+ const mergeLayer = (out: GenericProps, layer: object) => {
9
+ for (const key in layer) {
10
+ const value = layer[key]
11
+ if (value === undefined && key in out) continue
12
+ out[key] = value
36
13
  }
14
+ }
37
15
 
16
+ export const mergeProps = (defaultProps: object, props: object) => {
17
+ const out: GenericProps = {}
18
+ mergeLayer(out, defaultProps)
19
+ mergeLayer(out, props)
38
20
  return out
39
21
  }
40
22
 
41
- // merge props but also handles defaultProps + styledContext
23
+ // same merge with a styled-context layer between defaults and props. also
24
+ // reports which context keys the caller's props overrode, in prop order, so
25
+ // the component can stop publishing those to its own descendants.
42
26
  export const mergeComponentProps = (
43
- // this is "a" in mergeProps
44
27
  defaultProps: object | null | undefined,
45
- contextProps: object | undefined,
46
- // this is "b" in mergeProps
28
+ contextProps: object | null | undefined,
47
29
  props: object
48
30
  ) => {
49
31
  let overriddenContext: GenericProps | null = null
@@ -52,38 +34,23 @@ export const mergeComponentProps = (
52
34
  return [props, overriddenContext] as const
53
35
  }
54
36
 
55
- if (defaultProps && !contextProps) {
56
- return [mergeProps(defaultProps, props), overriddenContext] as const
57
- }
58
-
59
- // the only unique case is contextProps, we need to track overrides and do something a bit tricky
60
- // since we respect prop order for styles, we want to preserve the object key order in overriddenContext
61
-
62
37
  const out: GenericProps = {}
63
-
64
- // ⚠️ keep in sync with mergeProps logic
65
- // same logic as mergeProps but tracking overrides!
66
-
67
- for (const key in defaultProps) {
68
- if (key in props) continue
69
- out[key] = defaultProps[key]
70
- }
71
-
72
- // styled context props go after defaultProps but before props
73
- for (const key in contextProps) {
74
- if (key in props) continue
75
- const contextValue = contextProps[key]
76
- // don't merge undefined context values to preserve inheritance
77
- if (contextValue !== undefined) {
78
- out[key] = contextValue
38
+ if (defaultProps) mergeLayer(out, defaultProps)
39
+ if (contextProps) {
40
+ // undefined context defaults declare a key without overriding styled values.
41
+ for (const key in contextProps) {
42
+ const value = contextProps[key]
43
+ if (value !== undefined) out[key] = value
79
44
  }
80
45
  }
81
46
 
82
47
  for (const key in props) {
83
- out[key] = props[key]
48
+ const value = props[key]
49
+ if (value === undefined && key in out) continue
50
+ out[key] = value
84
51
  if (contextProps && key in contextProps) {
85
52
  overriddenContext ||= {}
86
- overriddenContext[key] = props[key]
53
+ overriddenContext[key] = value
87
54
  }
88
55
  }
89
56