@tamagui/core 1.0.1-beta.219 → 1.0.1-beta.221

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 (302) hide show
  1. package/dist/cjs/addTheme.js +7 -10
  2. package/dist/cjs/addTheme.js.map +3 -3
  3. package/dist/cjs/config.js +8 -4
  4. package/dist/cjs/config.js.map +2 -2
  5. package/dist/cjs/{hooks/useUnmountEffect.js → contexts/ButtonNestingContext.js} +7 -9
  6. package/dist/cjs/contexts/ButtonNestingContext.js.map +7 -0
  7. package/dist/cjs/createComponent.js +63 -67
  8. package/dist/cjs/createComponent.js.map +3 -3
  9. package/dist/cjs/createFont.js +11 -4
  10. package/dist/cjs/createFont.js.map +2 -2
  11. package/dist/cjs/createFont.test.js +125 -0
  12. package/dist/cjs/createFont.test.js.map +7 -0
  13. package/dist/cjs/createTamagui.js +13 -12
  14. package/dist/cjs/createTamagui.js.map +2 -2
  15. package/dist/cjs/createTokens.js.map +2 -2
  16. package/dist/cjs/createTokens.test.js +27 -0
  17. package/dist/cjs/createTokens.test.js.map +7 -0
  18. package/dist/cjs/createVariable.js +4 -9
  19. package/dist/cjs/createVariable.js.map +2 -2
  20. package/dist/cjs/createVariable.test.js +7 -0
  21. package/dist/cjs/createVariable.test.js.map +7 -0
  22. package/dist/cjs/createVariables.js +6 -7
  23. package/dist/cjs/createVariables.js.map +2 -2
  24. package/dist/cjs/helpers/ThemeManager.js +161 -147
  25. package/dist/cjs/helpers/ThemeManager.js.map +3 -3
  26. package/dist/cjs/helpers/ThemeManager.test.js +449 -0
  27. package/dist/cjs/helpers/ThemeManager.test.js.map +7 -0
  28. package/dist/cjs/helpers/{getTokens.js → ThemeManagerContext.js} +8 -8
  29. package/dist/cjs/helpers/ThemeManagerContext.js.map +7 -0
  30. package/dist/cjs/helpers/createPropMapper.js +4 -4
  31. package/dist/cjs/helpers/createPropMapper.js.map +2 -2
  32. package/dist/cjs/helpers/extendStaticConfig.js +2 -4
  33. package/dist/cjs/helpers/extendStaticConfig.js.map +2 -2
  34. package/dist/cjs/helpers/{assignNativePropsToWeb.native.js → getBoundingClientRect.js} +15 -8
  35. package/dist/cjs/helpers/getBoundingClientRect.js.map +7 -0
  36. package/dist/cjs/{hooks/useConstant.js → helpers/getRect.js} +14 -17
  37. package/dist/cjs/helpers/getRect.js.map +7 -0
  38. package/dist/cjs/helpers/getSplitStyles.js +82 -87
  39. package/dist/cjs/helpers/getSplitStyles.js.map +3 -3
  40. package/dist/cjs/helpers/getStylesAtomic.native.js.map +2 -2
  41. package/dist/cjs/helpers/getThemeCSSRules.js +6 -2
  42. package/dist/cjs/helpers/getThemeCSSRules.js.map +2 -2
  43. package/dist/cjs/helpers/insertStyleRule.js +1 -1
  44. package/dist/cjs/helpers/insertStyleRule.js.map +2 -2
  45. package/dist/cjs/helpers/mergeTransform.js +11 -8
  46. package/dist/cjs/helpers/mergeTransform.js.map +2 -2
  47. package/dist/cjs/helpers/pseudoDescriptors.js +1 -0
  48. package/dist/cjs/helpers/pseudoDescriptors.js.map +2 -2
  49. package/dist/cjs/helpers/themeable.js +9 -9
  50. package/dist/cjs/helpers/themeable.js.map +2 -2
  51. package/dist/cjs/hooks/useElementLayout.js +4 -12
  52. package/dist/cjs/hooks/useElementLayout.js.map +2 -2
  53. package/dist/cjs/hooks/useMedia.js +2 -1
  54. package/dist/cjs/hooks/useMedia.js.map +2 -2
  55. package/dist/cjs/hooks/useTheme.js +114 -156
  56. package/dist/cjs/hooks/useTheme.js.map +3 -3
  57. package/dist/cjs/hooks/{useIsMounted.js → useThemeName.js} +23 -14
  58. package/dist/cjs/hooks/useThemeName.js.map +7 -0
  59. package/dist/cjs/index.js +2 -5
  60. package/dist/cjs/index.js.map +2 -2
  61. package/dist/cjs/setupReactNative.js +20 -7
  62. package/dist/cjs/setupReactNative.js.map +2 -2
  63. package/dist/cjs/styled.js +2 -19
  64. package/dist/cjs/styled.js.map +2 -2
  65. package/dist/cjs/types.js.map +1 -1
  66. package/dist/cjs/updateTheme.js +9 -9
  67. package/dist/cjs/updateTheme.js.map +2 -2
  68. package/dist/cjs/views/TamaguiProvider.js +3 -3
  69. package/dist/cjs/views/TamaguiProvider.js.map +2 -2
  70. package/dist/cjs/views/Theme.js +39 -28
  71. package/dist/cjs/views/Theme.js.map +3 -3
  72. package/dist/cjs/views/ThemeInverse.js +4 -2
  73. package/dist/cjs/views/ThemeInverse.js.map +2 -2
  74. package/dist/cjs/views/ThemeProvider.js +8 -33
  75. package/dist/cjs/views/ThemeProvider.js.map +3 -3
  76. package/dist/esm/addTheme.js +7 -10
  77. package/dist/esm/addTheme.js.map +3 -3
  78. package/dist/esm/config.js +8 -3
  79. package/dist/esm/config.js.map +2 -2
  80. package/dist/esm/contexts/ButtonNestingContext.js +6 -0
  81. package/dist/esm/contexts/ButtonNestingContext.js.map +7 -0
  82. package/dist/esm/createComponent.js +65 -70
  83. package/dist/esm/createComponent.js.map +3 -3
  84. package/dist/esm/createFont.js +11 -4
  85. package/dist/esm/createFont.js.map +2 -2
  86. package/dist/esm/createFont.test.js +124 -0
  87. package/dist/esm/createFont.test.js.map +7 -0
  88. package/dist/esm/createTamagui.js +13 -12
  89. package/dist/esm/createTamagui.js.map +2 -2
  90. package/dist/esm/createTokens.js.map +2 -2
  91. package/dist/esm/createTokens.test.js +26 -0
  92. package/dist/esm/createTokens.test.js.map +7 -0
  93. package/dist/esm/createVariable.js +4 -9
  94. package/dist/esm/createVariable.js.map +2 -2
  95. package/dist/esm/createVariable.test.js +6 -0
  96. package/dist/esm/createVariable.test.js.map +7 -0
  97. package/dist/esm/createVariables.js +6 -7
  98. package/dist/esm/createVariables.js.map +2 -2
  99. package/dist/esm/helpers/ThemeManager.js +140 -144
  100. package/dist/esm/helpers/ThemeManager.js.map +3 -3
  101. package/dist/esm/helpers/ThemeManager.test.js +448 -0
  102. package/dist/esm/helpers/ThemeManager.test.js.map +7 -0
  103. package/dist/esm/helpers/ThemeManagerContext.js +6 -0
  104. package/dist/esm/helpers/ThemeManagerContext.js.map +7 -0
  105. package/dist/esm/helpers/createPropMapper.js +4 -4
  106. package/dist/esm/helpers/createPropMapper.js.map +2 -2
  107. package/dist/esm/helpers/extendStaticConfig.js +2 -4
  108. package/dist/esm/helpers/extendStaticConfig.js.map +2 -2
  109. package/dist/esm/helpers/getBoundingClientRect.js +13 -0
  110. package/dist/esm/helpers/getBoundingClientRect.js.map +7 -0
  111. package/dist/esm/helpers/getRect.js +12 -0
  112. package/dist/esm/helpers/getRect.js.map +7 -0
  113. package/dist/esm/helpers/getSplitStyles.js +90 -89
  114. package/dist/esm/helpers/getSplitStyles.js.map +3 -3
  115. package/dist/esm/helpers/getStylesAtomic.native.js.map +2 -2
  116. package/dist/esm/helpers/getThemeCSSRules.js +6 -2
  117. package/dist/esm/helpers/getThemeCSSRules.js.map +2 -2
  118. package/dist/esm/helpers/insertStyleRule.js +1 -1
  119. package/dist/esm/helpers/insertStyleRule.js.map +2 -2
  120. package/dist/esm/helpers/mergeTransform.js +8 -6
  121. package/dist/esm/helpers/mergeTransform.js.map +2 -2
  122. package/dist/esm/helpers/pseudoDescriptors.js +1 -0
  123. package/dist/esm/helpers/pseudoDescriptors.js.map +2 -2
  124. package/dist/esm/helpers/themeable.js +9 -9
  125. package/dist/esm/helpers/themeable.js.map +2 -2
  126. package/dist/esm/hooks/useElementLayout.js +2 -9
  127. package/dist/esm/hooks/useElementLayout.js.map +2 -2
  128. package/dist/esm/hooks/useMedia.js +3 -2
  129. package/dist/esm/hooks/useMedia.js.map +2 -2
  130. package/dist/esm/hooks/useTheme.js +114 -159
  131. package/dist/esm/hooks/useTheme.js.map +3 -3
  132. package/dist/esm/hooks/useThemeName.js +25 -0
  133. package/dist/esm/hooks/useThemeName.js.map +7 -0
  134. package/dist/esm/index.js +3 -5
  135. package/dist/esm/index.js.map +2 -2
  136. package/dist/esm/setupReactNative.js +18 -6
  137. package/dist/esm/setupReactNative.js.map +2 -2
  138. package/dist/esm/styled.js +3 -20
  139. package/dist/esm/styled.js.map +2 -2
  140. package/dist/esm/updateTheme.js +9 -9
  141. package/dist/esm/updateTheme.js.map +2 -2
  142. package/dist/esm/views/TamaguiProvider.js +4 -4
  143. package/dist/esm/views/TamaguiProvider.js.map +2 -2
  144. package/dist/esm/views/Theme.js +40 -29
  145. package/dist/esm/views/Theme.js.map +3 -3
  146. package/dist/esm/views/ThemeInverse.js +4 -2
  147. package/dist/esm/views/ThemeInverse.js.map +2 -2
  148. package/dist/esm/views/ThemeProvider.js +8 -27
  149. package/dist/esm/views/ThemeProvider.js.map +2 -2
  150. package/package.json +13 -13
  151. package/src/__snapshots__/createTokens.test.ts.snap +877 -0
  152. package/src/addTheme.ts +9 -12
  153. package/src/config.ts +10 -2
  154. package/src/contexts/ButtonNestingContext.tsx +3 -0
  155. package/src/createComponent.tsx +117 -108
  156. package/src/createFont.test.ts +129 -0
  157. package/src/createFont.ts +12 -5
  158. package/src/createTamagui.ts +16 -14
  159. package/src/createTokens.test.ts +29 -0
  160. package/src/createTokens.ts +1 -1
  161. package/src/createVariable.test.ts +7 -0
  162. package/src/createVariable.ts +4 -10
  163. package/src/createVariables.ts +7 -7
  164. package/src/helpers/ThemeManager.test.tsx +480 -0
  165. package/src/helpers/ThemeManager.tsx +171 -166
  166. package/src/helpers/ThemeManagerContext.tsx +5 -0
  167. package/src/helpers/createPropMapper.ts +4 -4
  168. package/src/helpers/extendStaticConfig.ts +4 -4
  169. package/src/helpers/getBoundingClientRect.tsx +7 -0
  170. package/src/helpers/getRect.tsx +8 -0
  171. package/src/helpers/getSplitStyles.tsx +98 -94
  172. package/src/helpers/getStylesAtomic.native.ts +1 -0
  173. package/src/helpers/getThemeCSSRules.ts +9 -2
  174. package/src/helpers/insertStyleRule.tsx +2 -2
  175. package/src/helpers/mergeTransform.ts +13 -6
  176. package/src/helpers/pseudoDescriptors.ts +1 -0
  177. package/src/helpers/themeable.tsx +17 -9
  178. package/src/hooks/useElementLayout.tsx +3 -8
  179. package/src/hooks/useMedia.tsx +3 -3
  180. package/src/hooks/useTheme.tsx +138 -211
  181. package/src/hooks/useThemeName.tsx +25 -0
  182. package/src/index.ts +3 -4
  183. package/src/setupReactNative.ts +16 -5
  184. package/src/styled.tsx +4 -23
  185. package/src/types.tsx +42 -17
  186. package/src/updateTheme.ts +12 -9
  187. package/src/views/TamaguiProvider.tsx +5 -5
  188. package/src/views/Theme.tsx +48 -39
  189. package/src/views/ThemeProvider.tsx +11 -33
  190. package/types/Tamagui.d.ts +1 -1
  191. package/types/addTheme.d.ts +23 -2
  192. package/types/config.d.ts +0 -1
  193. package/types/contexts/ButtonNestingContext.d.ts +3 -0
  194. package/types/createFont.test.d.ts +2 -0
  195. package/types/createTokens.test.d.ts +2 -0
  196. package/types/createVariable.d.ts +2 -2
  197. package/types/createVariable.test.d.ts +2 -0
  198. package/types/helpers/ThemeManager.d.ts +20 -30
  199. package/types/helpers/ThemeManager.test.d.ts +2 -0
  200. package/types/helpers/ThemeManagerContext.d.ts +4 -0
  201. package/types/helpers/getBoundingClientRect.d.ts +2 -0
  202. package/types/helpers/getRect.d.ts +9 -0
  203. package/types/helpers/insertStyleRule.d.ts +1 -1
  204. package/types/helpers/mergeTransform.d.ts +5 -3
  205. package/types/helpers/themeable.d.ts +3 -0
  206. package/types/hooks/useElementLayout.d.ts +0 -8
  207. package/types/hooks/useTheme.d.ts +10 -20
  208. package/types/hooks/useThemeName.d.ts +5 -0
  209. package/types/index.d.ts +3 -4
  210. package/types/setupReactNative.d.ts +4 -2
  211. package/types/types.d.ts +35 -10
  212. package/types/updateTheme.d.ts +23 -2
  213. package/types/views/Theme.d.ts +3 -4
  214. package/dist/cjs/constants/platform.js +0 -74
  215. package/dist/cjs/constants/platform.js.map +0 -7
  216. package/dist/cjs/constants/platform.native.js +0 -62
  217. package/dist/cjs/constants/platform.native.js.map +0 -7
  218. package/dist/cjs/helpers/assignNativePropsToWeb.js +0 -188
  219. package/dist/cjs/helpers/assignNativePropsToWeb.js.map +0 -7
  220. package/dist/cjs/helpers/assignNativePropsToWeb.native.js.map +0 -7
  221. package/dist/cjs/helpers/calc.js +0 -71
  222. package/dist/cjs/helpers/calc.js.map +0 -7
  223. package/dist/cjs/helpers/getFont.js +0 -66
  224. package/dist/cjs/helpers/getFont.js.map +0 -7
  225. package/dist/cjs/helpers/getStackSize.js +0 -46
  226. package/dist/cjs/helpers/getStackSize.js.map +0 -7
  227. package/dist/cjs/helpers/getTokens.js.map +0 -7
  228. package/dist/cjs/helpers/startTransition.js +0 -36
  229. package/dist/cjs/helpers/startTransition.js.map +0 -7
  230. package/dist/cjs/helpers/validate.js +0 -2
  231. package/dist/cjs/helpers/validate.js.map +0 -7
  232. package/dist/cjs/hooks/useConstant.js.map +0 -7
  233. package/dist/cjs/hooks/useIsMounted.js.map +0 -7
  234. package/dist/cjs/hooks/usePressable.js +0 -36
  235. package/dist/cjs/hooks/usePressable.js.map +0 -7
  236. package/dist/cjs/hooks/useUnmountEffect.js.map +0 -7
  237. package/dist/cjs/injectStyles.js +0 -40
  238. package/dist/cjs/injectStyles.js.map +0 -7
  239. package/dist/cjs/react-native.js +0 -22
  240. package/dist/cjs/react-native.js.map +0 -7
  241. package/dist/esm/constants/platform.js +0 -39
  242. package/dist/esm/constants/platform.js.map +0 -7
  243. package/dist/esm/constants/platform.native.js +0 -28
  244. package/dist/esm/constants/platform.native.js.map +0 -7
  245. package/dist/esm/helpers/assignNativePropsToWeb.js +0 -164
  246. package/dist/esm/helpers/assignNativePropsToWeb.js.map +0 -7
  247. package/dist/esm/helpers/assignNativePropsToWeb.native.js +0 -6
  248. package/dist/esm/helpers/assignNativePropsToWeb.native.js.map +0 -7
  249. package/dist/esm/helpers/calc.js +0 -47
  250. package/dist/esm/helpers/calc.js.map +0 -7
  251. package/dist/esm/helpers/getFont.js +0 -42
  252. package/dist/esm/helpers/getFont.js.map +0 -7
  253. package/dist/esm/helpers/getStackSize.js +0 -22
  254. package/dist/esm/helpers/getStackSize.js.map +0 -7
  255. package/dist/esm/helpers/getTokens.js +0 -6
  256. package/dist/esm/helpers/getTokens.js.map +0 -7
  257. package/dist/esm/helpers/startTransition.js +0 -6
  258. package/dist/esm/helpers/startTransition.js.map +0 -7
  259. package/dist/esm/helpers/validate.js +0 -1
  260. package/dist/esm/helpers/validate.js.map +0 -7
  261. package/dist/esm/hooks/useConstant.js +0 -15
  262. package/dist/esm/hooks/useConstant.js.map +0 -7
  263. package/dist/esm/hooks/useIsMounted.js +0 -16
  264. package/dist/esm/hooks/useIsMounted.js.map +0 -7
  265. package/dist/esm/hooks/usePressable.js +0 -12
  266. package/dist/esm/hooks/usePressable.js.map +0 -7
  267. package/dist/esm/hooks/useUnmountEffect.js +0 -8
  268. package/dist/esm/hooks/useUnmountEffect.js.map +0 -7
  269. package/dist/esm/injectStyles.js +0 -16
  270. package/dist/esm/injectStyles.js.map +0 -7
  271. package/dist/esm/react-native.js +0 -3
  272. package/dist/esm/react-native.js.map +0 -7
  273. package/src/contexts/ButtonInsideButtonContext.tsx +0 -3
  274. package/src/contexts/ThemeContext.tsx +0 -5
  275. package/src/helpers/areEqualSets.tsx +0 -9
  276. package/src/views/ThemeInverse.tsx +0 -40
  277. package/src/views/ThemeReset.tsx +0 -43
  278. package/types/constants/platform.d.ts +0 -13
  279. package/types/constants/platform.native.d.ts +0 -13
  280. package/types/contexts/ButtonInsideButtonContext.d.ts +0 -3
  281. package/types/contexts/ThemeContext.d.ts +0 -7
  282. package/types/helpers/areEqualSets.d.ts +0 -2
  283. package/types/helpers/assignNativePropsToWeb.d.ts +0 -2
  284. package/types/helpers/assignNativePropsToWeb.native.d.ts +0 -2
  285. package/types/helpers/calc.d.ts +0 -1
  286. package/types/helpers/getFont.d.ts +0 -3
  287. package/types/helpers/getStackSize.d.ts +0 -8
  288. package/types/helpers/getTokens.d.ts +0 -2
  289. package/types/helpers/startTransition.d.ts +0 -3
  290. package/types/helpers/validate.d.ts +0 -1
  291. package/types/hooks/useConstant.d.ts +0 -2
  292. package/types/hooks/useIsMounted.d.ts +0 -3
  293. package/types/hooks/useMedia.test.d.ts +0 -1
  294. package/types/hooks/usePressable.d.ts +0 -3
  295. package/types/hooks/usePressablePressResponder.d.ts +0 -84
  296. package/types/hooks/useUnmountEffect.d.ts +0 -2
  297. package/types/injectStyles.d.ts +0 -7
  298. package/types/react-native.d.ts +0 -8
  299. package/types/views/AbsoluteFill.d.ts +0 -5
  300. package/types/views/AbsoluteFill.native.d.ts +0 -3
  301. package/types/views/ThemeInverse.d.ts +0 -9
  302. package/types/views/ThemeReset.d.ts +0 -4
@@ -0,0 +1,29 @@
1
+ import { getDefaultTamaguiConfig } from '@tamagui/config-default-node'
2
+ import { expect, test } from 'vitest'
3
+
4
+ import { createTokens } from './createTokens'
5
+
6
+ test('snapshot', () => {
7
+ expect(createTokens(getDefaultTamaguiConfig().tokens)).toMatchSnapshot()
8
+ })
9
+
10
+ test('color name no dot', () => {
11
+ expect(
12
+ // @ts-ignore partial
13
+ createTokens({
14
+ color: {
15
+ 'yellow.10': 'yellow',
16
+ },
17
+ })
18
+ ).toMatchObject({
19
+ color: {
20
+ 'yellow.10': {
21
+ isVar: true,
22
+ key: 'yellow101a',
23
+ name: 'color-1',
24
+ val: 'yellow',
25
+ variable: '',
26
+ },
27
+ },
28
+ })
29
+ })
@@ -4,7 +4,7 @@ import { CreateTokens } from './types'
4
4
 
5
5
  // tokens.color.dark.red ===> { var: `color-dark-red`, val: '' }
6
6
  export function createTokens<T extends CreateTokens>(tokens: T): MakeTokens<T> {
7
- return createVariables(tokens as any) as any
7
+ return createVariables(tokens) as any
8
8
  }
9
9
 
10
10
  // verbose but gives us nice types...
@@ -0,0 +1,7 @@
1
+ import { expect, test } from 'vitest'
2
+
3
+ import { createCSSVariable } from './createVariable'
4
+
5
+ test('dots', () => {
6
+ expect(createCSSVariable('yellow.10')).toBe('var(--yellow101a)')
7
+ })
@@ -8,7 +8,7 @@ import { getConfig } from './config'
8
8
  * Moving to objects for React Server Components support
9
9
  */
10
10
 
11
- const IS_VAR = '__isVar__'
11
+ const IS_VAR = 'isVar'
12
12
 
13
13
  type VariableIn<A = any> = {
14
14
  val: A
@@ -23,25 +23,19 @@ export type Variable<A = any> = VariableIn<A> & {
23
23
  }
24
24
 
25
25
  export const createVariable = <A extends string | number = any>(props: VariableIn<A>) => {
26
- if (isVariable(props)) {
27
- return props
28
- }
26
+ if (isVariable(props)) return props
29
27
  return {
30
28
  [IS_VAR]: true,
31
- // @ts-ignore
32
29
  ...props,
33
30
  variable: isWeb ? createCSSVariable(props.name) : '',
34
31
  }
35
32
  }
36
33
 
37
- // on the client maybe we can change the prototype of variable object toString to keep backwards compat
38
34
  export function variableToString(vrble?: any, getValue = false) {
39
- if (!vrble) return ''
40
35
  if (isVariable(vrble)) {
41
- if (getValue) return `${vrble.val}`
42
- return `${isWeb ? vrble.variable : vrble.val}`
36
+ return getValue ? `${vrble.val}` : `${isWeb ? vrble.variable : vrble.val}`
43
37
  }
44
- return `${vrble}`
38
+ return `${vrble || ''}`
45
39
  }
46
40
 
47
41
  export function isVariable(v: Variable | any): v is Variable {
@@ -1,3 +1,5 @@
1
+ import { simpleHash } from '@tamagui/helpers'
2
+
1
3
  import { Variable, createVariable, isVariable } from './createVariable'
2
4
 
3
5
  type DeepTokenObject<Val extends string | number = any> = {
@@ -21,22 +23,20 @@ export const createVariables = <A extends DeepTokenObject>(
21
23
  let i = 0
22
24
  for (const key in tokens) {
23
25
  i++
24
- const variableName = isFont ? key.slice(0, 2) : i
25
26
  const val = tokens[key]
26
27
  if (isVariable(val)) {
27
28
  res[key] = val
28
29
  continue
29
30
  }
30
- let name = parentPath ? `${parentPath}-${variableName}` : key
31
- if (isFont && name.includes('_')) {
32
- name = name.replace(/_[a-z0-9]+/i, '')
33
- }
31
+ const niceKey = simpleHash(key)
32
+ let name = isFont ? niceKey.slice(0, 2) : i
33
+ name = parentPath ? `${parentPath}-${name}` : niceKey
34
34
  if (val && typeof val === 'object') {
35
35
  // recurse
36
- res[key] = createVariables(tokens[key] as any, `${name}`)
36
+ res[key] = createVariables(tokens[key] as any, name)
37
37
  continue
38
38
  }
39
- res[key] = isVariable(val) ? val : createVariable({ val, name, key })
39
+ res[key] = isVariable(val) ? val : createVariable({ val, name, key: niceKey })
40
40
  }
41
41
  return res
42
42
  }
@@ -0,0 +1,480 @@
1
+ import { getDefaultTamaguiConfig } from '@tamagui/config-default-node'
2
+ import { beforeAll, describe, expect, test } from 'vitest'
3
+
4
+ import { createTamagui } from '../createTamagui'
5
+ import { ThemeManager } from './ThemeManager'
6
+
7
+ const conf = getDefaultTamaguiConfig()
8
+
9
+ describe('ThemeManager', () => {
10
+ beforeAll(() => {
11
+ createTamagui(conf)
12
+ })
13
+
14
+ test('Changes theme to dark', () => {
15
+ const manager = new ThemeManager(
16
+ {
17
+ name: 'dark',
18
+ },
19
+ 'root'
20
+ )
21
+ expect(manager.state.name).toBe('dark')
22
+ })
23
+
24
+ test('Given parent theme "dark" and child theme "red" to return theme "dark_red"', () => {
25
+ const parent = new ThemeManager(
26
+ {
27
+ name: 'dark',
28
+ },
29
+ 'root'
30
+ )
31
+ const child = new ThemeManager(
32
+ {
33
+ name: 'red',
34
+ },
35
+ parent
36
+ )
37
+ expect(parent.state.name).toBe('dark')
38
+ expect(child.state.name).toBe('dark_red')
39
+ })
40
+
41
+ test('Given parent theme "dark", child theme "red_alt2" and component "Button" returns "dark_red_alt2_Button"', () => {
42
+ const parent = new ThemeManager(
43
+ {
44
+ name: 'dark',
45
+ },
46
+ 'root'
47
+ )
48
+ const child1 = new ThemeManager(
49
+ {
50
+ name: 'red',
51
+ },
52
+ parent
53
+ )
54
+ expect(child1.state.name).toBe('dark_red')
55
+ const child2 = new ThemeManager(
56
+ {
57
+ name: 'alt2',
58
+ componentName: 'Button',
59
+ },
60
+ child1
61
+ )
62
+ expect(child2.state.name).toBe('dark_red_alt2_Button')
63
+ })
64
+
65
+ test('Given parent theme "dark", child theme "red" and component "Button" returns "dark_red_Button"', () => {
66
+ const parent = new ThemeManager(
67
+ {
68
+ name: 'dark',
69
+ },
70
+ 'root'
71
+ )
72
+ const child1 = new ThemeManager(
73
+ {
74
+ name: 'red',
75
+ },
76
+ parent
77
+ )
78
+ expect(child1.state.name).toBe('dark_red')
79
+ const child2 = new ThemeManager(
80
+ {
81
+ componentName: 'Button',
82
+ },
83
+ child1
84
+ )
85
+ expect(child2.state.name).toBe('dark_red_Button')
86
+ })
87
+
88
+ test('Given parent theme "dark", child theme "red" and missing component "Card" returns "dark_red"', () => {
89
+ const parent = new ThemeManager(
90
+ {
91
+ name: 'dark',
92
+ },
93
+ 'root'
94
+ )
95
+ const child1 = new ThemeManager(
96
+ {
97
+ name: 'red',
98
+ },
99
+ parent
100
+ )
101
+ expect(child1.state.name).toBe('dark_red')
102
+ const child2 = new ThemeManager(
103
+ {
104
+ componentName: 'Card',
105
+ },
106
+ child1
107
+ )
108
+ expect(child2.state.name).toBe('dark_red')
109
+ })
110
+
111
+ test('Changes "light" to "dark"', () => {
112
+ const parent = new ThemeManager(
113
+ {
114
+ name: 'light',
115
+ },
116
+ 'root'
117
+ )
118
+ const child = new ThemeManager(
119
+ {
120
+ name: 'dark',
121
+ },
122
+ parent
123
+ )
124
+ expect(parent.state.name).toBe('light')
125
+ expect(child.state.name).toBe('dark')
126
+ })
127
+
128
+ test('Inverts "light" to "dark"', () => {
129
+ const parent = new ThemeManager(
130
+ {
131
+ name: 'light',
132
+ },
133
+ 'root'
134
+ )
135
+ const child1 = new ThemeManager(
136
+ {
137
+ inverse: true,
138
+ },
139
+ parent
140
+ )
141
+ expect(child1.state.name).toBe('dark')
142
+ })
143
+
144
+ test('Inverts "light_red" to "dark_red"', () => {
145
+ const parent = new ThemeManager(
146
+ {
147
+ name: 'light',
148
+ },
149
+ 'root'
150
+ )
151
+ const child1 = new ThemeManager(
152
+ {
153
+ name: 'red',
154
+ inverse: true,
155
+ },
156
+ parent
157
+ )
158
+ expect(child1.state.name).toBe('dark_red')
159
+ })
160
+
161
+ test('Updates state', () => {
162
+ const parent = new ThemeManager(
163
+ {
164
+ name: 'light',
165
+ },
166
+ 'root'
167
+ )
168
+ const newState = parent.updateState({
169
+ name: 'dark',
170
+ })
171
+ expect(newState).toMatchInlineSnapshot(`
172
+ {
173
+ "className": "t_dark",
174
+ "name": "dark",
175
+ "parentName": "",
176
+ "theme": {
177
+ "background": {
178
+ "isVar": true,
179
+ "key": "color-2",
180
+ "name": "background",
181
+ "val": "#000",
182
+ "variable": "",
183
+ },
184
+ "color": {
185
+ "isVar": true,
186
+ "key": "color-1",
187
+ "name": "color",
188
+ "val": "#fff",
189
+ "variable": "",
190
+ },
191
+ },
192
+ }
193
+ `)
194
+ expect(parent.state.name).toBe('dark')
195
+ })
196
+
197
+ test('Returns parent on empty', () => {
198
+ const parent = new ThemeManager(
199
+ {
200
+ name: 'light',
201
+ },
202
+ 'root'
203
+ )
204
+ const child = new ThemeManager(
205
+ {
206
+ name: null,
207
+ },
208
+ parent
209
+ )
210
+ expect(child).toBe(parent)
211
+ })
212
+
213
+ test('Resets theme', () => {
214
+ const parent = new ThemeManager(
215
+ {
216
+ name: 'light',
217
+ },
218
+ 'root'
219
+ )
220
+ const child = new ThemeManager(
221
+ {
222
+ name: 'dark',
223
+ },
224
+ parent
225
+ )
226
+ expect(child.state.name).toBe('dark')
227
+ expect(child.parentManager).toBe(parent)
228
+ const child2 = new ThemeManager(
229
+ {
230
+ reset: true,
231
+ },
232
+ child
233
+ )
234
+ expect(child2.parentManager).toBe(child)
235
+ expect(child2.state.name).toBe('light')
236
+ })
237
+
238
+ test('Nested invert and reset', () => {
239
+ const parent = new ThemeManager(
240
+ {
241
+ name: 'light',
242
+ },
243
+ 'root'
244
+ )
245
+ const child = new ThemeManager(
246
+ {
247
+ name: 'dark',
248
+ },
249
+ parent
250
+ )
251
+ const child2 = new ThemeManager(
252
+ {
253
+ reset: true,
254
+ },
255
+ child
256
+ )
257
+ const child3 = new ThemeManager(
258
+ {
259
+ inverse: true,
260
+ },
261
+ child2
262
+ )
263
+ expect(child3.state.name).toBe('dark')
264
+ })
265
+
266
+ test('Updates from null the new theme nested 3 themes', () => {
267
+ const a = new ThemeManager(
268
+ {
269
+ name: 'dark',
270
+ },
271
+ 'root'
272
+ )
273
+ const b = new ThemeManager(
274
+ {
275
+ name: 'red',
276
+ },
277
+ a
278
+ )
279
+ expect(b.state.name).toBe('dark_red')
280
+ const c = new ThemeManager(
281
+ {
282
+ name: 'alt2',
283
+ },
284
+ b
285
+ )
286
+ expect(c.state.name).toBe('dark_red_alt2')
287
+ })
288
+
289
+ test('Ignored dup themes', () => {
290
+ const a = new ThemeManager(
291
+ {
292
+ name: 'dark',
293
+ },
294
+ 'root'
295
+ )
296
+ const b = new ThemeManager(
297
+ {
298
+ name: 'dark',
299
+ },
300
+ a
301
+ )
302
+ expect(b === a).toBe(true)
303
+ })
304
+
305
+ test('Nested component themes fallback to grandparents', () => {
306
+ const parent = new ThemeManager(
307
+ {
308
+ name: 'dark',
309
+ },
310
+ 'root'
311
+ )
312
+ const child = new ThemeManager(
313
+ {
314
+ name: 'red',
315
+ componentName: 'Button',
316
+ },
317
+ parent
318
+ )
319
+ const child2 = new ThemeManager(
320
+ {
321
+ name: 'blue',
322
+ },
323
+ child
324
+ )
325
+ expect(child2.state.name).toBe('dark_blue')
326
+ const child3 = new ThemeManager(
327
+ {
328
+ componentName: 'Button',
329
+ },
330
+ child2
331
+ )
332
+ expect(child3.state.name).toBe('dark_blue_Button')
333
+ })
334
+
335
+ test(`Component theme with sub component that doesn't exist keeps same theme`, () => {
336
+ const parent = new ThemeManager(
337
+ {
338
+ name: 'dark',
339
+ },
340
+ 'root'
341
+ )
342
+ const child = new ThemeManager(
343
+ {
344
+ name: 'red',
345
+ componentName: 'Button',
346
+ },
347
+ parent
348
+ )
349
+ const child2 = new ThemeManager(
350
+ {
351
+ componentName: 'Spacer',
352
+ },
353
+ child
354
+ )
355
+ expect(child2).toBe(child)
356
+ })
357
+
358
+ test(`Doesn't find invalid parent when only passing component`, () => {
359
+ expect(!!conf.themes['dark_Card']).toBeTruthy()
360
+
361
+ const parent = new ThemeManager(
362
+ {
363
+ name: 'dark_red',
364
+ },
365
+ 'root'
366
+ )
367
+
368
+ const child = new ThemeManager(
369
+ {
370
+ componentName: 'Card',
371
+ },
372
+ parent
373
+ )
374
+
375
+ // dont find dark_Card because dark_red is highest it should climb
376
+ expect(child.state.name).toBe(parent.state.name)
377
+ })
378
+
379
+ test(`Finds sub-theme when componentName and name are passed but componentName doesn't exist`, () => {
380
+ const parent = new ThemeManager(
381
+ {
382
+ name: 'dark',
383
+ },
384
+ 'root'
385
+ )
386
+
387
+ const child = new ThemeManager(
388
+ {
389
+ name: 'red',
390
+ componentName: 'Missing',
391
+ },
392
+ parent
393
+ )
394
+
395
+ // dont find dark_Card because dark_red is highest it should climb
396
+ expect(child.state.name).toBe('dark_red')
397
+ })
398
+
399
+ test(`Uses the full className without the light/dark prefix`, () => {
400
+ const parent = new ThemeManager(
401
+ {
402
+ name: 'dark',
403
+ },
404
+ 'root'
405
+ )
406
+ const child = new ThemeManager(
407
+ {
408
+ name: 'red_alt2',
409
+ },
410
+ parent
411
+ )
412
+ expect(child.state.className).toBe('t_red_alt2')
413
+
414
+ const child2 = new ThemeManager(
415
+ {
416
+ name: 'red',
417
+ },
418
+ parent
419
+ )
420
+ const child3 = new ThemeManager(
421
+ {
422
+ name: 'alt2',
423
+ },
424
+ child2
425
+ )
426
+ expect(child3.state.className).toBe('t_red_alt2')
427
+ })
428
+
429
+ test(`Finds component dark_red + Button`, () => {
430
+ const parent = new ThemeManager(
431
+ {
432
+ name: 'dark_red',
433
+ },
434
+ 'root'
435
+ )
436
+ const child = new ThemeManager(
437
+ {
438
+ name: 'dark_red',
439
+ componentName: 'Button',
440
+ },
441
+ parent
442
+ )
443
+ expect(child.state.className).toBe('t_red_Button')
444
+ expect(child.state.name).toBe('dark_red_Button')
445
+ })
446
+
447
+ test(`Drops componentName if only regular name found at stronger level`, () => {
448
+ const parent = new ThemeManager(
449
+ {
450
+ name: 'dark_red',
451
+ },
452
+ 'root'
453
+ )
454
+ const child = new ThemeManager(
455
+ {
456
+ name: 'alt1',
457
+ componentName: 'Button',
458
+ },
459
+ parent
460
+ )
461
+ expect(child.state.name).toBe('dark_red_alt1')
462
+ })
463
+
464
+ test(`Component name + theme change when nested already`, () => {
465
+ const parent = new ThemeManager(
466
+ {
467
+ name: 'dark_red',
468
+ },
469
+ 'root'
470
+ )
471
+ const child = new ThemeManager(
472
+ {
473
+ name: 'yellow',
474
+ componentName: 'Button',
475
+ },
476
+ parent
477
+ )
478
+ expect(child.state.name).toBe('dark_yellow_Button')
479
+ })
480
+ })