@tamagui/core 1.0.1-beta.192 → 1.0.1-beta.194

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 (232) hide show
  1. package/dist/cjs/Tamagui.js +4 -2
  2. package/dist/cjs/Tamagui.js.map +2 -2
  3. package/dist/cjs/config.js +1 -2
  4. package/dist/cjs/config.js.map +2 -2
  5. package/dist/cjs/constants/constants.js +13 -8
  6. package/dist/cjs/constants/constants.js.map +2 -2
  7. package/dist/cjs/contexts/TextAncestorContext.js +3 -16
  8. package/dist/cjs/contexts/TextAncestorContext.js.map +3 -3
  9. package/dist/cjs/createComponent.js +196 -284
  10. package/dist/cjs/createComponent.js.map +2 -2
  11. package/dist/cjs/createTamagui.js +15 -16
  12. package/dist/cjs/createTamagui.js.map +3 -3
  13. package/dist/cjs/createVariable.js +1 -2
  14. package/dist/cjs/createVariable.js.map +2 -2
  15. package/dist/cjs/helpers/ThemeManager.js +7 -14
  16. package/dist/cjs/helpers/ThemeManager.js.map +2 -2
  17. package/dist/cjs/helpers/{createShallowUpdate.js → cache.js} +20 -21
  18. package/dist/cjs/helpers/cache.js.map +7 -0
  19. package/dist/cjs/helpers/createMediaStyle.js +14 -8
  20. package/dist/cjs/helpers/createMediaStyle.js.map +2 -2
  21. package/dist/cjs/helpers/extendStaticConfig.js +0 -1
  22. package/dist/cjs/helpers/extendStaticConfig.js.map +2 -2
  23. package/dist/cjs/helpers/getSplitStyles.js +214 -94
  24. package/dist/cjs/helpers/getSplitStyles.js.map +3 -3
  25. package/dist/cjs/helpers/getStylesAtomic.js +16 -36
  26. package/dist/cjs/helpers/getStylesAtomic.js.map +3 -3
  27. package/dist/cjs/helpers/getVariantExtras.js +2 -1
  28. package/dist/cjs/helpers/getVariantExtras.js.map +2 -2
  29. package/dist/cjs/helpers/insertStyleRule.js +14 -6
  30. package/dist/cjs/helpers/insertStyleRule.js.map +2 -2
  31. package/dist/cjs/helpers/matchMedia.js.map +2 -2
  32. package/dist/cjs/helpers/mergeTransform.js.map +1 -1
  33. package/dist/cjs/helpers/normalizeValueWithProperty.js +32 -2
  34. package/dist/cjs/helpers/normalizeValueWithProperty.js.map +2 -2
  35. package/dist/cjs/helpers/proxyThemeVariables.js +2 -7
  36. package/dist/cjs/helpers/proxyThemeVariables.js.map +2 -2
  37. package/dist/cjs/helpers/useShallowSetState.js.map +2 -2
  38. package/dist/cjs/hooks/getThemeUnwrapped.js +1 -3
  39. package/dist/cjs/hooks/getThemeUnwrapped.js.map +2 -2
  40. package/dist/cjs/hooks/useElementLayout.js +92 -0
  41. package/dist/cjs/hooks/useElementLayout.js.map +7 -0
  42. package/dist/cjs/hooks/useIsTouchDevice.js +2 -10
  43. package/dist/cjs/hooks/useIsTouchDevice.js.map +2 -2
  44. package/dist/cjs/hooks/useMedia.js +79 -85
  45. package/dist/cjs/hooks/useMedia.js.map +2 -2
  46. package/dist/cjs/hooks/useMedia.test.js +2 -0
  47. package/dist/cjs/{helpers/validate.js.map → hooks/useMedia.test.js.map} +0 -0
  48. package/dist/cjs/hooks/usePressablePressResponder.js +370 -0
  49. package/dist/cjs/hooks/usePressablePressResponder.js.map +7 -0
  50. package/dist/cjs/hooks/useSafeRef.js +13 -15
  51. package/dist/cjs/hooks/useSafeRef.js.map +2 -2
  52. package/dist/cjs/hooks/useTheme.js +5 -5
  53. package/dist/cjs/hooks/useTheme.js.map +2 -2
  54. package/dist/cjs/index.js +1 -17
  55. package/dist/cjs/index.js.map +2 -2
  56. package/dist/cjs/static.js +0 -20
  57. package/dist/cjs/static.js.map +2 -2
  58. package/dist/cjs/styled.js +4 -22
  59. package/dist/cjs/styled.js.map +2 -2
  60. package/dist/cjs/types.js.map +1 -1
  61. package/dist/cjs/{hooks/useIsSSR.js → views/AbsoluteFill.js} +18 -23
  62. package/dist/cjs/views/AbsoluteFill.js.map +7 -0
  63. package/dist/cjs/views/AbsoluteFill.native.js +45 -0
  64. package/dist/cjs/views/AbsoluteFill.native.js.map +7 -0
  65. package/dist/cjs/views/FontLanguage.native.js.map +2 -2
  66. package/dist/cjs/views/Stack.js.map +1 -1
  67. package/dist/cjs/views/TamaguiProvider.js +3 -2
  68. package/dist/cjs/views/TamaguiProvider.js.map +2 -2
  69. package/dist/cjs/views/Text.js.map +1 -1
  70. package/dist/cjs/views/ThemeReset.js +10 -10
  71. package/dist/cjs/views/ThemeReset.js.map +2 -2
  72. package/dist/esm/Tamagui.js +4 -2
  73. package/dist/esm/Tamagui.js.map +2 -2
  74. package/dist/esm/config.js +1 -2
  75. package/dist/esm/config.js.map +2 -2
  76. package/dist/esm/constants/constants.js +11 -7
  77. package/dist/esm/constants/constants.js.map +2 -2
  78. package/dist/esm/contexts/TextAncestorContext.js +2 -13
  79. package/dist/esm/contexts/TextAncestorContext.js.map +2 -2
  80. package/dist/esm/createComponent.js +195 -286
  81. package/dist/esm/createComponent.js.map +2 -2
  82. package/dist/esm/createTamagui.js +15 -16
  83. package/dist/esm/createTamagui.js.map +3 -3
  84. package/dist/esm/createVariable.js +1 -2
  85. package/dist/esm/createVariable.js.map +2 -2
  86. package/dist/esm/helpers/ThemeManager.js +7 -14
  87. package/dist/esm/helpers/ThemeManager.js.map +2 -2
  88. package/dist/esm/helpers/cache.js +18 -0
  89. package/dist/esm/helpers/cache.js.map +7 -0
  90. package/dist/esm/helpers/createMediaStyle.js +14 -8
  91. package/dist/esm/helpers/createMediaStyle.js.map +2 -2
  92. package/dist/esm/helpers/extendStaticConfig.js +0 -1
  93. package/dist/esm/helpers/extendStaticConfig.js.map +2 -2
  94. package/dist/esm/helpers/getSplitStyles.js +223 -95
  95. package/dist/esm/helpers/getSplitStyles.js.map +3 -3
  96. package/dist/esm/helpers/getStylesAtomic.js +13 -26
  97. package/dist/esm/helpers/getStylesAtomic.js.map +2 -2
  98. package/dist/esm/helpers/getVariantExtras.js +2 -1
  99. package/dist/esm/helpers/getVariantExtras.js.map +2 -2
  100. package/dist/esm/helpers/insertStyleRule.js +14 -6
  101. package/dist/esm/helpers/insertStyleRule.js.map +2 -2
  102. package/dist/esm/helpers/matchMedia.js.map +2 -2
  103. package/dist/esm/helpers/mergeTransform.js.map +1 -1
  104. package/dist/esm/helpers/normalizeValueWithProperty.js +30 -1
  105. package/dist/esm/helpers/normalizeValueWithProperty.js.map +2 -2
  106. package/dist/esm/helpers/proxyThemeVariables.js +2 -7
  107. package/dist/esm/helpers/proxyThemeVariables.js.map +2 -2
  108. package/dist/esm/helpers/useShallowSetState.js.map +2 -2
  109. package/dist/esm/hooks/getThemeUnwrapped.js +1 -3
  110. package/dist/esm/hooks/getThemeUnwrapped.js.map +2 -2
  111. package/dist/esm/hooks/useElementLayout.js +66 -0
  112. package/dist/esm/hooks/useElementLayout.js.map +7 -0
  113. package/dist/esm/hooks/useIsTouchDevice.js +3 -11
  114. package/dist/esm/hooks/useIsTouchDevice.js.map +2 -2
  115. package/dist/esm/hooks/useMedia.js +76 -84
  116. package/dist/esm/hooks/useMedia.js.map +2 -2
  117. package/dist/esm/hooks/useMedia.test.js +1 -0
  118. package/dist/esm/{helpers/validate.js.map → hooks/useMedia.test.js.map} +0 -0
  119. package/dist/esm/hooks/usePressablePressResponder.js +346 -0
  120. package/dist/esm/hooks/usePressablePressResponder.js.map +7 -0
  121. package/dist/esm/hooks/useSafeRef.js +13 -15
  122. package/dist/esm/hooks/useSafeRef.js.map +2 -2
  123. package/dist/esm/hooks/useTheme.js +5 -5
  124. package/dist/esm/hooks/useTheme.js.map +2 -2
  125. package/dist/esm/index.js +1 -14
  126. package/dist/esm/index.js.map +2 -2
  127. package/dist/esm/static.js +0 -14
  128. package/dist/esm/static.js.map +2 -2
  129. package/dist/esm/styled.js +4 -22
  130. package/dist/esm/styled.js.map +2 -2
  131. package/dist/esm/views/AbsoluteFill.js +17 -0
  132. package/dist/esm/views/AbsoluteFill.js.map +7 -0
  133. package/dist/esm/views/AbsoluteFill.native.js +21 -0
  134. package/dist/esm/views/AbsoluteFill.native.js.map +7 -0
  135. package/dist/esm/views/FontLanguage.native.js.map +2 -2
  136. package/dist/esm/views/Stack.js.map +1 -1
  137. package/dist/esm/views/TamaguiProvider.js +5 -4
  138. package/dist/esm/views/TamaguiProvider.js.map +2 -2
  139. package/dist/esm/views/Text.js.map +1 -1
  140. package/dist/esm/views/ThemeReset.js +10 -10
  141. package/dist/esm/views/ThemeReset.js.map +2 -2
  142. package/package.json +14 -14
  143. package/src/Tamagui.ts +7 -3
  144. package/src/config.ts +2 -3
  145. package/src/constants/constants.ts +10 -6
  146. package/src/contexts/TextAncestorContext.tsx +1 -8
  147. package/src/createComponent.tsx +250 -412
  148. package/src/createTamagui.ts +16 -19
  149. package/src/createVariable.ts +1 -3
  150. package/src/helpers/ThemeManager.tsx +7 -15
  151. package/src/helpers/cache.ts +18 -0
  152. package/src/helpers/createMediaStyle.ts +16 -9
  153. package/src/helpers/createProxy.ts +16 -0
  154. package/src/helpers/extendStaticConfig.ts +0 -1
  155. package/src/helpers/getSplitStyles.tsx +259 -152
  156. package/src/helpers/getStylesAtomic.ts +14 -34
  157. package/src/helpers/getVariantExtras.tsx +2 -1
  158. package/src/helpers/insertStyleRule.tsx +16 -8
  159. package/src/helpers/matchMedia.ts +1 -0
  160. package/src/helpers/mergeTransform.ts +1 -1
  161. package/src/helpers/normalizeValueWithProperty.ts +30 -0
  162. package/src/helpers/proxyThemeVariables.tsx +3 -8
  163. package/src/helpers/useShallowSetState.tsx +0 -1
  164. package/src/hooks/getThemeUnwrapped.tsx +1 -2
  165. package/src/hooks/useElementLayout.tsx +90 -0
  166. package/src/hooks/useIsTouchDevice.tsx +3 -17
  167. package/src/hooks/useMedia.tsx +82 -88
  168. package/src/hooks/useSafeRef.ts +17 -18
  169. package/src/hooks/useTheme.tsx +6 -5
  170. package/src/index.ts +1 -11
  171. package/src/static.ts +0 -10
  172. package/src/styled.tsx +15 -33
  173. package/src/types.tsx +58 -55
  174. package/src/views/FontLanguage.native.tsx +1 -0
  175. package/src/views/Stack.tsx +1 -1
  176. package/src/views/TamaguiProvider.tsx +5 -5
  177. package/src/views/Text.tsx +1 -1
  178. package/src/views/ThemeReset.tsx +11 -11
  179. package/types/Tamagui.d.ts +6 -4
  180. package/types/constants/constants.d.ts +14 -3
  181. package/types/contexts/TextAncestorContext.d.ts +1 -3
  182. package/types/createComponent.d.ts +0 -15
  183. package/types/helpers/ThemeManager.d.ts +2 -3
  184. package/types/helpers/cache.d.ts +12 -0
  185. package/types/helpers/calc.d.ts +0 -16
  186. package/types/helpers/createMediaStyle.d.ts +1 -1
  187. package/types/helpers/createProxy.d.ts +2 -0
  188. package/types/helpers/getSplitStyles.d.ts +6 -10
  189. package/types/helpers/getStylesAtomic.d.ts +1 -5
  190. package/types/helpers/insertStyleRule.d.ts +2 -2
  191. package/types/helpers/mergeTransform.d.ts +1 -1
  192. package/types/helpers/normalizeValueWithProperty.d.ts +1 -0
  193. package/types/hooks/useElementLayout.d.ts +27 -0
  194. package/types/hooks/useMedia.d.ts +3 -1
  195. package/types/hooks/useMedia.test.d.ts +1 -0
  196. package/types/hooks/usePressablePressResponder.d.ts +84 -0
  197. package/types/index.d.ts +1 -11
  198. package/types/static.d.ts +0 -1
  199. package/types/types.d.ts +42 -44
  200. package/types/views/AbsoluteFill.d.ts +5 -0
  201. package/types/views/AbsoluteFill.native.d.ts +3 -0
  202. package/types/views/Stack.d.ts +1 -1
  203. package/types/views/Text.d.ts +1 -1
  204. package/dist/cjs/constants/platform.js +0 -74
  205. package/dist/cjs/constants/platform.js.map +0 -7
  206. package/dist/cjs/constants/platform.native.js +0 -62
  207. package/dist/cjs/constants/platform.native.js.map +0 -7
  208. package/dist/cjs/helpers/createShallowUpdate.js.map +0 -7
  209. package/dist/cjs/helpers/validate.js +0 -2
  210. package/dist/cjs/hooks/useDidFinishSSR.js +0 -60
  211. package/dist/cjs/hooks/useDidFinishSSR.js.map +0 -7
  212. package/dist/cjs/hooks/useIsSSR.js.map +0 -7
  213. package/dist/esm/constants/platform.js +0 -39
  214. package/dist/esm/constants/platform.js.map +0 -7
  215. package/dist/esm/constants/platform.native.js +0 -28
  216. package/dist/esm/constants/platform.native.js.map +0 -7
  217. package/dist/esm/helpers/createShallowUpdate.js +0 -20
  218. package/dist/esm/helpers/createShallowUpdate.js.map +0 -7
  219. package/dist/esm/helpers/validate.js +0 -1
  220. package/dist/esm/hooks/useDidFinishSSR.js +0 -35
  221. package/dist/esm/hooks/useDidFinishSSR.js.map +0 -7
  222. package/dist/esm/hooks/useIsSSR.js +0 -22
  223. package/dist/esm/hooks/useIsSSR.js.map +0 -7
  224. package/src/helpers/assignNativePropsToWeb.tsx +0 -178
  225. package/src/helpers/calc.ts +0 -68
  226. package/src/helpers/getFont.tsx +0 -43
  227. package/src/helpers/getStackSize.ts +0 -22
  228. package/src/helpers/startTransition.ts +0 -4
  229. package/src/hooks/useConstant.tsx +0 -19
  230. package/src/hooks/useIsMounted.ts +0 -16
  231. package/src/hooks/usePressable.tsx +0 -9
  232. package/src/hooks/useUnmountEffect.ts +0 -5
@@ -1,11 +1,15 @@
1
1
  import { isClient, isRSC, isWeb, useIsomorphicLayoutEffect } from '@tamagui/constants'
2
2
  import { stylePropsText, stylePropsTransform, validPseudoKeys, validStyles } from '@tamagui/helpers'
3
+ import type { ViewStyle } from '@tamagui/types-react-native'
3
4
  import { useInsertionEffect } from 'react'
4
- import type { ViewStyle } from 'react-native'
5
5
 
6
6
  import { getConfig } from '../config'
7
7
  import { isDevTools } from '../constants/isDevTools'
8
- import { mediaState as globalMediaState, mediaQueryConfig } from '../hooks/useMedia'
8
+ import {
9
+ mediaState as globalMediaState,
10
+ mediaQueryConfig,
11
+ mergeMediaByImportance,
12
+ } from '../hooks/useMedia'
9
13
  import type {
10
14
  DebugProp,
11
15
  MediaQueryKey,
@@ -20,6 +24,7 @@ import type {
20
24
  import { FontLanguageProps, LanguageContextType } from '../views/FontLanguage.types'
21
25
  import { createMediaStyle } from './createMediaStyle'
22
26
  import { getPropMappedFontFamily } from './createPropMapper'
27
+ import { createProxy } from './createProxy'
23
28
  import { fixStyles } from './expandStyles'
24
29
  import { getAtomicStyle, getStylesAtomic, styleToCSS } from './getStylesAtomic'
25
30
  import {
@@ -31,9 +36,11 @@ import {
31
36
  updateInserted,
32
37
  updateRules,
33
38
  } from './insertStyleRule'
34
- import { mergeProps } from './mergeProps'
35
39
  import { mergeTransform } from './mergeTransform'
36
- import { normalizeValueWithProperty } from './normalizeValueWithProperty.js'
40
+ import {
41
+ normalizeValueWithProperty,
42
+ reverseMapClassNameToValue,
43
+ } from './normalizeValueWithProperty.js'
37
44
  import { pseudoDescriptors } from './pseudoDescriptors'
38
45
 
39
46
  export type SplitStyles = ReturnType<typeof getSplitStyles>
@@ -45,12 +52,13 @@ const skipProps = {
45
52
  animateOnly: true,
46
53
  debug: true,
47
54
  componentName: true,
55
+ role: true,
56
+ tag: true,
48
57
  }
49
58
 
50
59
  // native only skips
51
60
  if (process.env.TAMAGUI_TARGET === 'native') {
52
61
  Object.assign(skipProps, {
53
- tag: true,
54
62
  whiteSpace: true,
55
63
  wordWrap: true,
56
64
  textOverflow: true,
@@ -64,37 +72,93 @@ if (process.env.TAMAGUI_TARGET === 'native') {
64
72
  })
65
73
  }
66
74
 
75
+ // web only maps accessibility to aria props
76
+ const accessibilityDirectMap: Record<string, string> = {}
77
+ if (process.env.TAMAGUI_TARGET === 'web') {
78
+ // bundle size shave
79
+ const items = {
80
+ Hidden: true,
81
+ ActiveDescendant: true,
82
+ Atomic: true,
83
+ AutoComplete: true,
84
+ Busy: true,
85
+ Checked: true,
86
+ ColumnCount: 'colcount',
87
+ ColumnIndex: 'colindex',
88
+ ColumnSpan: 'colspan',
89
+ Current: true,
90
+ Details: true,
91
+ ErrorMessage: true,
92
+ Expanded: true,
93
+ HasPopup: true,
94
+ Invalid: true,
95
+ Label: true,
96
+ Level: true,
97
+ Modal: true,
98
+ Multiline: true,
99
+ MultiSelectable: true,
100
+ Orientation: true,
101
+ Owns: true,
102
+ Placeholder: true,
103
+ PosInSet: true,
104
+ Pressed: true,
105
+ RoleDescription: true,
106
+ RowCount: true,
107
+ RowIndex: true,
108
+ RowSpan: true,
109
+ Selected: true,
110
+ SetSize: true,
111
+ Sort: true,
112
+ ValueMax: true,
113
+ ValueMin: true,
114
+ ValueNow: true,
115
+ ValueText: true,
116
+ }
117
+ for (const key in items) {
118
+ let val = items[key]
119
+ if (val === true) {
120
+ val = key.toLowerCase()
121
+ }
122
+ accessibilityDirectMap[`accessibility${key}`] = `aria-${val}`
123
+ }
124
+ }
125
+
67
126
  type TransformNamespaceKey = 'transform' | PseudoPropKeys | MediaQueryKey
68
127
 
69
128
  let conf: TamaguiInternalConfig
70
129
 
71
- type StyleSplitter = (
72
- props: { [key: string]: any },
73
- staticConfig: StaticConfigParsed,
74
- theme: ThemeParsed,
75
- state: SplitStyleState,
76
- defaultClassNames?: any,
77
- languageContext?: LanguageContextType,
78
- debug?: DebugProp
79
- ) => {
130
+ type SplitStylesAndProps = {
80
131
  pseudos: PseudoStyles
81
132
  medias: Record<MediaQueryKey, ViewStyle>
82
133
  style: ViewStyle
83
134
  classNames: ClassNamesObject
84
135
  rulesToInsert: RulesToInsert
85
- viewProps: StackProps
136
+ viewProps: StackProps & Record<string, any>
86
137
  fontFamily: string | undefined
87
138
  mediaKeys: string[]
88
139
  }
89
140
 
141
+ type StyleSplitter = (
142
+ props: { [key: string]: any },
143
+ staticConfig: StaticConfigParsed,
144
+ theme: ThemeParsed,
145
+ state: SplitStyleState,
146
+ parentSplitStyles?: SplitStylesAndProps | null,
147
+ languageContext?: LanguageContextType,
148
+ // web-only
149
+ elementType?: string,
150
+ debug?: DebugProp
151
+ ) => SplitStylesAndProps
152
+
90
153
  export const PROP_SPLIT = '-'
91
154
 
92
- // this is how compiler outputs psueodo identifier
93
- // TODO remove in next refactor
94
- export const pseudoCNInverse = {
95
- hover: 'hoverStyle',
96
- focus: 'focusStyle',
97
- press: 'pressStyle',
155
+ const accessibilityRoleToWebRole = {
156
+ adjustable: 'slider',
157
+ header: 'heading',
158
+ image: 'img',
159
+ link: 'link',
160
+ none: 'presentation',
161
+ summary: 'region',
98
162
  }
99
163
 
100
164
  // loop props backwards
@@ -104,37 +168,36 @@ export const pseudoCNInverse = {
104
168
  // const styles = {}
105
169
  // const classNames = {}
106
170
 
171
+ const isMediaKey = (key: string) => Boolean(key[0] === '$' && mediaQueryConfig[key.slice(1)])
172
+
107
173
  export const getSplitStyles: StyleSplitter = (
108
174
  props,
109
175
  staticConfig,
110
176
  theme,
111
177
  state,
112
- defaultClassNames,
178
+ parentSplitStyles,
113
179
  languageContext,
180
+ elementType,
114
181
  debug
115
182
  ) => {
116
183
  conf = conf || getConfig()
117
184
  const validStyleProps = staticConfig.isText ? stylePropsText : validStyles
118
185
  const mediaKeys: string[] = []
119
- const viewProps: StackProps = {}
186
+ const viewProps: SplitStylesAndProps['viewProps'] = {}
120
187
  const pseudos: PseudoStyles = {}
121
188
  const medias: Record<MediaQueryKey, ViewStyle> = {}
122
189
  const mediaState = state.mediaState || globalMediaState
123
- const usedKeys = new Set<string>()
190
+ const usedKeys: Record<string, number> = {}
124
191
  const propKeys = Object.keys(props)
192
+
125
193
  const shouldDoClasses =
126
194
  staticConfig.acceptsClassName &&
127
195
  (isWeb || process.env.IS_STATIC === 'is_static') &&
128
- !state.noClassNames &&
129
- !props.animation
196
+ !state.noClassNames
197
+
130
198
  const len = propKeys.length
131
199
  const rulesToInsert: RulesToInsert = []
132
200
  const style: ViewStyle = {}
133
- // TODO make this CSS, not compile-friendly
134
- if (state.hasTextAncestor) {
135
- // parity with react-native-web
136
- style.display = 'inline-flex' as any
137
- }
138
201
  const classNames: ClassNamesObject = {}
139
202
  // we need to gather these specific to each media query / pseudo
140
203
  // value is [hash, val], so ["-jnjad-asdnjk", "scaleX(1) rotate(10deg)"]
@@ -153,30 +216,119 @@ export const getSplitStyles: StyleSplitter = (
153
216
  keyInit = expandedKey
154
217
  }
155
218
 
156
- if (usedKeys.has(keyInit)) continue
219
+ if (usedKeys[keyInit]) continue
157
220
  if (skipProps[keyInit]) continue
158
221
  if (!isWeb && keyInit.startsWith('data-')) continue
159
222
 
160
223
  if (keyInit === 'style' || keyInit.startsWith('_style')) {
161
224
  if (!valInit) continue
162
- for (const key in valInit) {
163
- if (usedKeys.has(key)) continue
164
- if (valInit && typeof valInit === 'object') {
165
- // newer react native versions return a full object instead of ID
166
- for (const skey in valInit) {
167
- if (usedKeys.has(skey)) continue
168
- usedKeys.add(skey)
169
- style[skey] = valInit[skey]
170
- }
171
- } else {
172
- usedKeys.add(key)
173
- style[key] = valInit
225
+ const styles = Array.isArray(valInit) ? valInit : [valInit]
226
+ const styleLen = styles.length
227
+ for (let j = styleLen; j >= 0; j--) {
228
+ const cur = styles[j]
229
+ if (!cur) continue
230
+ for (const key in cur) {
231
+ if (usedKeys[key]) continue
232
+ usedKeys[key] = 1
233
+ style[key] = cur[key]
174
234
  }
175
235
  }
176
236
  continue
177
237
  }
178
238
 
179
239
  if (process.env.TAMAGUI_TARGET === 'web') {
240
+ /**
241
+ * Copying in the accessibility/prop handling from react-native-web here
242
+ * Keeps it in a single loop, avoids dup de-structuring to avoid bundle size
243
+ */
244
+ if (keyInit === 'disabled' && valInit === true) {
245
+ usedKeys[keyInit] = 1
246
+ viewProps['aria-disabled'] = true
247
+ // Enhance with native semantics
248
+ if (
249
+ elementType === 'button' ||
250
+ elementType === 'form' ||
251
+ elementType === 'input' ||
252
+ elementType === 'select' ||
253
+ elementType === 'textarea'
254
+ ) {
255
+ viewProps.disabled = true
256
+ }
257
+ continue
258
+ }
259
+
260
+ if (accessibilityDirectMap[keyInit]) {
261
+ viewProps[accessibilityDirectMap[keyInit]] = valInit
262
+ usedKeys[keyInit] = 1
263
+ continue
264
+ }
265
+
266
+ let didUseKeyInit = true
267
+ switch (keyInit) {
268
+ case 'nativeID': {
269
+ viewProps.id = valInit
270
+ break
271
+ }
272
+ case 'accessibilityRole': {
273
+ if (valInit === 'none') {
274
+ viewProps.role = 'presentation'
275
+ } else {
276
+ viewProps.role = accessibilityRoleToWebRole[valInit] || valInit
277
+ }
278
+ break
279
+ }
280
+ case 'accessibilityControls': {
281
+ viewProps['aria-controls'] = processIDRefList(valInit)
282
+ break
283
+ }
284
+ case 'accessibilityDescribedBy': {
285
+ viewProps['aria-describedby'] = processIDRefList(valInit)
286
+ break
287
+ }
288
+ case 'accessibilityFlowTo': {
289
+ viewProps['aria-flowto'] = processIDRefList(valInit)
290
+ break
291
+ }
292
+ case 'accessibilityLabelledBy': {
293
+ viewProps['aria-labelledby'] = processIDRefList(valInit)
294
+ break
295
+ }
296
+ case 'accessibilityKeyShortcuts': {
297
+ if (Array.isArray(valInit)) {
298
+ viewProps['aria-keyshortcuts'] = valInit.join(' ')
299
+ }
300
+ break
301
+ }
302
+ case 'accessibilityLiveRegion': {
303
+ viewProps['aria-live'] = valInit === 'none' ? 'off' : valInit
304
+ break
305
+ }
306
+ case 'accessibilityReadOnly': {
307
+ viewProps['aria-readonly'] = valInit
308
+ // Enhance with native semantics
309
+ if (elementType === 'input' || elementType === 'select' || elementType === 'textarea') {
310
+ viewProps.readOnly = true
311
+ }
312
+ break
313
+ }
314
+ case 'accessibilityRequired': {
315
+ viewProps['aria-required'] = valInit
316
+ // Enhance with native semantics
317
+ if (elementType === 'input' || elementType === 'select' || elementType === 'textarea') {
318
+ viewProps.required = true
319
+ }
320
+ break
321
+ }
322
+ default: {
323
+ didUseKeyInit = false
324
+ }
325
+ }
326
+
327
+ if (didUseKeyInit) {
328
+ usedKeys[keyInit] = 1
329
+ continue
330
+ }
331
+
180
332
  if (keyInit === 'className') {
181
333
  let nonTamaguis = ''
182
334
  if (!valInit) continue
@@ -198,14 +350,14 @@ export const getSplitStyles: StyleSplitter = (
198
350
  const pseudoShortKey = mediaOrPseudo.slice(1)
199
351
  fullKey += `${PROP_SPLIT}${pseudoShortKey}`
200
352
  }
201
- usedKeys.add(fullKey)
353
+ usedKeys[fullKey] = 1
202
354
  mergeClassName(transforms, classNames, fullKey, cn, isMediaOrPseudo)
203
355
  } else {
204
356
  nonTamaguis += ' ' + cn
205
357
  }
206
358
  }
207
359
  if (nonTamaguis) {
208
- usedKeys.add(keyInit)
360
+ usedKeys[keyInit] = 1
209
361
  mergeClassName(transforms, classNames, keyInit, nonTamaguis)
210
362
  }
211
363
  continue
@@ -220,7 +372,7 @@ export const getSplitStyles: StyleSplitter = (
220
372
  keyInit.includes(PROP_SPLIT) &&
221
373
  validStyles[keyInit.split(PROP_SPLIT)[0]]
222
374
  if (isValidClassName || isMediaOrPseudo) {
223
- usedKeys.add(keyInit)
375
+ usedKeys[keyInit] = 1
224
376
  mergeClassName(transforms, classNames, keyInit, valInit, isMediaOrPseudo)
225
377
  continue
226
378
  }
@@ -245,9 +397,8 @@ export const getSplitStyles: StyleSplitter = (
245
397
  * for if there's a pseudo/media returned from it.
246
398
  */
247
399
 
248
- let isMedia = keyInit[0] === '$'
400
+ let isMedia = isMediaKey(keyInit)
249
401
  let isPseudo = validPseudoKeys[keyInit]
250
- let isMediaOrPseudo = isMedia || isPseudo
251
402
 
252
403
  if (
253
404
  !isMedia &&
@@ -256,7 +407,7 @@ export const getSplitStyles: StyleSplitter = (
256
407
  !validStyleProps[keyInit] &&
257
408
  !conf.shorthands[keyInit]
258
409
  ) {
259
- usedKeys.add(keyInit)
410
+ usedKeys[keyInit] = 1
260
411
  viewProps[keyInit] = valInit
261
412
  continue
262
413
  }
@@ -285,35 +436,35 @@ export const getSplitStyles: StyleSplitter = (
285
436
  }
286
437
 
287
438
  if (process.env.NODE_ENV === 'development' && debug === 'verbose') {
288
- // eslint-disable-next-line no-console
289
- console.log('expanded', expanded)
290
- // eslint-disable-next-line no-console
291
- console.log('usedKeys', [...usedKeys])
439
+ if (isClient) {
440
+ // eslint-disable-next-line no-console
441
+ console.log('expanded', expanded)
442
+ // eslint-disable-next-line no-console
443
+ console.log('usedKeys', usedKeys)
444
+ }
292
445
  // eslint-disable-next-line no-console
293
446
  console.groupEnd()
294
447
  }
295
448
 
296
- if (!expanded) {
297
- continue
298
- }
449
+ if (!expanded) continue
299
450
 
300
451
  for (const [key, val] of expanded) {
301
452
  if (val === undefined) continue
302
453
 
303
- isMedia = key[0] === '$'
454
+ isMedia = isMediaKey(key)
304
455
  isPseudo = validPseudoKeys[key]
305
- isMediaOrPseudo = isMedia || isPseudo
456
+ const isMediaOrPseudo = isMedia || isPseudo
306
457
 
307
- if (!isMediaOrPseudo) {
308
- if (usedKeys.has(key)) continue
458
+ if (!isMediaOrPseudo && usedKeys[key]) {
459
+ continue
309
460
  }
310
461
 
311
462
  if (
312
- (staticConfig.deoptProps && staticConfig.deoptProps.has(key)) ||
313
- (staticConfig.inlineProps && staticConfig.inlineProps.has(key)) ||
314
- (staticConfig.inlineWhenUnflattened && staticConfig.inlineWhenUnflattened.has(key))
463
+ staticConfig.deoptProps?.has(key) ||
464
+ staticConfig.inlineProps?.has(key) ||
465
+ staticConfig.inlineWhenUnflattened?.has(key)
315
466
  ) {
316
- usedKeys.add(key)
467
+ usedKeys[key] = 1
317
468
  viewProps[key] = props[key] ?? val
318
469
  }
319
470
 
@@ -324,7 +475,7 @@ export const getSplitStyles: StyleSplitter = (
324
475
  // once mounted we can ignore enterStyle
325
476
  continue
326
477
  }
327
- pseudos[key] = pseudos[key] || {}
478
+ pseudos[key] ??= {}
328
479
  const pseudoStyleObject = getSubStyle(
329
480
  key,
330
481
  val,
@@ -342,17 +493,23 @@ export const getSplitStyles: StyleSplitter = (
342
493
  ...pseudos[key],
343
494
  }
344
495
 
345
- if (shouldDoClasses && key !== 'enterStyle' && key !== 'exitStyle') {
496
+ if (key === 'enterStyle' || key === 'exitStyle') {
497
+ continue
498
+ }
499
+
500
+ if (shouldDoClasses) {
346
501
  const pseudoStyles = getAtomicStyle(pseudoStyleObject, pseudoDescriptors[key])
347
502
  for (const style of pseudoStyles) {
348
503
  const postfix = pseudoDescriptors[key]?.name || key // exitStyle/enterStyle dont have pseudoDescriptors
349
504
  const fullKey = `${style.property}${PROP_SPLIT}${postfix}`
350
- if (!usedKeys.has(fullKey)) {
351
- usedKeys.add(fullKey)
505
+ if (!usedKeys[fullKey]) {
506
+ usedKeys[fullKey] = 1
352
507
  addStyleToInsertRules(rulesToInsert, style)
353
508
  mergeClassName(transforms, classNames, fullKey, style.identifier, isMediaOrPseudo)
354
509
  }
355
510
  }
511
+ } else {
512
+ // need same treatment as media (individual merge + importance) + can avoid calling getSubStyle entirely when state = off
356
513
  }
357
514
  continue
358
515
  }
@@ -361,29 +518,11 @@ export const getSplitStyles: StyleSplitter = (
361
518
  if (isMedia) {
362
519
  const mediaKey = key
363
520
  const mediaKeyShort = mediaKey.slice(1)
364
-
365
521
  mediaKeys.push(mediaKeyShort)
366
522
 
367
- if (!mediaQueryConfig[mediaKeyShort]) {
368
- if (process.env.NODE_ENV === 'development' && debug) {
369
- // eslint-disable-next-line no-console
370
- console.warn(
371
- `Warning: using a $ prefixed prop that doesn't match to a media query, may be an error`,
372
- key
373
- )
374
- }
375
- if (!usedKeys.has(key)) {
376
- // this isn't a media key, pass through
377
- viewProps[key] = val
378
- }
379
- continue
380
- }
381
-
382
- // dont check if media is active, we just apply *all* media styles
383
- // we combine the media props on top regular props, could proxy this
384
- // TODO test proxy here instead of merge
385
523
  // THIS USED TO PROXY BACK TO REGULAR PROPS BUT THAT IS THE WRONG BEHAVIOR
386
524
  // we avoid passing in default props for media queries because that would confuse things like SizableText.size:
525
+
387
526
  const mediaStyle = getSubStyle(
388
527
  key,
389
528
  val,
@@ -406,29 +545,17 @@ export const getSplitStyles: StyleSplitter = (
406
545
  for (const style of mediaStyles) {
407
546
  const out = createMediaStyle(style, mediaKeyShort, mediaQueryConfig)
408
547
  const fullKey = `${style.property}${PROP_SPLIT}${mediaKeyShort}`
409
- if (!usedKeys.has(fullKey)) {
410
- usedKeys.add(fullKey)
548
+ if (!usedKeys[fullKey]) {
549
+ usedKeys[fullKey] = 1
411
550
  addStyleToInsertRules(rulesToInsert, out)
412
551
  mergeClassName(transforms, classNames, fullKey, out.identifier, true)
413
552
  }
414
553
  }
415
- } else {
416
- if (mediaState[mediaKeyShort]) {
417
- if (process.env.NODE_ENV === 'development' && debug) {
418
- // eslint-disable-next-line no-console
419
- console.log('apply media style', mediaKey, mediaState)
420
- }
421
- if (shouldDoClasses) {
422
- Object.assign(medias, mediaStyle)
423
- } else {
424
- for (const key in mediaStyle) {
425
- // TODO we should likely account for importance here to match CSS, right??
426
- usedKeys.add(key)
427
- style[key] = mediaStyle[key]
428
- if (key === 'fontFamily') {
429
- fontFamily = mediaStyle[key]
430
- }
431
- }
554
+ } else if (mediaState[mediaKeyShort]) {
555
+ for (const key in mediaStyle) {
556
+ const didMerge = mergeMediaByImportance(style, key, mediaStyle[key], usedKeys)
557
+ if (didMerge && key === 'fontFamily') {
558
+ fontFamily = mediaStyle[key]
432
559
  }
433
560
  }
434
561
  }
@@ -436,7 +563,7 @@ export const getSplitStyles: StyleSplitter = (
436
563
  }
437
564
 
438
565
  if (!isWeb && key === 'pointerEvents') {
439
- usedKeys.add(key)
566
+ usedKeys[key] = 1
440
567
  viewProps[key] = val
441
568
  continue
442
569
  }
@@ -446,7 +573,7 @@ export const getSplitStyles: StyleSplitter = (
446
573
  }
447
574
 
448
575
  if (validStyleProps[key]) {
449
- usedKeys.add(key)
576
+ usedKeys[key] = 1
450
577
  if (val && val[0] === '_') {
451
578
  classNames[key] = val
452
579
  } else if (key in stylePropsTransform) {
@@ -461,7 +588,7 @@ export const getSplitStyles: StyleSplitter = (
461
588
  if (!staticConfig.variants || !(key in staticConfig.variants)) {
462
589
  if (!skipProps[key]) {
463
590
  viewProps[key] = val
464
- usedKeys.add(key)
591
+ usedKeys[key] = 1
465
592
  }
466
593
  }
467
594
  }
@@ -473,10 +600,23 @@ export const getSplitStyles: StyleSplitter = (
473
600
  }
474
601
 
475
602
  // add in defaults if not set:
476
- if (defaultClassNames) {
477
- for (const key in defaultClassNames) {
478
- if (!(key in classNames)) {
479
- classNames[key] = defaultClassNames[key]
603
+ if (parentSplitStyles) {
604
+ if (process.env.TAMAGUI_TARGET === 'web') {
605
+ for (const key in parentSplitStyles.classNames) {
606
+ if (key in classNames) continue
607
+ if (key in style) continue
608
+ const val = parentSplitStyles.classNames[key]
609
+ if (!shouldDoClasses) {
610
+ style[key] = reverseMapClassNameToValue(key, val)
611
+ } else {
612
+ classNames[key] = val
613
+ }
614
+ }
615
+ }
616
+ if (!shouldDoClasses) {
617
+ for (const key in parentSplitStyles.style) {
618
+ if (key in style) continue
619
+ style[key] = parentSplitStyles.style[key]
480
620
  }
481
621
  }
482
622
  }
@@ -490,44 +630,7 @@ export const getSplitStyles: StyleSplitter = (
490
630
  mergeClassName(transforms, classNames, key, atomicStyle.identifier)
491
631
  }
492
632
  }
493
- }
494
-
495
- // else {
496
- // if (classNames && state.resolveVariablesAs === 'value') {
497
- // getting real values for colors for animations (reverse mapped from CSS)
498
- // this isn't beautiful, but will do relatively fine performance for now
499
- // has a bug still - try adding <Switch theme="bouncy" /> should animate bg color on active
500
- // const selectors = getAllSelectors()
501
- // for (const key in classNames) {
502
- // if (key.endsWith('Color')) {
503
- // const selector = classNames[key]
504
- // let value = selectorValuesCache[selector]
505
- // if (!value) {
506
- // const css = selectors[selector]
507
- // value = css.replace(/.*:/, '').replace(/;.*/, '')
508
- // if (value) {
509
- // const themeUnwrapped = getThemeUnwrapped(theme)
510
- // const map = themeToVariableToValueMap.get(themeUnwrapped)
511
- // if (map && value.startsWith('var(')) {
512
- // value = map[value]
513
- // }
514
- // if (value) {
515
- // selectorValuesCache[selector] = value
516
- // }
517
- // } else {
518
- // // err
519
- // continue
520
- // }
521
- // }
522
- // if (value) {
523
- // style[key] = value
524
- // }
525
- // }
526
- // }
527
- // }
528
- // }
529
633
 
530
- if (process.env.TAMAGUI_TARGET === 'web') {
531
634
  if (transforms) {
532
635
  for (const namespace in transforms) {
533
636
  if (!transforms[namespace]) {
@@ -654,7 +757,7 @@ function getSubStyleProxiedProps(defaultProps: Object, baseProps: Object, specif
654
757
  if (propProxies.has(specificProps)) {
655
758
  return propProxies.get(specificProps)
656
759
  }
657
- const next = new Proxy(specificProps, {
760
+ const next = createProxy(specificProps, {
658
761
  has(_, key) {
659
762
  return key in defaultProps || key in specificProps || key in baseProps
660
763
  },
@@ -735,3 +838,7 @@ function addStyleToInsertRules(rulesToInsert: RulesToInsert, styleObject: Partia
735
838
  rulesToInsert.push(styleObject)
736
839
  }
737
840
  }
841
+
842
+ function processIDRefList(idRefList: string | Array<string>): string {
843
+ return Array.isArray(idRefList) ? idRefList.join(' ') : idRefList
844
+ }