@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.
- package/dist/cjs/Tamagui.js +4 -2
- package/dist/cjs/Tamagui.js.map +2 -2
- package/dist/cjs/config.js +1 -2
- package/dist/cjs/config.js.map +2 -2
- package/dist/cjs/constants/constants.js +13 -8
- package/dist/cjs/constants/constants.js.map +2 -2
- package/dist/cjs/contexts/TextAncestorContext.js +3 -16
- package/dist/cjs/contexts/TextAncestorContext.js.map +3 -3
- package/dist/cjs/createComponent.js +196 -284
- package/dist/cjs/createComponent.js.map +2 -2
- package/dist/cjs/createTamagui.js +15 -16
- package/dist/cjs/createTamagui.js.map +3 -3
- package/dist/cjs/createVariable.js +1 -2
- package/dist/cjs/createVariable.js.map +2 -2
- package/dist/cjs/helpers/ThemeManager.js +7 -14
- package/dist/cjs/helpers/ThemeManager.js.map +2 -2
- package/dist/cjs/helpers/{createShallowUpdate.js → cache.js} +20 -21
- package/dist/cjs/helpers/cache.js.map +7 -0
- package/dist/cjs/helpers/createMediaStyle.js +14 -8
- package/dist/cjs/helpers/createMediaStyle.js.map +2 -2
- package/dist/cjs/helpers/extendStaticConfig.js +0 -1
- package/dist/cjs/helpers/extendStaticConfig.js.map +2 -2
- package/dist/cjs/helpers/getSplitStyles.js +214 -94
- package/dist/cjs/helpers/getSplitStyles.js.map +3 -3
- package/dist/cjs/helpers/getStylesAtomic.js +16 -36
- package/dist/cjs/helpers/getStylesAtomic.js.map +3 -3
- package/dist/cjs/helpers/getVariantExtras.js +2 -1
- package/dist/cjs/helpers/getVariantExtras.js.map +2 -2
- package/dist/cjs/helpers/insertStyleRule.js +14 -6
- package/dist/cjs/helpers/insertStyleRule.js.map +2 -2
- package/dist/cjs/helpers/matchMedia.js.map +2 -2
- package/dist/cjs/helpers/mergeTransform.js.map +1 -1
- package/dist/cjs/helpers/normalizeValueWithProperty.js +32 -2
- package/dist/cjs/helpers/normalizeValueWithProperty.js.map +2 -2
- package/dist/cjs/helpers/proxyThemeVariables.js +2 -7
- package/dist/cjs/helpers/proxyThemeVariables.js.map +2 -2
- package/dist/cjs/helpers/useShallowSetState.js.map +2 -2
- package/dist/cjs/hooks/getThemeUnwrapped.js +1 -3
- package/dist/cjs/hooks/getThemeUnwrapped.js.map +2 -2
- package/dist/cjs/hooks/useElementLayout.js +92 -0
- package/dist/cjs/hooks/useElementLayout.js.map +7 -0
- package/dist/cjs/hooks/useIsTouchDevice.js +2 -10
- package/dist/cjs/hooks/useIsTouchDevice.js.map +2 -2
- package/dist/cjs/hooks/useMedia.js +79 -85
- package/dist/cjs/hooks/useMedia.js.map +2 -2
- package/dist/cjs/hooks/useMedia.test.js +2 -0
- package/dist/cjs/{helpers/validate.js.map → hooks/useMedia.test.js.map} +0 -0
- package/dist/cjs/hooks/usePressablePressResponder.js +370 -0
- package/dist/cjs/hooks/usePressablePressResponder.js.map +7 -0
- package/dist/cjs/hooks/useSafeRef.js +13 -15
- package/dist/cjs/hooks/useSafeRef.js.map +2 -2
- package/dist/cjs/hooks/useTheme.js +5 -5
- package/dist/cjs/hooks/useTheme.js.map +2 -2
- package/dist/cjs/index.js +1 -17
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/static.js +0 -20
- package/dist/cjs/static.js.map +2 -2
- package/dist/cjs/styled.js +4 -22
- package/dist/cjs/styled.js.map +2 -2
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/{hooks/useIsSSR.js → views/AbsoluteFill.js} +18 -23
- package/dist/cjs/views/AbsoluteFill.js.map +7 -0
- package/dist/cjs/views/AbsoluteFill.native.js +45 -0
- package/dist/cjs/views/AbsoluteFill.native.js.map +7 -0
- package/dist/cjs/views/FontLanguage.native.js.map +2 -2
- package/dist/cjs/views/Stack.js.map +1 -1
- package/dist/cjs/views/TamaguiProvider.js +3 -2
- package/dist/cjs/views/TamaguiProvider.js.map +2 -2
- package/dist/cjs/views/Text.js.map +1 -1
- package/dist/cjs/views/ThemeReset.js +10 -10
- package/dist/cjs/views/ThemeReset.js.map +2 -2
- package/dist/esm/Tamagui.js +4 -2
- package/dist/esm/Tamagui.js.map +2 -2
- package/dist/esm/config.js +1 -2
- package/dist/esm/config.js.map +2 -2
- package/dist/esm/constants/constants.js +11 -7
- package/dist/esm/constants/constants.js.map +2 -2
- package/dist/esm/contexts/TextAncestorContext.js +2 -13
- package/dist/esm/contexts/TextAncestorContext.js.map +2 -2
- package/dist/esm/createComponent.js +195 -286
- package/dist/esm/createComponent.js.map +2 -2
- package/dist/esm/createTamagui.js +15 -16
- package/dist/esm/createTamagui.js.map +3 -3
- package/dist/esm/createVariable.js +1 -2
- package/dist/esm/createVariable.js.map +2 -2
- package/dist/esm/helpers/ThemeManager.js +7 -14
- package/dist/esm/helpers/ThemeManager.js.map +2 -2
- package/dist/esm/helpers/cache.js +18 -0
- package/dist/esm/helpers/cache.js.map +7 -0
- package/dist/esm/helpers/createMediaStyle.js +14 -8
- package/dist/esm/helpers/createMediaStyle.js.map +2 -2
- package/dist/esm/helpers/extendStaticConfig.js +0 -1
- package/dist/esm/helpers/extendStaticConfig.js.map +2 -2
- package/dist/esm/helpers/getSplitStyles.js +223 -95
- package/dist/esm/helpers/getSplitStyles.js.map +3 -3
- package/dist/esm/helpers/getStylesAtomic.js +13 -26
- package/dist/esm/helpers/getStylesAtomic.js.map +2 -2
- package/dist/esm/helpers/getVariantExtras.js +2 -1
- package/dist/esm/helpers/getVariantExtras.js.map +2 -2
- package/dist/esm/helpers/insertStyleRule.js +14 -6
- package/dist/esm/helpers/insertStyleRule.js.map +2 -2
- package/dist/esm/helpers/matchMedia.js.map +2 -2
- package/dist/esm/helpers/mergeTransform.js.map +1 -1
- package/dist/esm/helpers/normalizeValueWithProperty.js +30 -1
- package/dist/esm/helpers/normalizeValueWithProperty.js.map +2 -2
- package/dist/esm/helpers/proxyThemeVariables.js +2 -7
- package/dist/esm/helpers/proxyThemeVariables.js.map +2 -2
- package/dist/esm/helpers/useShallowSetState.js.map +2 -2
- package/dist/esm/hooks/getThemeUnwrapped.js +1 -3
- package/dist/esm/hooks/getThemeUnwrapped.js.map +2 -2
- package/dist/esm/hooks/useElementLayout.js +66 -0
- package/dist/esm/hooks/useElementLayout.js.map +7 -0
- package/dist/esm/hooks/useIsTouchDevice.js +3 -11
- package/dist/esm/hooks/useIsTouchDevice.js.map +2 -2
- package/dist/esm/hooks/useMedia.js +76 -84
- package/dist/esm/hooks/useMedia.js.map +2 -2
- package/dist/esm/hooks/useMedia.test.js +1 -0
- package/dist/esm/{helpers/validate.js.map → hooks/useMedia.test.js.map} +0 -0
- package/dist/esm/hooks/usePressablePressResponder.js +346 -0
- package/dist/esm/hooks/usePressablePressResponder.js.map +7 -0
- package/dist/esm/hooks/useSafeRef.js +13 -15
- package/dist/esm/hooks/useSafeRef.js.map +2 -2
- package/dist/esm/hooks/useTheme.js +5 -5
- package/dist/esm/hooks/useTheme.js.map +2 -2
- package/dist/esm/index.js +1 -14
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/static.js +0 -14
- package/dist/esm/static.js.map +2 -2
- package/dist/esm/styled.js +4 -22
- package/dist/esm/styled.js.map +2 -2
- package/dist/esm/views/AbsoluteFill.js +17 -0
- package/dist/esm/views/AbsoluteFill.js.map +7 -0
- package/dist/esm/views/AbsoluteFill.native.js +21 -0
- package/dist/esm/views/AbsoluteFill.native.js.map +7 -0
- package/dist/esm/views/FontLanguage.native.js.map +2 -2
- package/dist/esm/views/Stack.js.map +1 -1
- package/dist/esm/views/TamaguiProvider.js +5 -4
- package/dist/esm/views/TamaguiProvider.js.map +2 -2
- package/dist/esm/views/Text.js.map +1 -1
- package/dist/esm/views/ThemeReset.js +10 -10
- package/dist/esm/views/ThemeReset.js.map +2 -2
- package/package.json +14 -14
- package/src/Tamagui.ts +7 -3
- package/src/config.ts +2 -3
- package/src/constants/constants.ts +10 -6
- package/src/contexts/TextAncestorContext.tsx +1 -8
- package/src/createComponent.tsx +250 -412
- package/src/createTamagui.ts +16 -19
- package/src/createVariable.ts +1 -3
- package/src/helpers/ThemeManager.tsx +7 -15
- package/src/helpers/cache.ts +18 -0
- package/src/helpers/createMediaStyle.ts +16 -9
- package/src/helpers/createProxy.ts +16 -0
- package/src/helpers/extendStaticConfig.ts +0 -1
- package/src/helpers/getSplitStyles.tsx +259 -152
- package/src/helpers/getStylesAtomic.ts +14 -34
- package/src/helpers/getVariantExtras.tsx +2 -1
- package/src/helpers/insertStyleRule.tsx +16 -8
- package/src/helpers/matchMedia.ts +1 -0
- package/src/helpers/mergeTransform.ts +1 -1
- package/src/helpers/normalizeValueWithProperty.ts +30 -0
- package/src/helpers/proxyThemeVariables.tsx +3 -8
- package/src/helpers/useShallowSetState.tsx +0 -1
- package/src/hooks/getThemeUnwrapped.tsx +1 -2
- package/src/hooks/useElementLayout.tsx +90 -0
- package/src/hooks/useIsTouchDevice.tsx +3 -17
- package/src/hooks/useMedia.tsx +82 -88
- package/src/hooks/useSafeRef.ts +17 -18
- package/src/hooks/useTheme.tsx +6 -5
- package/src/index.ts +1 -11
- package/src/static.ts +0 -10
- package/src/styled.tsx +15 -33
- package/src/types.tsx +58 -55
- package/src/views/FontLanguage.native.tsx +1 -0
- package/src/views/Stack.tsx +1 -1
- package/src/views/TamaguiProvider.tsx +5 -5
- package/src/views/Text.tsx +1 -1
- package/src/views/ThemeReset.tsx +11 -11
- package/types/Tamagui.d.ts +6 -4
- package/types/constants/constants.d.ts +14 -3
- package/types/contexts/TextAncestorContext.d.ts +1 -3
- package/types/createComponent.d.ts +0 -15
- package/types/helpers/ThemeManager.d.ts +2 -3
- package/types/helpers/cache.d.ts +12 -0
- package/types/helpers/calc.d.ts +0 -16
- package/types/helpers/createMediaStyle.d.ts +1 -1
- package/types/helpers/createProxy.d.ts +2 -0
- package/types/helpers/getSplitStyles.d.ts +6 -10
- package/types/helpers/getStylesAtomic.d.ts +1 -5
- package/types/helpers/insertStyleRule.d.ts +2 -2
- package/types/helpers/mergeTransform.d.ts +1 -1
- package/types/helpers/normalizeValueWithProperty.d.ts +1 -0
- package/types/hooks/useElementLayout.d.ts +27 -0
- package/types/hooks/useMedia.d.ts +3 -1
- package/types/hooks/useMedia.test.d.ts +1 -0
- package/types/hooks/usePressablePressResponder.d.ts +84 -0
- package/types/index.d.ts +1 -11
- package/types/static.d.ts +0 -1
- package/types/types.d.ts +42 -44
- package/types/views/AbsoluteFill.d.ts +5 -0
- package/types/views/AbsoluteFill.native.d.ts +3 -0
- package/types/views/Stack.d.ts +1 -1
- package/types/views/Text.d.ts +1 -1
- package/dist/cjs/constants/platform.js +0 -74
- package/dist/cjs/constants/platform.js.map +0 -7
- package/dist/cjs/constants/platform.native.js +0 -62
- package/dist/cjs/constants/platform.native.js.map +0 -7
- package/dist/cjs/helpers/createShallowUpdate.js.map +0 -7
- package/dist/cjs/helpers/validate.js +0 -2
- package/dist/cjs/hooks/useDidFinishSSR.js +0 -60
- package/dist/cjs/hooks/useDidFinishSSR.js.map +0 -7
- package/dist/cjs/hooks/useIsSSR.js.map +0 -7
- package/dist/esm/constants/platform.js +0 -39
- package/dist/esm/constants/platform.js.map +0 -7
- package/dist/esm/constants/platform.native.js +0 -28
- package/dist/esm/constants/platform.native.js.map +0 -7
- package/dist/esm/helpers/createShallowUpdate.js +0 -20
- package/dist/esm/helpers/createShallowUpdate.js.map +0 -7
- package/dist/esm/helpers/validate.js +0 -1
- package/dist/esm/hooks/useDidFinishSSR.js +0 -35
- package/dist/esm/hooks/useDidFinishSSR.js.map +0 -7
- package/dist/esm/hooks/useIsSSR.js +0 -22
- package/dist/esm/hooks/useIsSSR.js.map +0 -7
- package/src/helpers/assignNativePropsToWeb.tsx +0 -178
- package/src/helpers/calc.ts +0 -68
- package/src/helpers/getFont.tsx +0 -43
- package/src/helpers/getStackSize.ts +0 -22
- package/src/helpers/startTransition.ts +0 -4
- package/src/hooks/useConstant.tsx +0 -19
- package/src/hooks/useIsMounted.ts +0 -16
- package/src/hooks/usePressable.tsx +0 -9
- 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 {
|
|
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 {
|
|
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
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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
|
|
454
|
+
isMedia = isMediaKey(key)
|
|
304
455
|
isPseudo = validPseudoKeys[key]
|
|
305
|
-
isMediaOrPseudo = isMedia || isPseudo
|
|
456
|
+
const isMediaOrPseudo = isMedia || isPseudo
|
|
306
457
|
|
|
307
|
-
if (!isMediaOrPseudo) {
|
|
308
|
-
|
|
458
|
+
if (!isMediaOrPseudo && usedKeys[key]) {
|
|
459
|
+
continue
|
|
309
460
|
}
|
|
310
461
|
|
|
311
462
|
if (
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
463
|
+
staticConfig.deoptProps?.has(key) ||
|
|
464
|
+
staticConfig.inlineProps?.has(key) ||
|
|
465
|
+
staticConfig.inlineWhenUnflattened?.has(key)
|
|
315
466
|
) {
|
|
316
|
-
usedKeys
|
|
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]
|
|
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 (
|
|
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
|
|
351
|
-
usedKeys
|
|
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
|
|
410
|
-
usedKeys
|
|
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
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
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 =
|
|
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
|
+
}
|