@tamagui/web 1.73.1 → 1.74.0
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/createComponent.js +7 -4
- package/dist/cjs/createComponent.js.map +1 -1
- package/dist/cjs/createComponent.native.js +10 -5
- package/dist/cjs/createComponent.native.js.map +1 -1
- package/dist/cjs/createTamagui.js +0 -1
- package/dist/cjs/createTamagui.js.map +1 -1
- package/dist/cjs/createTamagui.native.js +0 -1
- package/dist/cjs/createTamagui.native.js.map +1 -1
- package/dist/cjs/helpers/getSplitStyles.js +1 -1
- package/dist/cjs/helpers/getSplitStyles.js.map +1 -1
- package/dist/cjs/helpers/getSplitStyles.native.js +1 -1
- package/dist/cjs/helpers/getSplitStyles.native.js.map +1 -1
- package/dist/cjs/helpers/propMapper.js +14 -2
- package/dist/cjs/helpers/propMapper.js.map +1 -1
- package/dist/cjs/helpers/propMapper.native.js +14 -2
- package/dist/cjs/helpers/propMapper.native.js.map +1 -1
- package/dist/cjs/helpers/themeable.js.map +1 -1
- package/dist/cjs/helpers/themeable.native.js.map +1 -1
- package/dist/cjs/hooks/useTheme.js +18 -11
- package/dist/cjs/hooks/useTheme.js.map +1 -1
- package/dist/cjs/hooks/useTheme.native.js +36 -11
- package/dist/cjs/hooks/useTheme.native.js.map +1 -1
- package/dist/cjs/setupReactNative.js +21 -12
- package/dist/cjs/setupReactNative.js.map +1 -1
- package/dist/cjs/setupReactNative.native.js +21 -12
- package/dist/cjs/setupReactNative.native.js.map +1 -1
- package/dist/cjs/styled.js +1 -1
- package/dist/cjs/styled.js.map +1 -1
- package/dist/cjs/styled.native.js +1 -1
- package/dist/cjs/styled.native.js.map +1 -1
- package/dist/cjs/views/Theme.js.map +1 -1
- package/dist/cjs/views/Theme.native.js.map +1 -1
- package/dist/esm/createComponent.js +7 -4
- package/dist/esm/createComponent.js.map +1 -1
- package/dist/esm/createTamagui.js +0 -1
- package/dist/esm/createTamagui.js.map +1 -1
- package/dist/esm/helpers/getSplitStyles.js +1 -1
- package/dist/esm/helpers/getSplitStyles.js.map +1 -1
- package/dist/esm/helpers/propMapper.js +15 -3
- package/dist/esm/helpers/propMapper.js.map +1 -1
- package/dist/esm/helpers/themeable.js.map +1 -1
- package/dist/esm/hooks/useTheme.js +19 -12
- package/dist/esm/hooks/useTheme.js.map +1 -1
- package/dist/esm/setupReactNative.js +20 -12
- package/dist/esm/setupReactNative.js.map +1 -1
- package/dist/esm/styled.js +1 -1
- package/dist/esm/styled.js.map +1 -1
- package/dist/esm/views/Theme.js.map +1 -1
- package/package.json +9 -9
- package/src/createComponent.tsx +20 -6
- package/src/createTamagui.ts +0 -1
- package/src/helpers/getSplitStyles.tsx +0 -1
- package/src/helpers/propMapper.ts +11 -2
- package/src/helpers/themeable.tsx +1 -1
- package/src/hooks/useTheme.tsx +75 -30
- package/src/setupReactNative.ts +67 -12
- package/src/styled.tsx +5 -5
- package/src/types.tsx +29 -1
- package/src/views/Theme.tsx +1 -0
- package/types/createComponent.d.ts.map +1 -1
- package/types/createTamagui.d.ts.map +1 -1
- package/types/helpers/getSplitStyles.d.ts.map +1 -1
- package/types/helpers/propMapper.d.ts.map +1 -1
- package/types/hooks/useConfiguration.d.ts +1 -0
- package/types/hooks/useConfiguration.d.ts.map +1 -1
- package/types/hooks/useTheme.d.ts +4 -4
- package/types/hooks/useTheme.d.ts.map +1 -1
- package/types/setupReactNative.d.ts +6 -1
- package/types/setupReactNative.d.ts.map +1 -1
- package/types/styled.d.ts.map +1 -1
- package/types/types.d.ts +24 -1
- package/types/types.d.ts.map +1 -1
- package/types/views/Theme.d.ts.map +1 -1
package/src/createComponent.tsx
CHANGED
|
@@ -55,8 +55,10 @@ import {
|
|
|
55
55
|
TamaguiElement,
|
|
56
56
|
TamaguiInternalConfig,
|
|
57
57
|
TextProps,
|
|
58
|
+
ThemeProps,
|
|
58
59
|
UseAnimationHook,
|
|
59
60
|
UseAnimationProps,
|
|
61
|
+
UseThemeWithStateProps,
|
|
60
62
|
WebOnlyPressEvents,
|
|
61
63
|
} from './types'
|
|
62
64
|
import { Slot } from './views/Slot'
|
|
@@ -494,7 +496,7 @@ export function createComponent<
|
|
|
494
496
|
const noClassNames = shouldAvoidClasses || shouldForcePseudo
|
|
495
497
|
|
|
496
498
|
// internal use only
|
|
497
|
-
const disableThemeProp = props['data-disable-theme']
|
|
499
|
+
const disableThemeProp = false //props['data-disable-theme']
|
|
498
500
|
const disableTheme = (disableThemeProp && !willBeAnimated) || isHOC
|
|
499
501
|
|
|
500
502
|
if (process.env.NODE_ENV === 'development' && time) time`theme-props`
|
|
@@ -503,19 +505,31 @@ export function createComponent<
|
|
|
503
505
|
stateRef.current.themeShallow = true
|
|
504
506
|
}
|
|
505
507
|
|
|
506
|
-
const themeStateProps = {
|
|
508
|
+
const themeStateProps: UseThemeWithStateProps = {
|
|
507
509
|
name: props.theme,
|
|
508
510
|
componentName,
|
|
509
|
-
// @ts-ignore this is internal use only
|
|
510
511
|
disable: disableTheme,
|
|
511
512
|
shallow: stateRef.current.themeShallow,
|
|
513
|
+
// if this returns undefined it defers to the keys tracking, so its only used to force either updates or no updates
|
|
512
514
|
shouldUpdate: () => {
|
|
513
|
-
//
|
|
514
|
-
|
|
515
|
+
// if (isAnimated && process.env.TAMAGUI_TARGET === 'native') {
|
|
516
|
+
// // when animated on native we can safely say 'always update on theme changes'
|
|
517
|
+
// // this lets us optimize
|
|
518
|
+
// return true
|
|
519
|
+
// }
|
|
520
|
+
return (
|
|
521
|
+
// when we use $theme- styles we need to force it to re-render on theme changes (this can be optimized likely)
|
|
522
|
+
stateRef.current.isListeningToTheme
|
|
523
|
+
)
|
|
515
524
|
},
|
|
516
525
|
debug: debugProp,
|
|
517
526
|
}
|
|
518
527
|
|
|
528
|
+
// on native we optimize theme changes if fastSchemeChange is enabled, otherwise deopt
|
|
529
|
+
if (process.env.TAMAGUI_TARGET === 'native') {
|
|
530
|
+
themeStateProps.deopt = !config?.settings.fastSchemeChange ? true : willBeAnimated
|
|
531
|
+
}
|
|
532
|
+
|
|
519
533
|
const isExiting = Boolean(!state.unmounted && presence?.[0] === false)
|
|
520
534
|
|
|
521
535
|
if (process.env.NODE_ENV === 'development') {
|
|
@@ -1295,7 +1309,7 @@ export function createComponent<
|
|
|
1295
1309
|
|
|
1296
1310
|
let res: ComponentType = component as any
|
|
1297
1311
|
|
|
1298
|
-
if (process.env.
|
|
1312
|
+
if (!process.env.TAMAGUI_DISABLE_MEMO) {
|
|
1299
1313
|
res = memo(res) as any
|
|
1300
1314
|
}
|
|
1301
1315
|
|
package/src/createTamagui.ts
CHANGED
|
@@ -824,7 +824,6 @@ export const getSplitStyles: StyleSplitter = (
|
|
|
824
824
|
pseudos[key] ||= {}
|
|
825
825
|
pseudos[key][pkey] = val
|
|
826
826
|
mergeStyle(styleState, pkey, val)
|
|
827
|
-
usedKeys[pkey] = Math.max(usedKeys[pkey], importance)
|
|
828
827
|
}
|
|
829
828
|
|
|
830
829
|
if (process.env.NODE_ENV === 'development' && debug === 'verbose') {
|
|
@@ -419,6 +419,10 @@ export const getTokenForKey = (
|
|
|
419
419
|
|
|
420
420
|
if (hasSet) {
|
|
421
421
|
const out = resolveVariableValue(valOrVar, resolveAs)
|
|
422
|
+
if (process.env.NODE_ENV === 'development' && styleState.debug === 'verbose') {
|
|
423
|
+
// biome-ignore lint/suspicious/noConsoleLog: <explanation>
|
|
424
|
+
console.log(`resolved`, resolveAs, valOrVar.get, out)
|
|
425
|
+
}
|
|
422
426
|
return out
|
|
423
427
|
}
|
|
424
428
|
|
|
@@ -442,10 +446,15 @@ function resolveVariableValue(
|
|
|
442
446
|
) {
|
|
443
447
|
if (resolveValues === 'none') return valOrVar
|
|
444
448
|
if (isVariable(valOrVar)) {
|
|
445
|
-
if (
|
|
449
|
+
if (resolveValues === 'value') {
|
|
446
450
|
return valOrVar.val
|
|
447
451
|
}
|
|
448
|
-
|
|
452
|
+
// @ts-expect-error this is fine until we can type better
|
|
453
|
+
const get = valOrVar.get
|
|
454
|
+
if (typeof get === 'function') {
|
|
455
|
+
return get()
|
|
456
|
+
}
|
|
457
|
+
return process.env.TAMAGUI_TARGET === 'native' ? valOrVar.val : valOrVar.variable
|
|
449
458
|
}
|
|
450
459
|
return valOrVar
|
|
451
460
|
}
|
|
@@ -27,7 +27,7 @@ export function themeable<Component extends (props: any) => any>(
|
|
|
27
27
|
let contents = (
|
|
28
28
|
<Theme
|
|
29
29
|
componentName={componentName || staticConfig?.componentName}
|
|
30
|
-
name={
|
|
30
|
+
name={theme || null}
|
|
31
31
|
disable-child-theme
|
|
32
32
|
debug={props.debug}
|
|
33
33
|
inverse={themeInverse}
|
package/src/hooks/useTheme.tsx
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
import { isClient, isServer, isWeb } from '@tamagui/constants'
|
|
1
|
+
import { isClient, isIos, isServer } from '@tamagui/constants'
|
|
3
2
|
import { useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'
|
|
4
3
|
|
|
5
4
|
import { getConfig } from '../config'
|
|
@@ -15,6 +14,7 @@ import type {
|
|
|
15
14
|
DebugProp,
|
|
16
15
|
ThemeParsed,
|
|
17
16
|
ThemeProps,
|
|
17
|
+
UseThemeWithStateProps,
|
|
18
18
|
VariableVal,
|
|
19
19
|
VariableValGeneric,
|
|
20
20
|
} from '../types'
|
|
@@ -33,8 +33,9 @@ let cached: any
|
|
|
33
33
|
function getDefaultThemeProxied() {
|
|
34
34
|
if (cached) return cached
|
|
35
35
|
const config = getConfig()
|
|
36
|
-
const
|
|
37
|
-
|
|
36
|
+
const name = config.themes.light ? 'light' : Object.keys(config.themes)[0]
|
|
37
|
+
const defaultTheme = config.themes[name]
|
|
38
|
+
cached = getThemeProxied({ theme: defaultTheme, name })
|
|
38
39
|
return cached
|
|
39
40
|
}
|
|
40
41
|
|
|
@@ -61,7 +62,7 @@ export const useTheme = (props: ThemeProps = emptyProps) => {
|
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
export const useThemeWithState = (
|
|
64
|
-
props:
|
|
65
|
+
props: UseThemeWithStateProps
|
|
65
66
|
): [ChangedThemeResponse, ThemeParsed] => {
|
|
66
67
|
const keys = useRef<string[]>([])
|
|
67
68
|
|
|
@@ -73,6 +74,7 @@ export const useThemeWithState = (
|
|
|
73
74
|
? () => {
|
|
74
75
|
const next =
|
|
75
76
|
props.shouldUpdate?.() ?? (keys.current.length > 0 ? true : undefined)
|
|
77
|
+
|
|
76
78
|
if (
|
|
77
79
|
process.env.NODE_ENV === 'development' &&
|
|
78
80
|
props.debug &&
|
|
@@ -104,9 +106,11 @@ export const useThemeWithState = (
|
|
|
104
106
|
}
|
|
105
107
|
|
|
106
108
|
const themeProxied = useMemo(() => {
|
|
107
|
-
if (!themeManager || !state?.theme)
|
|
108
|
-
|
|
109
|
-
|
|
109
|
+
if (!themeManager || !state?.theme) {
|
|
110
|
+
return {}
|
|
111
|
+
}
|
|
112
|
+
return getThemeProxied(state, props.deopt, themeManager, keys.current, props.debug)
|
|
113
|
+
}, [state, themeManager, props.deopt, props.debug])
|
|
110
114
|
|
|
111
115
|
if (process.env.NODE_ENV === 'development' && props.debug === 'verbose') {
|
|
112
116
|
console.groupCollapsed(' 🔹 useTheme =>', state?.name)
|
|
@@ -119,11 +123,24 @@ export const useThemeWithState = (
|
|
|
119
123
|
}
|
|
120
124
|
|
|
121
125
|
export function getThemeProxied(
|
|
122
|
-
theme:
|
|
126
|
+
{ theme, name }: ThemeManagerState,
|
|
127
|
+
deopt = false,
|
|
123
128
|
themeManager?: ThemeManager,
|
|
124
129
|
keys?: string[],
|
|
125
130
|
debug?: DebugProp
|
|
126
131
|
): UseThemeResult {
|
|
132
|
+
if (!theme) return {}
|
|
133
|
+
|
|
134
|
+
function track(key: string) {
|
|
135
|
+
if (keys && !keys.includes(key)) {
|
|
136
|
+
keys.push(key)
|
|
137
|
+
if (process.env.NODE_ENV === 'development' && debug) {
|
|
138
|
+
// biome-ignore lint/suspicious/noConsoleLog: <explanation>
|
|
139
|
+
console.log(` 🎨 useTheme() tracking new key: ${key}`)
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
127
144
|
return createProxy(theme, {
|
|
128
145
|
has(_, key) {
|
|
129
146
|
if (Reflect.has(theme, key)) {
|
|
@@ -138,6 +155,7 @@ export function getThemeProxied(
|
|
|
138
155
|
if (key === GetThemeUnwrapped) {
|
|
139
156
|
return theme
|
|
140
157
|
}
|
|
158
|
+
|
|
141
159
|
if (
|
|
142
160
|
// dont ask me, idk why but on hermes you can see that useTheme()[undefined] passes in STRING undefined to proxy
|
|
143
161
|
// if someone is crazy enough to use "undefined" as a theme key then this not working is on them
|
|
@@ -147,6 +165,7 @@ export function getThemeProxied(
|
|
|
147
165
|
// auto convert variables to plain
|
|
148
166
|
const keyString = key[0] === '$' ? key.slice(1) : key
|
|
149
167
|
const val = theme[keyString]
|
|
168
|
+
|
|
150
169
|
if (val && typeof val === 'object') {
|
|
151
170
|
// TODO this could definitely be done better by at the very minimum
|
|
152
171
|
// proxying it up front and just having a listener here
|
|
@@ -154,22 +173,46 @@ export function getThemeProxied(
|
|
|
154
173
|
// when they touch the actual value we only track it
|
|
155
174
|
// if its a variable (web), its ignored!
|
|
156
175
|
get(_, subkey) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
if (process.env.
|
|
165
|
-
//
|
|
166
|
-
|
|
176
|
+
if (subkey === 'val') {
|
|
177
|
+
// always track .val
|
|
178
|
+
track(keyString)
|
|
179
|
+
} else if (subkey === 'get') {
|
|
180
|
+
return () => {
|
|
181
|
+
const outVal = getVariable(val)
|
|
182
|
+
|
|
183
|
+
if (process.env.TAMAGUI_TARGET === 'native') {
|
|
184
|
+
// ios can avoid re-rendering in some cases when we are using a root light/dark
|
|
185
|
+
// disabled in cases where we have animations
|
|
186
|
+
if (isIos && !deopt) {
|
|
187
|
+
const isDark = name.startsWith('dark')
|
|
188
|
+
const isLight = !isDark && name.startsWith('light')
|
|
189
|
+
if (isDark || isLight) {
|
|
190
|
+
const oppositeThemeName = name.replace(
|
|
191
|
+
isDark ? 'dark' : 'light',
|
|
192
|
+
isDark ? 'light' : 'dark'
|
|
193
|
+
)
|
|
194
|
+
const oppositeTheme = getConfig().themes[oppositeThemeName]
|
|
195
|
+
const oppositeVal = getVariable(oppositeTheme?.[keyString])
|
|
196
|
+
if (oppositeVal) {
|
|
197
|
+
const dynamicVal = {
|
|
198
|
+
dynamic: {
|
|
199
|
+
dark: isDark ? outVal : oppositeVal,
|
|
200
|
+
light: isLight ? outVal : oppositeVal,
|
|
201
|
+
},
|
|
202
|
+
}
|
|
203
|
+
return dynamicVal
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// if we dont return early with a dynamic val on native, always track
|
|
209
|
+
track(keyString)
|
|
167
210
|
}
|
|
211
|
+
|
|
212
|
+
return outVal
|
|
168
213
|
}
|
|
169
214
|
}
|
|
170
|
-
|
|
171
|
-
return () => getVariable(val)
|
|
172
|
-
}
|
|
215
|
+
|
|
173
216
|
return Reflect.get(val as any, subkey)
|
|
174
217
|
},
|
|
175
218
|
})
|
|
@@ -184,15 +227,12 @@ export function getThemeProxied(
|
|
|
184
227
|
export const activeThemeManagers = new Set<ThemeManager>()
|
|
185
228
|
|
|
186
229
|
export const useChangeThemeEffect = (
|
|
187
|
-
props:
|
|
230
|
+
props: UseThemeWithStateProps,
|
|
188
231
|
isRoot = false,
|
|
189
232
|
keys?: string[],
|
|
190
233
|
shouldUpdate?: () => boolean | undefined
|
|
191
234
|
): ChangedThemeResponse => {
|
|
192
|
-
const {
|
|
193
|
-
// @ts-expect-error internal use only
|
|
194
|
-
disable,
|
|
195
|
-
} = props
|
|
235
|
+
const { disable } = props
|
|
196
236
|
|
|
197
237
|
const parentManager = useContext(ThemeManagerContext)
|
|
198
238
|
|
|
@@ -267,8 +307,12 @@ export const useChangeThemeEffect = (
|
|
|
267
307
|
})
|
|
268
308
|
|
|
269
309
|
const disposeChangeListener = parentManager?.onChangeTheme((name, manager) => {
|
|
270
|
-
const force =
|
|
271
|
-
|
|
310
|
+
const force =
|
|
311
|
+
shouldUpdate?.() ||
|
|
312
|
+
props.deopt ||
|
|
313
|
+
// this fixes themeable() not updating with the new fastSchemeChange setting
|
|
314
|
+
(process.env.TAMAGUI_TARGET === 'native' && props['disable-child-theme'])
|
|
315
|
+
const doUpdate = force ?? Boolean(keys?.length)
|
|
272
316
|
|
|
273
317
|
if (process.env.NODE_ENV === 'development' && props.debug) {
|
|
274
318
|
// biome-ignore lint/suspicious/noConsoleLog: <explanation>
|
|
@@ -281,6 +325,7 @@ export const useChangeThemeEffect = (
|
|
|
281
325
|
keys,
|
|
282
326
|
})
|
|
283
327
|
}
|
|
328
|
+
|
|
284
329
|
if (doUpdate) {
|
|
285
330
|
setThemeState(createState)
|
|
286
331
|
}
|
|
@@ -367,7 +412,7 @@ export const useChangeThemeEffect = (
|
|
|
367
412
|
if (nextState) {
|
|
368
413
|
state = nextState
|
|
369
414
|
|
|
370
|
-
if (!prev.isNewTheme
|
|
415
|
+
if (!prev.isNewTheme) {
|
|
371
416
|
themeManager = getNewThemeManager()
|
|
372
417
|
} else {
|
|
373
418
|
themeManager.updateState(nextState)
|
package/src/setupReactNative.ts
CHANGED
|
@@ -3,20 +3,75 @@ import { StaticConfig } from './types'
|
|
|
3
3
|
const ReactNativeStaticConfigs = new WeakMap<any, Partial<StaticConfig> | null>()
|
|
4
4
|
|
|
5
5
|
export function getReactNativeConfig(Component: any) {
|
|
6
|
+
if (!Component) return
|
|
7
|
+
|
|
8
|
+
if (process.env.TAMAGUI_TARGET === 'native') {
|
|
9
|
+
if (Component.getSizeWithHeaders) {
|
|
10
|
+
return RNConfigs.Image
|
|
11
|
+
}
|
|
12
|
+
if (Component.propTypes?.textBreakStrategy) {
|
|
13
|
+
return RNConfigs.Text
|
|
14
|
+
}
|
|
15
|
+
if (Component.propTypes?.onTextInput) {
|
|
16
|
+
return
|
|
17
|
+
}
|
|
18
|
+
// can assume everything else is react native on native
|
|
19
|
+
return RNConfigs.default
|
|
20
|
+
} else {
|
|
21
|
+
if (Component.getSize && Component.prefetch) {
|
|
22
|
+
return RNConfigs.Image
|
|
23
|
+
}
|
|
24
|
+
if (Component.displayName === 'Text' && Component.render) {
|
|
25
|
+
return RNConfigs.Text
|
|
26
|
+
}
|
|
27
|
+
if (
|
|
28
|
+
Component.render &&
|
|
29
|
+
(Component.displayName === 'ScrollView' || Component.displayName === 'View')
|
|
30
|
+
) {
|
|
31
|
+
return RNConfigs.default
|
|
32
|
+
}
|
|
33
|
+
if (Component.State?.blurTextInput) {
|
|
34
|
+
return RNConfigs.TextInput
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
6
38
|
return ReactNativeStaticConfigs.get(Component)
|
|
7
39
|
}
|
|
8
40
|
|
|
41
|
+
const RNConfigs = {
|
|
42
|
+
Image: {
|
|
43
|
+
isReactNative: true,
|
|
44
|
+
inlineProps: new Set(['src', 'width', 'height']),
|
|
45
|
+
},
|
|
46
|
+
Text: {
|
|
47
|
+
isReactNative: true,
|
|
48
|
+
isText: true,
|
|
49
|
+
},
|
|
50
|
+
TextInput: {
|
|
51
|
+
isReactNative: true,
|
|
52
|
+
isInput: true,
|
|
53
|
+
isText: true,
|
|
54
|
+
},
|
|
55
|
+
default: {
|
|
56
|
+
isReactNative: true,
|
|
57
|
+
},
|
|
58
|
+
} satisfies Record<string, Partial<StaticConfig>>
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @deprecated this is no longer necessary, tamagui auto-detects RN views
|
|
62
|
+
*/
|
|
9
63
|
export function setupReactNative(rnExports: Record<string, any>) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
64
|
+
// no-op
|
|
65
|
+
// for (const key in rnExports) {
|
|
66
|
+
// if (key[0].toLowerCase() === key[0]) continue
|
|
67
|
+
// const val = rnExports[key]
|
|
68
|
+
// if (val && typeof val === 'object') {
|
|
69
|
+
// ReactNativeStaticConfigs.set(val, {
|
|
70
|
+
// isReactNative: true,
|
|
71
|
+
// isText: key === 'Text' || key === 'TextInput',
|
|
72
|
+
// isInput: key === 'TextInput' || key === 'TextArea',
|
|
73
|
+
// inlineProps: key === 'Image' ? new Set(['src', 'width', 'height']) : undefined,
|
|
74
|
+
// })
|
|
75
|
+
// }
|
|
76
|
+
// }
|
|
22
77
|
}
|
package/src/styled.tsx
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { stylePropsAll } from '@tamagui/helpers'
|
|
2
|
-
|
|
3
1
|
import { createComponent } from './createComponent'
|
|
4
2
|
import { StyledContext } from './helpers/createStyledContext'
|
|
5
3
|
import { mergeVariants } from './helpers/mergeVariants'
|
|
@@ -77,12 +75,14 @@ export function styled<
|
|
|
77
75
|
? ComponentIn
|
|
78
76
|
: parentStaticConfig?.Component || ComponentIn
|
|
79
77
|
|
|
80
|
-
const reactNativeConfig =
|
|
78
|
+
const reactNativeConfig = !parentStaticConfig
|
|
79
|
+
? getReactNativeConfig(Component)
|
|
80
|
+
: undefined
|
|
81
|
+
|
|
81
82
|
const isReactNative = Boolean(
|
|
82
83
|
reactNativeConfig ||
|
|
83
84
|
staticExtractionOptions?.isReactNative ||
|
|
84
|
-
parentStaticConfig?.isReactNative
|
|
85
|
-
getReactNativeConfig(parentStaticConfig?.Component)
|
|
85
|
+
parentStaticConfig?.isReactNative
|
|
86
86
|
)
|
|
87
87
|
|
|
88
88
|
const staticConfigProps = (() => {
|
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
|
|
39
|
+
export type TamaguiComponentPropsBaseBase = {
|
|
40
40
|
target?: string
|
|
41
41
|
hitSlop?: PressableProps['hitSlop']
|
|
42
42
|
/**
|
|
@@ -133,6 +133,9 @@ export type TamaguiComponentPropsBase = WebOnlyPressEvents & {
|
|
|
133
133
|
onScroll?: (event: React.UIEvent<HTMLDivElement, UIEvent>) => void
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
export type TamaguiComponentPropsBase<A = {}> = WebOnlyPressEvents &
|
|
137
|
+
TamaguiComponentPropsBaseBase
|
|
138
|
+
|
|
136
139
|
export type WebOnlyPressEvents = {
|
|
137
140
|
onPress?: PressableProps['onPress']
|
|
138
141
|
onLongPress?: PressableProps['onLongPress']
|
|
@@ -515,6 +518,12 @@ export interface ThemeProps {
|
|
|
515
518
|
shallow?: boolean
|
|
516
519
|
}
|
|
517
520
|
|
|
521
|
+
// more low level
|
|
522
|
+
export type UseThemeWithStateProps = ThemeProps & {
|
|
523
|
+
deopt?: boolean
|
|
524
|
+
disable?: boolean
|
|
525
|
+
}
|
|
526
|
+
|
|
518
527
|
type ArrayIntersection<A extends any[]> = A[keyof A]
|
|
519
528
|
|
|
520
529
|
type GetAltThemeNames<S> =
|
|
@@ -600,6 +609,25 @@ type GenericTamaguiSettings = {
|
|
|
600
609
|
* @default false
|
|
601
610
|
*/
|
|
602
611
|
mediaPropOrder?: boolean
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* On iOS, this enables a mode where Tamagui returns color values using `DynamicColorIOS`
|
|
615
|
+
* This is a React Native built in feature, you can read the docs here:
|
|
616
|
+
* https://reactnative.dev/docs/dynamiccolorios
|
|
617
|
+
*
|
|
618
|
+
* We're working to make this enabled by default without any setting, but Tamagui themes
|
|
619
|
+
* support inversing and/or changing to light/dark at any point in the tree. We haven't implemented
|
|
620
|
+
* support for either of these cases when combined with this feature.
|
|
621
|
+
*
|
|
622
|
+
* So - as long as you:
|
|
623
|
+
*
|
|
624
|
+
* 1. Only use light/dark changes of themes at the root of your app
|
|
625
|
+
* 2. Don't use <Theme inverse> or themeInverse
|
|
626
|
+
* 3. Always change light/dark alongside the Appearance.colorSheme
|
|
627
|
+
*
|
|
628
|
+
* Then this feature is safe to turn on and will significantly speed up dark/light re-renders.
|
|
629
|
+
*/
|
|
630
|
+
fastSchemeChange?: boolean
|
|
603
631
|
}
|
|
604
632
|
|
|
605
633
|
export type TamaguiSettings = TamaguiConfig['settings']
|
package/src/views/Theme.tsx
CHANGED
|
@@ -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,EAKT,cAAc,EACd,UAAU,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,gBAAgB,EAGhB,cAAc,EAEd,SAAS,
|
|
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,EAMV,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,4DAorC3B;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,EAKlB,kBAAkB,EAMnB,MAAM,SAAS,CAAA;AAKhB,wBAAgB,aAAa,CAAC,IAAI,SAAS,kBAAkB,EAC3D,QAAQ,EAAE,IAAI,GACb,kBAAkB,CAAC,IAAI,CAAC,
|
|
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,CA6Q1B"}
|
|
@@ -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;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,
|
|
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,aAkrC5B,CAAA;AAsDD,eAAO,MAAM,WAAW,eACV,aAAa,UACjB,MAAM,WACL,MAAM,wBACO,OAAO,KAC5B,cA2BF,CAAA;AA0BD,eAAO,MAAM,cAAc,EAAE,aAQ5B,CAAA"}
|
|
@@ -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;AAuID,eAAO,MAAM,cAAc,QACpB,MAAM,SACJ,MAAM,wDAED,QAAQ,aAAa,CAAC,
|
|
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,QAyFnC,CAAA"}
|
|
@@ -66,6 +66,7 @@ export declare const useConfiguration: () => {
|
|
|
66
66
|
}) | undefined;
|
|
67
67
|
autocompleteSpecificTokens?: (boolean | "except-special") | undefined;
|
|
68
68
|
mediaPropOrder?: boolean | undefined;
|
|
69
|
+
fastSchemeChange?: boolean | undefined;
|
|
69
70
|
};
|
|
70
71
|
tokens: Omit<{
|
|
71
72
|
[x: string]: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConfiguration.d.ts","sourceRoot":"","sources":["../../src/hooks/useConfiguration.tsx"],"names":[],"mappings":"AAKA,eAAO,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"useConfiguration.d.ts","sourceRoot":"","sources":["../../src/hooks/useConfiguration.tsx"],"names":[],"mappings":"AAKA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQ5B,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Variable } from '../createVariable';
|
|
2
2
|
import { ThemeManager, ThemeManagerState } from '../helpers/ThemeManager';
|
|
3
|
-
import type { DebugProp, ThemeParsed, ThemeProps, VariableVal, VariableValGeneric } from '../types';
|
|
3
|
+
import type { DebugProp, ThemeParsed, ThemeProps, UseThemeWithStateProps, VariableVal, VariableValGeneric } from '../types';
|
|
4
4
|
export type ChangedThemeResponse = {
|
|
5
5
|
state?: ThemeManagerState;
|
|
6
6
|
themeManager?: ThemeManager | null;
|
|
@@ -14,8 +14,8 @@ export type UseThemeResult = {
|
|
|
14
14
|
[Key in keyof ThemeParsed]: ThemeGettable<ThemeParsed[Key]>;
|
|
15
15
|
};
|
|
16
16
|
export declare const useTheme: (props?: ThemeProps) => UseThemeResult;
|
|
17
|
-
export declare const useThemeWithState: (props:
|
|
18
|
-
export declare function getThemeProxied(theme:
|
|
17
|
+
export declare const useThemeWithState: (props: UseThemeWithStateProps) => [ChangedThemeResponse, ThemeParsed];
|
|
18
|
+
export declare function getThemeProxied({ theme, name }: ThemeManagerState, deopt?: boolean, themeManager?: ThemeManager, keys?: string[], debug?: DebugProp): UseThemeResult;
|
|
19
19
|
export declare const activeThemeManagers: Set<ThemeManager>;
|
|
20
|
-
export declare const useChangeThemeEffect: (props:
|
|
20
|
+
export declare const useChangeThemeEffect: (props: UseThemeWithStateProps, isRoot?: boolean, keys?: string[], shouldUpdate?: () => boolean | undefined) => ChangedThemeResponse;
|
|
21
21
|
//# sourceMappingURL=useTheme.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTheme.d.ts","sourceRoot":"","sources":["../../src/hooks/useTheme.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useTheme.d.ts","sourceRoot":"","sources":["../../src/hooks/useTheme.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAe,MAAM,mBAAmB,CAAA;AAEzD,OAAO,EACL,YAAY,EACZ,iBAAiB,EAElB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,kBAAkB,EACnB,MAAM,UAAU,CAAA;AAGjB,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,iBAAiB,CAAA;IACzB,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAA;IAClC,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAcD,MAAM,MAAM,aAAa,CAAC,GAAG,IAAI,GAAG,GAAG;IACrC,GAAG,EAAE,MACD,MAAM,GACN,CAAC,GAAG,SAAS,QAAQ,CAAC,MAAM,CAAC,CAAC,GAC1B,CAAC,SAAS,kBAAkB,GAC1B,GAAG,GACH,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,GACtB,GAAG,SAAS,WAAW,GACvB,MAAM,GAAG,MAAM,GACf,OAAO,CAAC,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;KAC1B,GAAG,IAAI,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;CAC5D,CAAA;AAED,eAAO,MAAM,QAAQ,WAAW,UAAU,mBAIzC,CAAA;AAED,eAAO,MAAM,iBAAiB,UACrB,sBAAsB,KAC5B,CAAC,oBAAoB,EAAE,WAAW,CAyDpC,CAAA;AAED,wBAAgB,eAAe,CAC7B,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,iBAAiB,EAClC,KAAK,UAAQ,EACb,YAAY,CAAC,EAAE,YAAY,EAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,KAAK,CAAC,EAAE,SAAS,GAChB,cAAc,CA8FhB;AAED,eAAO,MAAM,mBAAmB,mBAA0B,CAAA;AAE1D,eAAO,MAAM,oBAAoB,UACxB,sBAAsB,2BAEtB,MAAM,EAAE,iBACA,MAAM,OAAO,GAAG,SAAS,KACvC,oBAqPF,CAAA"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { StaticConfig } from './types';
|
|
2
|
-
export declare function getReactNativeConfig(Component: any): Partial<StaticConfig> |
|
|
2
|
+
export declare function getReactNativeConfig(Component: any): Partial<StaticConfig> | {
|
|
3
|
+
isReactNative: true;
|
|
4
|
+
} | null | undefined;
|
|
5
|
+
/**
|
|
6
|
+
* @deprecated this is no longer necessary, tamagui auto-detects RN views
|
|
7
|
+
*/
|
|
3
8
|
export declare function setupReactNative(rnExports: Record<string, any>): void;
|
|
4
9
|
//# sourceMappingURL=setupReactNative.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupReactNative.d.ts","sourceRoot":"","sources":["../src/setupReactNative.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAItC,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG
|
|
1
|
+
{"version":3,"file":"setupReactNative.d.ts","sourceRoot":"","sources":["../src/setupReactNative.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAItC,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG;;qBAkClD;AAqBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAc9D"}
|
package/types/styled.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styled.d.ts","sourceRoot":"","sources":["../src/styled.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"styled.d.ts","sourceRoot":"","sources":["../src/styled.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEjD,OAAO,KAAK,EACV,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,SAAS,CAAA;AAEhB,KAAK,YAAY,CAAC,CAAC,SAAS,iBAAiB,IAAI,CAAC,SAAS,gBAAgB,CACzE,GAAG,EACH,GAAG,EACH,MAAM,CAAC,CACR,GACG,CAAC,GACD,QAAQ,CAAC,CAAC,CAAC,CAAA;AAEf,KAAK,eAAe,CAAC,CAAC,SAAS,iBAAiB,IAAI,CAAC,SAAS,gBAAgB,CAC5E,GAAG,EACH,GAAG,EACH,GAAG,EACH,MAAM,CAAC,CACR,GACG,CAAC,GACD,EAAE,CAAA;AAEN,KAAK,wBAAwB,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAC/C;KACG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GACnE,GAAG,GACH,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;CACnC,GACD,SAAS,CAAA;AAEb,wBAAgB,MAAM,CACpB,eAAe,SAAS,iBAAiB,EACzC,QAAQ,SAAS,kBAAkB,CAAC,eAAe,CAAC,GAAG,IAAI,GAAG,kBAAkB,CAAC,eAAe,CAAC,GAAG,IAAI,EAExG,WAAW,EAAE,eAAe,EAE5B,OAAO,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC/B,eAAe,CAAC,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAA;IACpD,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,EACD,uBAAuB,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,gjCA2KhD"}
|