@tamagui/web 1.72.3 → 1.73.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/cjs/contexts/ComponentContext.js +1 -0
  2. package/dist/cjs/contexts/ComponentContext.js.map +1 -1
  3. package/dist/cjs/contexts/ComponentContext.native.js +1 -0
  4. package/dist/cjs/contexts/ComponentContext.native.js.map +1 -1
  5. package/dist/cjs/createComponent.js +47 -46
  6. package/dist/cjs/createComponent.js.map +1 -1
  7. package/dist/cjs/createComponent.native.js +27 -26
  8. package/dist/cjs/createComponent.native.js.map +1 -1
  9. package/dist/cjs/createTamagui.js +35 -32
  10. package/dist/cjs/createTamagui.js.map +1 -1
  11. package/dist/cjs/createTamagui.native.js +35 -32
  12. package/dist/cjs/createTamagui.native.js.map +1 -1
  13. package/dist/cjs/helpers/getSplitStyles.js +8 -7
  14. package/dist/cjs/helpers/getSplitStyles.js.map +1 -1
  15. package/dist/cjs/helpers/getSplitStyles.native.js +6 -5
  16. package/dist/cjs/helpers/getSplitStyles.native.js.map +1 -1
  17. package/dist/cjs/helpers/getStylesAtomic.js +16 -11
  18. package/dist/cjs/helpers/getStylesAtomic.js.map +2 -2
  19. package/dist/cjs/helpers/getThemeCSSRules.js +1 -1
  20. package/dist/cjs/helpers/getThemeCSSRules.js.map +1 -1
  21. package/dist/cjs/helpers/propMapper.js +15 -10
  22. package/dist/cjs/helpers/propMapper.js.map +1 -1
  23. package/dist/cjs/helpers/propMapper.native.js +15 -10
  24. package/dist/cjs/helpers/propMapper.native.js.map +1 -1
  25. package/dist/cjs/hooks/{useAnimationDriver.js → useConfiguration.js} +15 -8
  26. package/dist/cjs/hooks/useConfiguration.js.map +6 -0
  27. package/dist/cjs/hooks/{useAnimationDriver.native.js → useConfiguration.native.js} +15 -8
  28. package/dist/cjs/hooks/useConfiguration.native.js.map +6 -0
  29. package/dist/cjs/{helpers/getAnimationDriver.js → hooks/useDisableSSR.js} +15 -9
  30. package/dist/cjs/hooks/useDisableSSR.js.map +6 -0
  31. package/dist/cjs/{helpers/getAnimationDriver.native.js → hooks/useDisableSSR.native.js} +15 -9
  32. package/dist/cjs/hooks/useDisableSSR.native.js.map +6 -0
  33. package/dist/cjs/hooks/useMedia.js +7 -9
  34. package/dist/cjs/hooks/useMedia.js.map +1 -1
  35. package/dist/cjs/hooks/useMedia.native.js +7 -9
  36. package/dist/cjs/hooks/useMedia.native.js.map +1 -1
  37. package/dist/cjs/hooks/useProps.js +2 -2
  38. package/dist/cjs/hooks/useProps.js.map +1 -1
  39. package/dist/cjs/hooks/useProps.native.js +2 -2
  40. package/dist/cjs/hooks/useProps.native.js.map +1 -1
  41. package/dist/cjs/hooks/useTheme.js +23 -24
  42. package/dist/cjs/hooks/useTheme.js.map +1 -1
  43. package/dist/cjs/hooks/useTheme.native.js +23 -24
  44. package/dist/cjs/hooks/useTheme.native.js.map +1 -1
  45. package/dist/cjs/index.js +6 -6
  46. package/dist/cjs/index.js.map +1 -1
  47. package/dist/cjs/index.native.js +6 -6
  48. package/dist/cjs/index.native.js.map +1 -1
  49. package/dist/cjs/views/{AnimationDriverProvider.js → Configuration.js} +7 -7
  50. package/dist/cjs/views/Configuration.js.map +6 -0
  51. package/dist/cjs/views/{AnimationDriverProvider.native.js → Configuration.native.js} +7 -7
  52. package/dist/cjs/views/Configuration.native.js.map +6 -0
  53. package/dist/cjs/views/Text.js +0 -1
  54. package/dist/cjs/views/Text.js.map +1 -1
  55. package/dist/cjs/views/Text.native.js +0 -1
  56. package/dist/cjs/views/Text.native.js.map +1 -1
  57. package/dist/cjs/views/Theme.js +16 -11
  58. package/dist/cjs/views/Theme.js.map +1 -1
  59. package/dist/cjs/views/Theme.native.js +16 -11
  60. package/dist/cjs/views/Theme.native.js.map +1 -1
  61. package/dist/cjs/views/ThemeDebug.js +8 -8
  62. package/dist/cjs/views/ThemeDebug.js.map +1 -1
  63. package/dist/esm/contexts/ComponentContext.js +1 -0
  64. package/dist/esm/contexts/ComponentContext.js.map +1 -1
  65. package/dist/esm/createComponent.js +40 -39
  66. package/dist/esm/createComponent.js.map +1 -1
  67. package/dist/esm/createTamagui.js +35 -32
  68. package/dist/esm/createTamagui.js.map +1 -1
  69. package/dist/esm/helpers/getSplitStyles.js +14 -8
  70. package/dist/esm/helpers/getSplitStyles.js.map +1 -1
  71. package/dist/esm/helpers/getStylesAtomic.js +14 -10
  72. package/dist/esm/helpers/getStylesAtomic.js.map +2 -2
  73. package/dist/esm/helpers/getThemeCSSRules.js +1 -1
  74. package/dist/esm/helpers/getThemeCSSRules.js.map +1 -1
  75. package/dist/esm/helpers/propMapper.js +15 -10
  76. package/dist/esm/helpers/propMapper.js.map +1 -1
  77. package/dist/esm/hooks/useConfiguration.js +15 -0
  78. package/dist/esm/hooks/useConfiguration.js.map +6 -0
  79. package/dist/esm/hooks/useDisableSSR.js +15 -0
  80. package/dist/esm/hooks/useDisableSSR.js.map +6 -0
  81. package/dist/esm/hooks/useMedia.js +7 -7
  82. package/dist/esm/hooks/useMedia.js.map +1 -1
  83. package/dist/esm/hooks/useProps.js +1 -1
  84. package/dist/esm/hooks/useProps.js.map +1 -1
  85. package/dist/esm/hooks/useTheme.js +22 -24
  86. package/dist/esm/hooks/useTheme.js.map +1 -1
  87. package/dist/esm/index.js +3 -3
  88. package/dist/esm/index.js.map +1 -1
  89. package/dist/esm/views/Configuration.js +7 -0
  90. package/dist/esm/views/Configuration.js.map +6 -0
  91. package/dist/esm/views/Text.js +0 -1
  92. package/dist/esm/views/Text.js.map +1 -1
  93. package/dist/esm/views/Theme.js +15 -11
  94. package/dist/esm/views/Theme.js.map +1 -1
  95. package/dist/esm/views/ThemeDebug.js +2 -2
  96. package/dist/esm/views/ThemeDebug.js.map +1 -1
  97. package/package.json +9 -9
  98. package/src/contexts/ComponentContext.tsx +1 -0
  99. package/src/createComponent.tsx +55 -44
  100. package/src/createTamagui.ts +54 -51
  101. package/src/helpers/getSplitStyles.tsx +26 -7
  102. package/src/helpers/getStylesAtomic.ts +19 -15
  103. package/src/helpers/getThemeCSSRules.ts +2 -1
  104. package/src/helpers/propMapper.ts +16 -18
  105. package/src/hooks/useConfiguration.tsx +14 -0
  106. package/src/hooks/useDisableSSR.tsx +14 -0
  107. package/src/hooks/useMedia.tsx +12 -8
  108. package/src/hooks/useProps.tsx +1 -1
  109. package/src/hooks/useTheme.tsx +27 -26
  110. package/src/index.ts +3 -3
  111. package/src/types.tsx +15 -11
  112. package/src/views/Configuration.tsx +11 -0
  113. package/src/views/Text.tsx +0 -2
  114. package/src/views/Theme.tsx +8 -9
  115. package/src/views/ThemeDebug.tsx +3 -3
  116. package/types/contexts/ComponentContext.d.ts.map +1 -1
  117. package/types/createComponent.d.ts.map +1 -1
  118. package/types/createTamagui.d.ts.map +1 -1
  119. package/types/helpers/getSplitStyles.d.ts.map +1 -1
  120. package/types/helpers/getStylesAtomic.d.ts +1 -0
  121. package/types/helpers/getStylesAtomic.d.ts.map +1 -1
  122. package/types/helpers/getThemeCSSRules.d.ts.map +1 -1
  123. package/types/helpers/propMapper.d.ts.map +1 -1
  124. package/types/hooks/useConfiguration.d.ts +151 -0
  125. package/types/hooks/useConfiguration.d.ts.map +1 -0
  126. package/types/hooks/useDisableSSR.d.ts +4 -0
  127. package/types/hooks/useDisableSSR.d.ts.map +1 -0
  128. package/types/hooks/useMedia.d.ts +2 -3
  129. package/types/hooks/useMedia.d.ts.map +1 -1
  130. package/types/hooks/useTheme.d.ts +3 -3
  131. package/types/hooks/useTheme.d.ts.map +1 -1
  132. package/types/index.d.ts +3 -3
  133. package/types/index.d.ts.map +1 -1
  134. package/types/types.d.ts +12 -9
  135. package/types/types.d.ts.map +1 -1
  136. package/types/views/Configuration.d.ts +9 -0
  137. package/types/views/Configuration.d.ts.map +1 -0
  138. package/types/views/Text.d.ts.map +1 -1
  139. package/types/views/Theme.d.ts.map +1 -1
  140. package/dist/cjs/helpers/getAnimationDriver.js.map +0 -6
  141. package/dist/cjs/helpers/getAnimationDriver.native.js.map +0 -6
  142. package/dist/cjs/hooks/useAnimationDriver.js.map +0 -6
  143. package/dist/cjs/hooks/useAnimationDriver.native.js.map +0 -6
  144. package/dist/cjs/views/AnimationDriverProvider.js.map +0 -6
  145. package/dist/cjs/views/AnimationDriverProvider.native.js.map +0 -6
  146. package/dist/esm/helpers/getAnimationDriver.js +0 -8
  147. package/dist/esm/helpers/getAnimationDriver.js.map +0 -6
  148. package/dist/esm/hooks/useAnimationDriver.js +0 -8
  149. package/dist/esm/hooks/useAnimationDriver.js.map +0 -6
  150. package/dist/esm/views/AnimationDriverProvider.js +0 -7
  151. package/dist/esm/views/AnimationDriverProvider.js.map +0 -6
  152. package/src/helpers/getAnimationDriver.tsx +0 -8
  153. package/src/hooks/useAnimationDriver.tsx +0 -8
  154. package/src/views/AnimationDriverProvider.tsx +0 -16
  155. package/types/helpers/getAnimationDriver.d.ts +0 -9
  156. package/types/helpers/getAnimationDriver.d.ts.map +0 -1
  157. package/types/hooks/useAnimationDriver.d.ts +0 -4
  158. package/types/hooks/useAnimationDriver.d.ts.map +0 -1
  159. package/types/hooks/useStyle.d.ts +0 -8
  160. package/types/views/AnimationDriverProvider.d.ts +0 -9
  161. package/types/views/AnimationDriverProvider.d.ts.map +0 -1
@@ -101,7 +101,7 @@ const resolveVariants: StyleResolver = (
101
101
  const { variants } = staticConfig
102
102
  if (!variants) return
103
103
 
104
- let variantValue = getVariantDefinition(variants[key], key, value, conf)
104
+ let variantValue = getVariantDefinition(variants[key], value, conf)
105
105
 
106
106
  if (process.env.NODE_ENV === 'development' && debug === 'verbose') {
107
107
  console.groupCollapsed(`♦️♦️♦️ resolve variant ${key}`)
@@ -316,30 +316,28 @@ const tokenCats = ['size', 'color', 'radius', 'space', 'zIndex'].map((name) => (
316
316
  }))
317
317
 
318
318
  // goes through specificity finding best matching variant function
319
- function getVariantDefinition(
320
- variant: any,
321
- key: string,
322
- value: any,
323
- conf: TamaguiInternalConfig
324
- ) {
319
+ function getVariantDefinition(variant: any, value: any, conf: TamaguiInternalConfig) {
325
320
  if (typeof variant === 'function') {
326
321
  return variant
327
322
  }
328
- if (variant[value]) {
329
- return variant[value]
323
+ const exact = variant[value]
324
+ if (exact) {
325
+ return exact
330
326
  }
331
- const { tokensParsed } = conf
332
- for (const { name, spreadName } of tokenCats) {
333
- if (spreadName in variant && value in tokensParsed[name]) {
334
- return variant[spreadName]
327
+ if (value != null) {
328
+ const { tokensParsed } = conf
329
+ for (const { name, spreadName } of tokenCats) {
330
+ if (spreadName in variant && value in tokensParsed[name]) {
331
+ return variant[spreadName]
332
+ }
333
+ }
334
+ const fontSizeVariant = variant['...fontSize']
335
+ if (fontSizeVariant && conf.fontSizeTokens.has(value)) {
336
+ return fontSizeVariant
335
337
  }
336
- }
337
- const fontSizeVariant = variant['...fontSize']
338
- if (fontSizeVariant && conf.fontSizeTokens.has(value)) {
339
- return fontSizeVariant
340
338
  }
341
339
  // fallback to catch all | size
342
- return variant[`:${typeof value}`] || variant['...'] || variant['...size']
340
+ return variant[`:${typeof value}`] || variant['...']
343
341
  }
344
342
 
345
343
  const fontShorthand = {
@@ -0,0 +1,14 @@
1
+ import { useContext } from 'react'
2
+
3
+ import { getConfig } from '../config'
4
+ import { ComponentContext } from '../contexts/ComponentContext'
5
+
6
+ export const useConfiguration = () => {
7
+ const { groups, animationDriver, ...restComponentConfig } = useContext(ComponentContext)
8
+ const { animations, ...restConfig } = getConfig()
9
+ return {
10
+ ...restConfig,
11
+ ...restComponentConfig,
12
+ animationDriver: animationDriver ?? getConfig().animations,
13
+ }
14
+ }
@@ -0,0 +1,14 @@
1
+ import { useContext } from 'react'
2
+
3
+ import { getConfig } from '../config'
4
+ import { ComponentContext } from '../contexts/ComponentContext'
5
+ import { ComponentContextI } from '../types'
6
+
7
+ export function useDisableSSR() {
8
+ const componentContext = useContext(ComponentContext)
9
+ return getDisableSSR(componentContext)
10
+ }
11
+
12
+ export function getDisableSSR(componentContext: ComponentContextI) {
13
+ return componentContext.disableSSR ?? getConfig().disableSSR
14
+ }
@@ -1,11 +1,13 @@
1
1
  import { useIsomorphicLayoutEffect } from '@tamagui/constants'
2
- import { useRef, useSyncExternalStore } from 'react'
2
+ import { useContext, useRef, useSyncExternalStore } from 'react'
3
3
 
4
4
  import { getConfig } from '../config'
5
+ import { ComponentContext } from '../contexts/ComponentContext'
5
6
  import { createProxy } from '../helpers/createProxy'
6
7
  import { matchMedia } from '../helpers/matchMedia'
7
8
  import { pseudoDescriptors } from '../helpers/pseudoDescriptors'
8
9
  import type {
10
+ ComponentContextI,
9
11
  MediaQueries,
10
12
  MediaQueryKey,
11
13
  MediaQueryObject,
@@ -13,6 +15,8 @@ import type {
13
15
  TamaguiInternalConfig,
14
16
  UseMediaState,
15
17
  } from '../types'
18
+ import { useConfiguration } from './useConfiguration'
19
+ import { getDisableSSR, useDisableSSR } from './useDisableSSR'
16
20
 
17
21
  export let mediaState: MediaQueryState =
18
22
  // development only safeguard
@@ -50,9 +54,6 @@ export const isMediaKey = (key: string) =>
50
54
 
51
55
  // for SSR capture it at time of startup
52
56
  let initState: MediaQueryState
53
- export const getInitialMediaState = () => {
54
- return (getConfig().disableSSR ? mediaState : initState) || {}
55
- }
56
57
 
57
58
  // media always above pseudos
58
59
  const defaultMediaImportance = Object.keys(pseudoDescriptors).length
@@ -191,14 +192,17 @@ function subscribe(subscriber: any) {
191
192
  return () => listeners.delete(subscriber)
192
193
  }
193
194
 
194
- export function useMedia(uid?: any): UseMediaState {
195
+ export function useMedia(uid?: any, componentContext?: ComponentContextI): UseMediaState {
195
196
  const internal = useRef<UseMediaInternalState | undefined>()
197
+ // performance boost to avoid using context twice
198
+ const disableSSR = componentContext ? getDisableSSR(componentContext) : useDisableSSR()
199
+ const initialState = (disableSSR ? mediaState : initState) || {}
196
200
 
197
201
  const state = useSyncExternalStore<MediaQueryState>(
198
202
  subscribe,
199
203
  () => {
200
204
  if (!internal.current) {
201
- return initState
205
+ return initialState
202
206
  }
203
207
 
204
208
  const { touched, prev } = internal.current
@@ -223,13 +227,13 @@ export function useMedia(uid?: any): UseMediaState {
223
227
 
224
228
  return mediaState
225
229
  },
226
- () => initState
230
+ () => initialState
227
231
  )
228
232
 
229
233
  return new Proxy(state, {
230
234
  get(_, key) {
231
235
  if (typeof key === 'string') {
232
- internal.current ||= { prev: initState }
236
+ internal.current ||= { prev: initialState }
233
237
  internal.current.touched ||= new Set()
234
238
  internal.current.touched.add(key)
235
239
  }
@@ -76,7 +76,7 @@ export function usePropsAndStyle<A extends Object>(
76
76
  props,
77
77
  staticConfig,
78
78
  theme,
79
- themeState.state.name,
79
+ themeState.state?.name || '',
80
80
  defaultComponentStateMounted,
81
81
  {
82
82
  isAnimated: false,
@@ -21,8 +21,8 @@ import type {
21
21
  import { GetThemeUnwrapped } from './getThemeUnwrapped'
22
22
 
23
23
  export type ChangedThemeResponse = {
24
- state: ThemeManagerState
25
- themeManager: ThemeManager
24
+ state?: ThemeManagerState
25
+ themeManager?: ThemeManager | null
26
26
  isNewTheme: boolean
27
27
  mounted?: boolean
28
28
  }
@@ -90,25 +90,26 @@ export const useThemeWithState = (
90
90
  )
91
91
 
92
92
  const { themeManager, state } = changedThemeState
93
- const { theme, name, className } = state
94
93
 
95
- if (!theme) {
94
+ if (!state?.theme) {
96
95
  if (process.env.NODE_ENV === 'development') {
97
- throw new Error(
98
- `No theme found given props ${JSON.stringify(
99
- props
100
- )}. Themes given to tamagui are: ${Object.keys(getConfig().themes)}`
101
- )
96
+ if (process.env.TAMAGUI_DISABLE_NO_THEME_WARNING !== '1') {
97
+ console.warn(
98
+ `[tamagui] No theme found, this could be due to an invalid theme name (given theme props ${JSON.stringify(
99
+ props
100
+ )}).\n\nIf this is intended and you are using Tamagui without any themes, you can disable this warning by setting the environment variable TAMAGUI_DISABLE_NO_THEME_WARNING=1`
101
+ )
102
+ }
102
103
  }
103
- throw `❌ 1`
104
104
  }
105
105
 
106
106
  const themeProxied = useMemo(() => {
107
- return getThemeProxied(theme, themeManager, keys.current, props.debug)
108
- }, [theme, name, className, themeManager])
107
+ if (!themeManager || !state?.theme) return {}
108
+ return getThemeProxied(state.theme, themeManager, keys.current, props.debug)
109
+ }, [state, themeManager])
109
110
 
110
111
  if (process.env.NODE_ENV === 'development' && props.debug === 'verbose') {
111
- console.groupCollapsed(' 🔹 useTheme =>', name)
112
+ console.groupCollapsed(' 🔹 useTheme =>', state?.name)
112
113
  // biome-ignore lint/suspicious/noConsoleLog: <explanation>
113
114
  console.log('returning state', changedThemeState, 'from props', props)
114
115
  console.groupEnd()
@@ -184,7 +185,7 @@ export const activeThemeManagers = new Set<ThemeManager>()
184
185
 
185
186
  export const useChangeThemeEffect = (
186
187
  props: ThemeProps,
187
- root = false,
188
+ isRoot = false,
188
189
  keys?: string[],
189
190
  shouldUpdate?: () => boolean | undefined
190
191
  ): ChangedThemeResponse => {
@@ -195,11 +196,10 @@ export const useChangeThemeEffect = (
195
196
 
196
197
  const parentManager = useContext(ThemeManagerContext)
197
198
 
198
- if (disable) {
199
- if (!parentManager) throw `❌ 2`
199
+ if ((!isRoot && !parentManager) || disable) {
200
200
  return {
201
201
  isNewTheme: false,
202
- state: parentManager.state,
202
+ state: parentManager?.state,
203
203
  themeManager: parentManager,
204
204
  }
205
205
  }
@@ -224,11 +224,11 @@ export const useChangeThemeEffect = (
224
224
  function getShouldUpdateTheme(
225
225
  manager = themeManager,
226
226
  nextState?: ThemeManagerState | null,
227
- prevState: ThemeManagerState = state,
227
+ prevState: ThemeManagerState | undefined = state,
228
228
  forceShouldChange = false
229
229
  ) {
230
230
  const forceUpdate = shouldUpdate?.()
231
- if (!forceShouldChange && forceUpdate === false) return
231
+ if (!manager || (!forceShouldChange && forceUpdate === false)) return
232
232
  const next = nextState || manager.getState(props, parentManager)
233
233
  if (forceShouldChange) return next
234
234
  if (!next) return
@@ -241,6 +241,8 @@ export const useChangeThemeEffect = (
241
241
  if (!isServer) {
242
242
  // listen for parent change + notify children change
243
243
  useLayoutEffect(() => {
244
+ if (!themeManager) return
245
+
244
246
  // SSR safe inverse (because server can't know prefers scheme)
245
247
  // could be done through fancy selectors like how we do prefers-media
246
248
  // but may be a bit of explosion of selectors
@@ -269,7 +271,6 @@ export const useChangeThemeEffect = (
269
271
  const doUpdate = force ?? Boolean(keys?.length || isNewTheme)
270
272
 
271
273
  if (process.env.NODE_ENV === 'development' && props.debug) {
272
-
273
274
  // biome-ignore lint/suspicious/noConsoleLog: <explanation>
274
275
  console.log(` 🔸 onChange`, themeManager.id, {
275
276
  force,
@@ -278,7 +279,7 @@ export const useChangeThemeEffect = (
278
279
  name,
279
280
  manager,
280
281
  keys,
281
- });
282
+ })
282
283
  }
283
284
  if (doUpdate) {
284
285
  setThemeState(createState)
@@ -313,12 +314,12 @@ export const useChangeThemeEffect = (
313
314
  }
314
315
 
315
316
  if (isInversingOnMount) {
316
- if (!parentManager) throw '❌ 3'
317
317
  return {
318
318
  isNewTheme: false,
319
319
  themeManager: parentManager,
320
320
  state: {
321
- ...parentManager.state,
321
+ name: '',
322
+ ...parentManager?.state,
322
323
  className: '',
323
324
  },
324
325
  }
@@ -342,7 +343,7 @@ export const useChangeThemeEffect = (
342
343
 
343
344
  if (hasThemeUpdatingProps) {
344
345
  const getNewThemeManager = () => {
345
- return new ThemeManager(props, root ? 'root' : parentManager)
346
+ return new ThemeManager(props, isRoot ? 'root' : parentManager)
346
347
  }
347
348
 
348
349
  if (prev?.themeManager) {
@@ -388,7 +389,7 @@ export const useChangeThemeEffect = (
388
389
  const isNewTheme = Boolean(themeManager !== parentManager || props.inverse)
389
390
 
390
391
  // only inverse relies on this for ssr
391
- const mounted = !props.inverse ? true : root || prev?.mounted
392
+ const mounted = !props.inverse ? true : isRoot || prev?.mounted
392
393
 
393
394
  if (!state) {
394
395
  if (isNewTheme) {
@@ -399,7 +400,7 @@ export const useChangeThemeEffect = (
399
400
  }
400
401
  }
401
402
 
402
- if (!force && state.name === prev?.state.name) {
403
+ if (!force && state?.name === prev?.state?.name) {
403
404
  return prev
404
405
  }
405
406
 
package/src/index.ts CHANGED
@@ -31,7 +31,6 @@ export * from './contexts/ComponentContext'
31
31
  export * from './helpers/createStyledContext'
32
32
  export * from './helpers/expandStyles'
33
33
  export * from './helpers/propMapper'
34
- export * from './helpers/getAnimationDriver'
35
34
  export * from './helpers/getExpandedShorthands'
36
35
  export * from './helpers/getSplitStyles'
37
36
  export * from './helpers/getStylesAtomic'
@@ -60,9 +59,10 @@ export {
60
59
  } from './hooks/useMedia'
61
60
  export * from './hooks/useTheme'
62
61
  export * from './hooks/useThemeName'
63
- export * from './hooks/useAnimationDriver'
62
+ export * from './hooks/useConfiguration'
64
63
  export * from './hooks/useIsTouchDevice'
65
64
  export * from './hooks/useProps'
65
+ export * from './hooks/useConfiguration'
66
66
 
67
67
  export * from './views/Slot'
68
68
  export * from './views/Stack'
@@ -72,7 +72,7 @@ export * from './views/Theme'
72
72
  export * from './views/ThemeProvider'
73
73
  export * from './views/FontLanguage'
74
74
  export * from './views/TamaguiProvider'
75
- export * from './views/AnimationDriverProvider'
75
+ export * from './views/Configuration'
76
76
 
77
77
  export * from '@tamagui/use-did-finish-ssr'
78
78
  export * from '@tamagui/use-event'
package/src/types.tsx CHANGED
@@ -36,7 +36,7 @@ export type TamaguiTextElement = HTMLElement | RNText
36
36
 
37
37
  export type DebugProp = boolean | 'break' | 'verbose' | 'visualize' | 'profile'
38
38
 
39
- export type TamaguiComponentPropsBase = {
39
+ export type TamaguiComponentPropsBase = WebOnlyPressEvents & {
40
40
  target?: string
41
41
  hitSlop?: PressableProps['hitSlop']
42
42
  /**
@@ -127,20 +127,23 @@ export type TamaguiComponentPropsBase = {
127
127
  */
128
128
  disableClassName?: boolean
129
129
 
130
+ // WEB ONLY TODO probably remove these in favor of something better
131
+
132
+ onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void
133
+ onScroll?: (event: React.UIEvent<HTMLDivElement, UIEvent>) => void
134
+ }
135
+
136
+ export type WebOnlyPressEvents = {
130
137
  onPress?: PressableProps['onPress']
131
138
  onLongPress?: PressableProps['onLongPress']
132
139
  onPressIn?: PressableProps['onPress']
133
140
  onPressOut?: PressableProps['onPress']
134
-
135
- // WEB ONLY TODO probably remove these in favor of something better
136
141
  onHoverIn?: DivAttributes['onMouseEnter']
137
142
  onHoverOut?: DivAttributes['onMouseLeave']
138
143
  onMouseEnter?: DivAttributes['onMouseEnter']
139
144
  onMouseLeave?: DivAttributes['onMouseLeave']
140
145
  onMouseDown?: DivAttributes['onMouseDown']
141
146
  onMouseUp?: DivAttributes['onMouseUp']
142
- onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void
143
- onScroll?: (event: React.UIEvent<HTMLDivElement, UIEvent>) => void
144
147
  }
145
148
 
146
149
  /**
@@ -180,6 +183,7 @@ export type ReactComponentWithRef<Props, Ref> = ForwardRefExoticComponent<
180
183
  >
181
184
 
182
185
  export type ComponentContextI = {
186
+ disableSSR?: boolean
183
187
  inText: boolean
184
188
  language: LanguageContextType | null
185
189
  animationDriver: AnimationDriver | null
@@ -413,12 +417,12 @@ type ConfProps<
413
417
  H extends DefaultFontSetting = DefaultFontSetting,
414
418
  I extends GenericTamaguiSettings = GenericTamaguiSettings
415
419
  > = {
416
- tokens: A
417
- themes: B
420
+ tokens?: A
421
+ themes?: B
418
422
  shorthands?: C
419
423
  media?: D
420
424
  animations?: AnimationDriver<E>
421
- fonts: F
425
+ fonts?: F
422
426
  onlyAllowShorthands?: G
423
427
  defaultFont?: H
424
428
  settings?: I
@@ -605,9 +609,9 @@ export type CreateTamaguiProps = {
605
609
  shorthands?: CreateShorthands
606
610
  media?: GenericTamaguiConfig['media']
607
611
  animations?: AnimationDriver<any>
608
- fonts: GenericTamaguiConfig['fonts']
609
- tokens: GenericTamaguiConfig['tokens']
610
- themes: {
612
+ fonts?: GenericTamaguiConfig['fonts']
613
+ tokens?: GenericTamaguiConfig['tokens']
614
+ themes?: {
611
615
  [key: string]: {
612
616
  [key: string]: string | number | Variable
613
617
  }
@@ -0,0 +1,11 @@
1
+ import { ComponentContext } from '../contexts/ComponentContext'
2
+ import type { AnimationDriver } from '../types'
3
+
4
+ interface ConfigurationProps {
5
+ animationDriver?: AnimationDriver | null
6
+ children: React.ReactNode
7
+ }
8
+
9
+ export const Configuration = (props: ConfigurationProps) => {
10
+ return <ComponentContext.Provider {...props} />
11
+ }
@@ -19,14 +19,12 @@ export const Text = createComponent<TextProps, Text, TextPropsBase>({
19
19
  defaultProps:
20
20
  process.env.TAMAGUI_TARGET === 'web'
21
21
  ? {
22
- color: '$color',
23
22
  display: 'inline',
24
23
  boxSizing: 'border-box',
25
24
  wordWrap: 'break-word',
26
25
  margin: 0,
27
26
  }
28
27
  : {
29
- color: '$color',
30
28
  display: 'flex',
31
29
  suppressHighlighting: true,
32
30
  },
@@ -95,10 +95,12 @@ export function useThemedChildren(
95
95
  })
96
96
  }
97
97
 
98
- const elementsWithContext = (
98
+ const elementsWithContext = themeManager ? (
99
99
  <ThemeManagerContext.Provider value={themeManager}>
100
100
  {next}
101
101
  </ThemeManagerContext.Provider>
102
+ ) : (
103
+ next
102
104
  )
103
105
 
104
106
  if (forceClassName === false) {
@@ -132,7 +134,7 @@ export function wrapThemeElements({
132
134
  return children
133
135
  }
134
136
 
135
- const inverse = themeState.state.inverse
137
+ const inverse = themeState.state?.inverse
136
138
 
137
139
  if (!themeState.isNewTheme && !inverse && !forceClassName) {
138
140
  return <span className="_dsp_contents is_Theme">{children}</span>
@@ -140,7 +142,7 @@ export function wrapThemeElements({
140
142
 
141
143
  // in order to provide currentColor, set color by default
142
144
  const themeColor =
143
- themeState.state.theme && themeState.isNewTheme
145
+ themeState.state?.theme && themeState.isNewTheme
144
146
  ? variableToString(themeState.state.theme.color)
145
147
  : ''
146
148
  const colorStyle = themeColor
@@ -149,7 +151,7 @@ export function wrapThemeElements({
149
151
  }
150
152
  : undefined
151
153
 
152
- let className = themeState.state.className || ''
154
+ let className = themeState.state?.className || ''
153
155
 
154
156
  if (isRoot) {
155
157
  className = className.replace('t_sub_theme', '')
@@ -163,14 +165,11 @@ export function wrapThemeElements({
163
165
 
164
166
  // to prevent tree structure changes always render this if inverse is true or false
165
167
  if (inverse != null || forceClassName) {
168
+ const name = themeState.state?.name || ''
166
169
  themedChildren = (
167
170
  <span
168
171
  className={`${
169
- themeState.state.name.startsWith('light')
170
- ? 't_light'
171
- : themeState.state.name.startsWith('dark')
172
- ? 't_dark'
173
- : ''
172
+ name.startsWith('light') ? 't_light' : name.startsWith('dark') ? 't_dark' : ''
174
173
  } _dsp_contents ${inverse ? 'is_inversed' : ''}`}
175
174
  >
176
175
  {themedChildren}
@@ -57,7 +57,7 @@ export function ThemeDebug({
57
57
  useEffect(() => {
58
58
  // to refresh _listeningIds every so often
59
59
  const tm = setInterval(rerender, 1000)
60
- return () => clearTimeout(tm)
60
+ return () => clearTimeout(tm as any)
61
61
  }, [])
62
62
 
63
63
  return (
@@ -71,8 +71,8 @@ export function ThemeDebug({
71
71
  &lt;Theme {id} /&gt;&nbsp;
72
72
  {JSON.stringify(
73
73
  {
74
- name: themeState.state.name,
75
- className: themeState.state.className,
74
+ name: themeState?.state?.name,
75
+ className: themeState?.state?.className,
76
76
  inverse: themeProps.inverse,
77
77
  forceClassName: themeProps.forceClassName,
78
78
  parent: themeState.themeManager?.state.parentName,
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentContext.d.ts","sourceRoot":"","sources":["../../src/contexts/ComponentContext.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAsB,MAAM,UAAU,CAAA;AAIhE,eAAO,MAAM,gBAAgB,2EAgB3B,CAAA"}
1
+ {"version":3,"file":"ComponentContext.d.ts","sourceRoot":"","sources":["../../src/contexts/ComponentContext.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAsB,MAAM,UAAU,CAAA;AAIhE,eAAO,MAAM,gBAAgB,2EAiB3B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"createComponent.d.ts","sourceRoot":"","sources":["../src/createComponent.tsx"],"names":[],"mappings":"AAIA,OAAO,KAaN,MAAM,OAAO,CAAA;AAsBd,OAAO,EAEL,SAAS,EAIT,cAAc,EACd,UAAU,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,gBAAgB,EAGhB,cAAc,EAEd,SAAS,EAGV,MAAM,SAAS,CAAA;AAoBhB,eAAO,MAAM,QAAQ,eAAsB,CAAA;AA6D3C,wBAAgB,eAAe,CAC7B,kBAAkB,SAAS,UAAU,GAAG,SAAS,GAAG,EAAE,EACtD,GAAG,GAAG,cAAc,EACpB,SAAS,GAAG,KAAK,EACjB,YAAY,EAAE,YAAY,4DAoqC3B;AAeD,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAA;CAAE,OAEjD;AAMD,eAAO,MAAM,MAAM,0DA8CjB,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC5B,SAAS,CAAC,EAAE,cAAc,CAAA;IAC1B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,mBAkGxD"}
1
+ {"version":3,"file":"createComponent.d.ts","sourceRoot":"","sources":["../src/createComponent.tsx"],"names":[],"mappings":"AAIA,OAAO,KAaN,MAAM,OAAO,CAAA;AAsBd,OAAO,EAEL,SAAS,EAKT,cAAc,EACd,UAAU,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,gBAAgB,EAGhB,cAAc,EAEd,SAAS,EAIV,MAAM,SAAS,CAAA;AAoBhB,eAAO,MAAM,QAAQ,eAAsB,CAAA;AA6D3C,wBAAgB,eAAe,CAC7B,kBAAkB,SAAS,UAAU,GAAG,SAAS,GAAG,EAAE,EACtD,GAAG,GAAG,cAAc,EACpB,SAAS,GAAG,KAAK,EACjB,YAAY,EAAE,YAAY,4DAwqC3B;AAoBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAA;CAAE,OAEjD;AAiBD,eAAO,MAAM,MAAM,0DAqCjB,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC5B,SAAS,CAAC,EAAE,cAAc,CAAA;IAC1B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,mBAkGxD"}
@@ -1 +1 @@
1
- {"version":3,"file":"createTamagui.d.ts","sourceRoot":"","sources":["../src/createTamagui.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,kBAAkB,EAIlB,kBAAkB,EAMnB,MAAM,SAAS,CAAA;AAKhB,wBAAgB,aAAa,CAAC,IAAI,SAAS,kBAAkB,EAC3D,QAAQ,EAAE,IAAI,GACb,kBAAkB,CAAC,IAAI,CAAC,CA4Q1B"}
1
+ {"version":3,"file":"createTamagui.d.ts","sourceRoot":"","sources":["../src/createTamagui.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,kBAAkB,EAKlB,kBAAkB,EAMnB,MAAM,SAAS,CAAA;AAKhB,wBAAgB,aAAa,CAAC,IAAI,SAAS,kBAAkB,EAC3D,QAAQ,EAAE,IAAI,GACb,kBAAkB,CAAC,IAAI,CAAC,CA8Q1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"getSplitStyles.d.ts","sourceRoot":"","sources":["../../src/helpers/getSplitStyles.tsx"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAEV,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,aAAa,EAMb,eAAe,EACf,YAAY,EAEZ,qBAAqB,EAErB,cAAc,EACd,WAAW,EAEZ,MAAM,UAAU,CAAA;AAwBjB,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAMhE,KAAK,aAAa,GAAG,CACnB,KAAK,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAC7B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,qBAAqB,EACrC,UAAU,EAAE,eAAe,EAC3B,iBAAiB,CAAC,EAAE,cAAc,GAAG,IAAI,EACzC,OAAO,CAAC,EAAE,iBAAiB,EAE3B,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,SAAS,KACd,cAAc,CAAA;AAEnB,eAAO,MAAM,UAAU,MAAM,CAAA;AAuB7B,eAAO,MAAM,cAAc,EAAE,aAqqC5B,CAAA;AAsDD,eAAO,MAAM,WAAW,eACV,aAAa,UACjB,MAAM,WACL,MAAM,wBACO,OAAO,KAC5B,cA2BF,CAAA;AA0BD,eAAO,MAAM,cAAc,EAAE,aAQ5B,CAAA"}
1
+ {"version":3,"file":"getSplitStyles.d.ts","sourceRoot":"","sources":["../../src/helpers/getSplitStyles.tsx"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAEV,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,aAAa,EAMb,eAAe,EACf,YAAY,EAEZ,qBAAqB,EAErB,cAAc,EACd,WAAW,EAEZ,MAAM,UAAU,CAAA;AA6BjB,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAMhE,KAAK,aAAa,GAAG,CACnB,KAAK,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAC7B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,qBAAqB,EACrC,UAAU,EAAE,eAAe,EAC3B,iBAAiB,CAAC,EAAE,cAAc,GAAG,IAAI,EACzC,OAAO,CAAC,EAAE,iBAAiB,EAE3B,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,SAAS,KACd,cAAc,CAAA;AAEnB,eAAO,MAAM,UAAU,MAAM,CAAA;AAuB7B,eAAO,MAAM,cAAc,EAAE,aAmrC5B,CAAA;AAsDD,eAAO,MAAM,WAAW,eACV,aAAa,UACjB,MAAM,WACL,MAAM,wBACO,OAAO,KAC5B,cA2BF,CAAA;AA0BD,eAAO,MAAM,cAAc,EAAE,aAQ5B,CAAA"}
@@ -6,6 +6,7 @@ import { StyleObject } from '@tamagui/helpers';
6
6
  import type { DebugProp, ViewStyleWithPseudos } from '../types';
7
7
  import { PseudoDescriptor } from './pseudoDescriptors';
8
8
  export declare function getStylesAtomic(stylesIn: ViewStyleWithPseudos, debug?: DebugProp): StyleObject[];
9
+ export declare function transformsToString(transforms: any[]): string;
9
10
  export declare const generateAtomicStyles: (style: ViewStyleWithPseudos, pseudo?: PseudoDescriptor) => StyleObject[];
10
11
  export declare function styleToCSS(style: Record<string, any>): void;
11
12
  //# sourceMappingURL=getStylesAtomic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getStylesAtomic.d.ts","sourceRoot":"","sources":["../../src/helpers/getStylesAtomic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAc,MAAM,kBAAkB,CAAA;AAG1D,OAAO,KAAK,EAAE,SAAS,EAAyB,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAGtF,OAAO,EACL,gBAAgB,EAGjB,MAAM,qBAAqB,CAAA;AAI5B,wBAAgB,eAAe,CAAC,QAAQ,EAAE,oBAAoB,EAAE,KAAK,CAAC,EAAE,SAAS,iBAkBhF;AAMD,eAAO,MAAM,oBAAoB,UACxB,oBAAoB,WAClB,gBAAgB,KACxB,WAAW,EAiDb,CAAA;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAgCpD"}
1
+ {"version":3,"file":"getStylesAtomic.d.ts","sourceRoot":"","sources":["../../src/helpers/getStylesAtomic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAc,MAAM,kBAAkB,CAAA;AAG1D,OAAO,KAAK,EAAE,SAAS,EAAyB,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAGtF,OAAO,EACL,gBAAgB,EAGjB,MAAM,qBAAqB,CAAA;AAI5B,wBAAgB,eAAe,CAAC,QAAQ,EAAE,oBAAoB,EAAE,KAAK,CAAC,EAAE,SAAS,iBAkBhF;AAMD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,GAAG,EAAE,UAgBnD;AAED,eAAO,MAAM,oBAAoB,UACxB,oBAAoB,WAClB,gBAAgB,KACxB,WAAW,EAmCb,CAAA;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAgCpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"getThemeCSSRules.d.ts","sourceRoot":"","sources":["../../src/helpers/getThemeCSSRules.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAG/D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,MAAM,EAAE,kBAAkB,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,WAAW,CAAA;IAClB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,YAyJA"}
1
+ {"version":3,"file":"getThemeCSSRules.d.ts","sourceRoot":"","sources":["../../src/helpers/getThemeCSSRules.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAG/D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,MAAM,EAAE,kBAAkB,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,WAAW,CAAA;IAClB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,YA0JA"}
@@ -1 +1 @@
1
- {"version":3,"file":"propMapper.d.ts","sourceRoot":"","sources":["../../src/helpers/propMapper.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,iBAAiB,EAGjB,qBAAqB,EAEtB,MAAM,UAAU,CAAA;AAOjB,eAAO,MAAM,UAAU,EAAE,UAqExB,CAAA;AAgGD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,qBAAqB,sBAkBtF;AAMD,eAAO,MAAM,uBAAuB,cAAe,GAAG,QAErD,CAAA;AAyID,eAAO,MAAM,cAAc,QACpB,MAAM,SACJ,MAAM,wDAED,QAAQ,aAAa,CAAC,QAqFnC,CAAA"}
1
+ {"version":3,"file":"propMapper.d.ts","sourceRoot":"","sources":["../../src/helpers/propMapper.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,iBAAiB,EAGjB,qBAAqB,EAEtB,MAAM,UAAU,CAAA;AAOjB,eAAO,MAAM,UAAU,EAAE,UAqExB,CAAA;AAgGD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,qBAAqB,sBAkBtF;AAMD,eAAO,MAAM,uBAAuB,cAAe,GAAG,QAErD,CAAA;AAuID,eAAO,MAAM,cAAc,QACpB,MAAM,SACJ,MAAM,wDAED,QAAQ,aAAa,CAAC,QAqFnC,CAAA"}