@tamagui/web 2.3.2 → 2.3.3-1782462397214

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 (79) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/cjs/createComponent.cjs +16 -6
  3. package/dist/cjs/createComponent.native.js +17 -7
  4. package/dist/cjs/createComponent.native.js.map +1 -1
  5. package/dist/cjs/helpers/getSplitStyles.cjs +5 -0
  6. package/dist/cjs/helpers/getSplitStyles.native.js +9 -0
  7. package/dist/cjs/helpers/getSplitStyles.native.js.map +1 -1
  8. package/dist/cjs/helpers/pointerEvents.native.js +26 -20
  9. package/dist/cjs/helpers/pointerEvents.native.js.map +1 -1
  10. package/dist/cjs/hooks/useMedia.cjs +107 -42
  11. package/dist/cjs/hooks/useMedia.native.js +149 -60
  12. package/dist/cjs/hooks/useMedia.native.js.map +1 -1
  13. package/dist/cjs/hooks/useTheme.cjs +17 -4
  14. package/dist/cjs/hooks/useTheme.native.js +18 -4
  15. package/dist/cjs/hooks/useTheme.native.js.map +1 -1
  16. package/dist/cjs/hooks/useThemeState.cjs +129 -63
  17. package/dist/cjs/hooks/useThemeState.native.js +142 -66
  18. package/dist/cjs/hooks/useThemeState.native.js.map +1 -1
  19. package/dist/cjs/index.cjs +2 -0
  20. package/dist/cjs/index.native.js +2 -0
  21. package/dist/cjs/index.native.js.map +1 -1
  22. package/dist/cjs/views/Theme.cjs +1 -1
  23. package/dist/cjs/views/Theme.native.js +1 -1
  24. package/dist/cjs/views/Theme.native.js.map +1 -1
  25. package/dist/esm/createComponent.mjs +16 -6
  26. package/dist/esm/createComponent.mjs.map +1 -1
  27. package/dist/esm/createComponent.native.js +19 -9
  28. package/dist/esm/createComponent.native.js.map +1 -1
  29. package/dist/esm/helpers/getSplitStyles.mjs +5 -0
  30. package/dist/esm/helpers/getSplitStyles.mjs.map +1 -1
  31. package/dist/esm/helpers/getSplitStyles.native.js +9 -0
  32. package/dist/esm/helpers/getSplitStyles.native.js.map +1 -1
  33. package/dist/esm/helpers/pointerEvents.native.js +26 -20
  34. package/dist/esm/helpers/pointerEvents.native.js.map +1 -1
  35. package/dist/esm/hooks/useMedia.mjs +108 -43
  36. package/dist/esm/hooks/useMedia.mjs.map +1 -1
  37. package/dist/esm/hooks/useMedia.native.js +150 -61
  38. package/dist/esm/hooks/useMedia.native.js.map +1 -1
  39. package/dist/esm/hooks/useTheme.mjs +17 -4
  40. package/dist/esm/hooks/useTheme.mjs.map +1 -1
  41. package/dist/esm/hooks/useTheme.native.js +18 -4
  42. package/dist/esm/hooks/useTheme.native.js.map +1 -1
  43. package/dist/esm/hooks/useThemeState.mjs +130 -64
  44. package/dist/esm/hooks/useThemeState.mjs.map +1 -1
  45. package/dist/esm/hooks/useThemeState.native.js +143 -67
  46. package/dist/esm/hooks/useThemeState.native.js.map +1 -1
  47. package/dist/esm/index.js +3 -3
  48. package/dist/esm/index.js.map +1 -1
  49. package/dist/esm/index.mjs +3 -3
  50. package/dist/esm/index.mjs.map +1 -1
  51. package/dist/esm/index.native.js +3 -3
  52. package/dist/esm/index.native.js.map +1 -1
  53. package/dist/esm/views/Theme.mjs +1 -1
  54. package/dist/esm/views/Theme.mjs.map +1 -1
  55. package/dist/esm/views/Theme.native.js +1 -1
  56. package/dist/esm/views/Theme.native.js.map +1 -1
  57. package/package.json +13 -13
  58. package/src/createComponent.tsx +48 -5
  59. package/src/helpers/getSplitStyles.tsx +33 -0
  60. package/src/helpers/pointerEvents.native.ts +26 -19
  61. package/src/hooks/useMedia.tsx +147 -42
  62. package/src/hooks/useTheme.tsx +27 -5
  63. package/src/hooks/useThemeState.ts +255 -127
  64. package/src/index.ts +7 -1
  65. package/src/types.tsx +49 -5
  66. package/src/views/Theme.tsx +4 -1
  67. package/types/createComponent.d.ts.map +1 -1
  68. package/types/helpers/getSplitStyles.d.ts.map +1 -1
  69. package/types/helpers/pointerEvents.native.d.ts.map +1 -1
  70. package/types/hooks/useMedia.d.ts.map +1 -1
  71. package/types/hooks/useTheme.d.ts +1 -1
  72. package/types/hooks/useTheme.d.ts.map +1 -1
  73. package/types/hooks/useThemeState.d.ts +1 -1
  74. package/types/hooks/useThemeState.d.ts.map +1 -1
  75. package/types/index.d.ts +2 -2
  76. package/types/index.d.ts.map +1 -1
  77. package/types/types.d.ts +2 -1
  78. package/types/types.d.ts.map +1 -1
  79. package/types/views/Theme.d.ts.map +1 -1
@@ -1,10 +1,10 @@
1
1
  import { supportsDynamicColorIOS, useIsomorphicLayoutEffect } from '@tamagui/constants'
2
2
  import {
3
3
  createContext,
4
- useCallback,
5
4
  useContext,
6
- useId,
7
- useSyncExternalStore,
5
+ useEffect,
6
+ useReducer,
7
+ useRef,
8
8
  type MutableRefObject,
9
9
  } from 'react'
10
10
  import { getConfig, getSetting } from '../config'
@@ -54,11 +54,27 @@ export const getRootThemeState = () => rootThemeState
54
54
  // extracts base name without scheme: "light_red_surface1" -> "red_surface1"
55
55
  const getThemeBaseName = (name: string) => name.replace(/^(light|dark)_/, '')
56
56
 
57
+ // Internal-only ids for the listenersByParent map. Never rendered into HTML,
58
+ // so a process-wide counter is safe (no hydration mismatch from useId).
59
+ let themeStateIdCounter = 0
60
+ const nextThemeStateId = (): string => `t${++themeStateIdCounter}`
61
+
62
+ // useReducer-based force-update; cheaper than useSyncExternalStore's internal
63
+ // useState+useLayoutEffect+useEffect+useDebugValue chain on Hermes.
64
+ const incReducer = (c: number): number => c + 1
65
+
57
66
  export const useThemeState = (
58
67
  props: UseThemeWithStateProps,
59
68
  isRoot = false,
60
69
  keys: MutableRefObject<Set<string> | null>,
61
- schemeKeys?: MutableRefObject<Set<string> | null>
70
+ schemeKeys?: MutableRefObject<Set<string> | null>,
71
+ // when true, install the propsKey-watching useIsomorphicLayoutEffect that
72
+ // schedules descendant updates via listenersByParent[id]. Only <Theme>
73
+ // providers actually push their themeState.id into ThemeStateContext, so
74
+ // only they can have descendants subscribed under their id. Leaf styled
75
+ // components pass false (the default) and save one hook slot per mount.
76
+ // Stable per call-site (rule of hooks satisfied).
77
+ cascadeOnChange = false
62
78
  ): ThemeState => {
63
79
  'use no memo'
64
80
 
@@ -86,148 +102,260 @@ Looked for theme${props.name ? ` "${props.name}"` : ''}${props.componentName ? `
86
102
  )
87
103
  }
88
104
 
89
- const id = useId()
90
- const subscribe = useCallback(
91
- (cb: Function) => {
92
- listenersByParent[parentId] = listenersByParent[parentId] || new Set()
93
- listenersByParent[parentId].add(id)
94
- allListeners.set(id, () => {
95
- PendingUpdate.set(id, shouldForce ? 'force' : true)
96
- cb()
97
- })
98
- return () => {
99
- allListeners.delete(id)
100
- listenersByParent[parentId].delete(id)
101
- localStates.delete(id)
102
- states.delete(id)
103
- PendingUpdate.delete(id)
104
- }
105
- },
106
- [id, parentId]
107
- )
108
-
105
+ // counter-based id, allocated once per component instance (on the ref below).
106
+ // useId is genuinely heavy on Hermes — it queries the fiber-tree position to
107
+ // generate a hydration-stable id. These ids are only used internally as keys
108
+ // in the listenersByParent map; they're never rendered to HTML, so a process-
109
+ // wide counter is safe (no hydration mismatch). Saves a real-millisecond
110
+ // hook call per styled component on native.
109
111
  const propsKey = getPropsKey(props)
110
112
 
111
- const getSnapshot = () => {
112
- let local = localStates.get(id)
113
- const parentState = states.get(parentId)
114
-
115
- // fast path: nothing changed since last snapshot
116
- if (local && !PendingUpdate.has(id)) {
117
- if (
118
- parentState &&
119
- (local as any)._parentName === parentState.name &&
120
- (local as any)._propsKey === propsKey
121
- ) {
122
- return local
123
- }
124
- }
125
-
126
- // check if this is a scheme-only change (light↔dark) where DynamicColorIOS handles it
127
- const isSchemeOnlyChange =
128
- process.env.TAMAGUI_TARGET === 'native' &&
129
- supportsDynamicColorIOS &&
130
- getSetting('fastSchemeChange') &&
131
- local &&
132
- parentState &&
133
- local.scheme !== parentState.scheme &&
134
- getThemeBaseName(local.name) === getThemeBaseName(parentState.name)
135
-
136
- // all tracked keys are scheme-optimized = can skip re-render for scheme changes
137
- const keysSize = keys?.current?.size ?? 0
138
- const schemeKeysSize = schemeKeys?.current?.size ?? 0
139
- const allKeysSchemeOptimized = schemeKeysSize === keysSize && keysSize > 0
140
-
141
- const canSkipForSchemeChange = isSchemeOnlyChange && allKeysSchemeOptimized
142
-
143
- const needsUpdate = props.passThrough
144
- ? false
145
- : isRoot || props.name === 'light' || props.name === 'dark' || props.name === null
146
- ? true
147
- : !HasRenderedOnce.get(keys)
148
- ? true
149
- : canSkipForSchemeChange
150
- ? false // skip re-render for scheme-only changes with DynamicColorIOS
151
- : keys?.current?.size
152
- ? true
153
- : props.needsUpdate?.()
154
-
155
- const [rerender, next] = getNextState(
156
- local,
113
+ // stable ref-bag for render inputs and the optional subscription cleanup.
114
+ // lastSnap caches the last getSnapshot result for the subscription bailout.
115
+ const ref = useRef<ThemeStateRef>(null as any)
116
+ if (!ref.current) {
117
+ ref.current = {
118
+ id: nextThemeStateId(),
119
+ parentId,
157
120
  props,
158
121
  propsKey,
159
122
  isRoot,
160
- id,
161
- parentId,
162
- needsUpdate,
163
- PendingUpdate.get(id)
164
- )
123
+ keys,
124
+ schemeKeys,
125
+ renderVersion: 0,
126
+ }
127
+ } else {
128
+ // refresh latest values for the stable closures to read
129
+ ref.current.props = props
130
+ ref.current.propsKey = propsKey
131
+ ref.current.isRoot = isRoot
132
+ ref.current.keys = keys
133
+ ref.current.schemeKeys = schemeKeys
134
+ ref.current.parentId = parentId
135
+ }
136
+ ref.current.renderVersion++
165
137
 
166
- PendingUpdate.delete(id)
138
+ if (process.env.NODE_ENV === 'development' && globalThis.time)
139
+ globalThis.time`theme-prep-uses`
167
140
 
168
- // we always create a new localState for every component
169
- // that way we can use it to de-opt and avoid renders granularly
170
- // we always return the localState object in each component
171
- // the global state (states) should always be up to date with the latest
172
- if (!local || rerender) {
173
- local = { ...next }
174
- localStates.set(id, local)
141
+ // manual subscription replaces useSyncExternalStore: same granular bailout
142
+ // (getSnapshot returning the same ref React doesn't re-render), fewer
143
+ // React-internal hook slots on Hermes. We don't need tearing prevention
144
+ // here: theme/media updates are event-driven, not transition-driven, and
145
+ // useReducer in normal mode already gives same-tick batching.
146
+ const [, forceUpdate] = useReducer(incReducer, 0)
147
+ const state = getSnapshotImpl(ref.current)
148
+ ref.current.lastSnap = state
149
+
150
+ useEffect(() => {
151
+ const r = ref.current
152
+ const renderVersion = r.renderVersion
153
+
154
+ if (r.unsubscribe && r.subscribedParentId !== r.parentId) {
155
+ cleanupThemeSubscription(r)
175
156
  }
176
157
 
177
- if (process.env.NODE_ENV === 'development' && props.debug === 'verbose') {
178
- console.groupCollapsed(` ${id} getSnapshot ${rerender}`, local.name, '>', next.name)
179
- console.info({
180
- props,
181
- propsKey,
182
- isRoot,
183
- parentId,
184
- local,
185
- next,
186
- needsUpdate,
187
- isSchemeOnlyChange,
188
- allKeysSchemeOptimized,
189
- canSkipForSchemeChange,
190
- })
191
- console.groupEnd()
158
+ if (shouldSubscribeToTheme(r, cascadeOnChange)) {
159
+ if (!r.unsubscribe) {
160
+ const pid = r.parentId
161
+ const sid = r.id
162
+ const cb = () => {
163
+ const next = getSnapshotImpl(r)
164
+ if (next !== r.lastSnap) {
165
+ r.lastSnap = next
166
+ forceUpdate()
167
+ }
168
+ }
169
+
170
+ listenersByParent[pid] = listenersByParent[pid] || new Set()
171
+ listenersByParent[pid].add(sid)
172
+ allListeners.set(sid, () => {
173
+ PendingUpdate.set(sid, shouldForce ? 'force' : true)
174
+ cb()
175
+ })
176
+ r.subscribedParentId = pid
177
+ r.unsubscribe = () => {
178
+ allListeners.delete(sid)
179
+ listenersByParent[pid]?.delete(sid)
180
+ localStates.delete(sid)
181
+ states.delete(sid)
182
+ PendingUpdate.delete(sid)
183
+ r.unsubscribe = undefined
184
+ r.subscribedParentId = undefined
185
+ }
186
+ }
187
+ } else if (r.unsubscribe) {
188
+ cleanupThemeSubscription(r)
192
189
  }
193
190
 
194
- if (next !== local) {
195
- Object.assign(local, next)
196
- local.id = id
191
+ return () => {
192
+ // react runs passive cleanup before the next effect as well as on unmount.
193
+ // a newer render bumps renderVersion before that cleanup, so equality here
194
+ // means this is the final unmount cleanup.
195
+ if (r.renderVersion === renderVersion) {
196
+ cleanupThemeState(r)
197
+ }
197
198
  }
198
- ;(local as any)._parentName = parentState?.name
199
- ;(local as any)._propsKey = propsKey
200
- states.set(id, next)
199
+ })
201
200
 
202
- return local
201
+ const id = ref.current.id
202
+ if (cascadeOnChange) {
203
+ // eslint-disable-next-line react-hooks/rules-of-hooks
204
+ useIsomorphicLayoutEffect(() => {
205
+ if (!HasRenderedOnce.get(keys)) {
206
+ HasRenderedOnce.set(keys, true)
207
+ return
208
+ }
209
+ if (!propsKey) {
210
+ if (HadTheme.get(keys)) {
211
+ // we're removing the last theme, make sure to notify
212
+ scheduleUpdate(id)
213
+ }
214
+ HadTheme.set(keys, false)
215
+ return
216
+ }
217
+ if (process.env.NODE_ENV === 'development' && props.debug === 'verbose') {
218
+ console.warn(` · useTheme(${id}) scheduleUpdate`, propsKey, states.get(id)?.name)
219
+ }
220
+ scheduleUpdate(id)
221
+ HadTheme.set(keys, true)
222
+ }, [keys, propsKey])
203
223
  }
204
224
 
205
- if (process.env.NODE_ENV === 'development' && globalThis.time)
206
- globalThis.time`theme-prep-uses`
225
+ return state
226
+ }
207
227
 
208
- const state = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)
228
+ type SnapshotRef = {
229
+ id: string
230
+ parentId: string
231
+ props: UseThemeWithStateProps
232
+ propsKey: string
233
+ isRoot: boolean
234
+ keys: MutableRefObject<Set<string> | null>
235
+ schemeKeys?: MutableRefObject<Set<string> | null>
236
+ }
209
237
 
210
- useIsomorphicLayoutEffect(() => {
211
- if (!HasRenderedOnce.get(keys)) {
212
- HasRenderedOnce.set(keys, true)
213
- return
214
- }
215
- if (!propsKey) {
216
- if (HadTheme.get(keys)) {
217
- // we're removing the last theme, make sure to notify
218
- scheduleUpdate(id)
219
- }
220
- HadTheme.set(keys, false)
221
- return
222
- }
223
- if (process.env.NODE_ENV === 'development' && props.debug === 'verbose') {
224
- console.warn(` · useTheme(${id}) scheduleUpdate`, propsKey, states.get(id)?.name)
238
+ type ThemeStateRef = SnapshotRef & {
239
+ renderVersion: number
240
+ unsubscribe?: () => void
241
+ subscribedParentId?: string
242
+ lastSnap?: ThemeState
243
+ }
244
+
245
+ const shouldSubscribeToTheme = (r: ThemeStateRef, cascadeOnChange: boolean): boolean =>
246
+ r.isRoot ||
247
+ cascadeOnChange ||
248
+ hasThemeUpdatingProps(r.props) ||
249
+ !!r.keys.current?.size ||
250
+ !!r.props.needsUpdate?.()
251
+
252
+ function cleanupThemeSubscription(r: ThemeStateRef) {
253
+ r.unsubscribe?.()
254
+ }
255
+
256
+ function cleanupThemeState(r: ThemeStateRef) {
257
+ if (r.unsubscribe) {
258
+ cleanupThemeSubscription(r)
259
+ } else {
260
+ localStates.delete(r.id)
261
+ states.delete(r.id)
262
+ PendingUpdate.delete(r.id)
263
+ }
264
+ }
265
+
266
+ const getSnapshotImpl = (r: SnapshotRef): ThemeState => {
267
+ const { id, parentId, props, propsKey, isRoot, keys, schemeKeys } = r
268
+ let local = localStates.get(id)
269
+ const parentState = states.get(parentId)
270
+
271
+ // fast path: nothing changed since last snapshot
272
+ if (local && !PendingUpdate.has(id)) {
273
+ if (
274
+ parentState &&
275
+ (local as any)._parentName === parentState.name &&
276
+ (local as any)._propsKey === propsKey
277
+ ) {
278
+ return local
225
279
  }
226
- scheduleUpdate(id)
227
- HadTheme.set(keys, true)
228
- }, [keys, propsKey])
280
+ }
229
281
 
230
- return state
282
+ // check if this is a scheme-only change (light↔dark) where DynamicColorIOS handles it
283
+ const isSchemeOnlyChange =
284
+ process.env.TAMAGUI_TARGET === 'native' &&
285
+ supportsDynamicColorIOS &&
286
+ getSetting('fastSchemeChange') &&
287
+ local &&
288
+ parentState &&
289
+ local.scheme !== parentState.scheme &&
290
+ getThemeBaseName(local.name) === getThemeBaseName(parentState.name)
291
+
292
+ // all tracked keys are scheme-optimized = can skip re-render for scheme changes
293
+ const keysSize = keys?.current?.size ?? 0
294
+ const schemeKeysSize = schemeKeys?.current?.size ?? 0
295
+ const allKeysSchemeOptimized = schemeKeysSize === keysSize && keysSize > 0
296
+
297
+ const canSkipForSchemeChange = isSchemeOnlyChange && allKeysSchemeOptimized
298
+
299
+ const needsUpdate = props.passThrough
300
+ ? false
301
+ : isRoot || props.name === 'light' || props.name === 'dark' || props.name === null
302
+ ? true
303
+ : !HasRenderedOnce.get(keys)
304
+ ? true
305
+ : canSkipForSchemeChange
306
+ ? false // skip re-render for scheme-only changes with DynamicColorIOS
307
+ : keys?.current?.size
308
+ ? true
309
+ : props.needsUpdate?.()
310
+
311
+ const [rerender, next] = getNextState(
312
+ local,
313
+ props,
314
+ propsKey,
315
+ isRoot,
316
+ id,
317
+ parentId,
318
+ needsUpdate,
319
+ PendingUpdate.get(id)
320
+ )
321
+
322
+ PendingUpdate.delete(id)
323
+
324
+ // we always create a new localState for every component
325
+ // that way we can use it to de-opt and avoid renders granularly
326
+ // we always return the localState object in each component
327
+ // the global state (states) should always be up to date with the latest
328
+ if (!local || rerender) {
329
+ local = { ...next }
330
+ localStates.set(id, local)
331
+ }
332
+
333
+ if (process.env.NODE_ENV === 'development' && props.debug === 'verbose') {
334
+ console.groupCollapsed(` ${id} getSnapshot ${rerender}`, local.name, '>', next.name)
335
+ console.info({
336
+ props,
337
+ propsKey,
338
+ isRoot,
339
+ parentId,
340
+ local,
341
+ next,
342
+ needsUpdate,
343
+ isSchemeOnlyChange,
344
+ allKeysSchemeOptimized,
345
+ canSkipForSchemeChange,
346
+ })
347
+ console.groupEnd()
348
+ }
349
+
350
+ if (next !== local) {
351
+ Object.assign(local, next)
352
+ local.id = id
353
+ }
354
+ ;(local as any)._parentName = parentState?.name
355
+ ;(local as any)._propsKey = propsKey
356
+ states.set(id, next)
357
+
358
+ return local
231
359
  }
232
360
 
233
361
  const getNextState = (
package/src/index.ts CHANGED
@@ -77,10 +77,16 @@ export {
77
77
  _disableMediaTouch,
78
78
  configureMedia,
79
79
  mediaKeyMatch,
80
+ updateMediaListeners,
80
81
  useMedia,
81
82
  } from './hooks/useMedia'
82
83
  export { mediaObjectToString } from './helpers/mediaObjectToString'
83
- export { getMedia, mediaQueryConfig, mediaState } from './helpers/mediaState'
84
+ export {
85
+ getMedia,
86
+ mediaQueryConfig,
87
+ mediaState,
88
+ setMediaState,
89
+ } from './helpers/mediaState'
84
90
  export * from './hooks/useProps'
85
91
  export * from './hooks/useTheme'
86
92
  export * from './hooks/useThemeName'
package/src/types.tsx CHANGED
@@ -1884,12 +1884,56 @@ export type GetThemeValueForKey<K extends string | symbol | number> =
1884
1884
  : never
1885
1885
  : never)
1886
1886
 
1887
+ // keys that accept the first-class "safe" value (-> env(safe-area-inset-*) on
1888
+ // web, numeric insets on native). must mirror propEdges in resolveSafeArea.ts.
1889
+ // only the longhands are listed; shorthands (pt, mt, ...) inherit via WithShorthands.
1890
+ export type SafeAreaValueKeys =
1891
+ | 'padding'
1892
+ | 'paddingTop'
1893
+ | 'paddingBottom'
1894
+ | 'paddingLeft'
1895
+ | 'paddingRight'
1896
+ | 'paddingHorizontal'
1897
+ | 'paddingVertical'
1898
+ | 'paddingStart'
1899
+ | 'paddingEnd'
1900
+ | 'paddingBlock'
1901
+ | 'paddingInline'
1902
+ | 'paddingBlockStart'
1903
+ | 'paddingBlockEnd'
1904
+ | 'paddingInlineStart'
1905
+ | 'paddingInlineEnd'
1906
+ | 'margin'
1907
+ | 'marginTop'
1908
+ | 'marginBottom'
1909
+ | 'marginLeft'
1910
+ | 'marginRight'
1911
+ | 'marginHorizontal'
1912
+ | 'marginVertical'
1913
+ | 'marginStart'
1914
+ | 'marginEnd'
1915
+ | 'marginBlock'
1916
+ | 'marginInline'
1917
+ | 'marginBlockStart'
1918
+ | 'marginBlockEnd'
1919
+ | 'marginInlineStart'
1920
+ | 'marginInlineEnd'
1921
+ | 'inset'
1922
+ | 'top'
1923
+ | 'bottom'
1924
+ | 'left'
1925
+ | 'right'
1926
+ | 'start'
1927
+ | 'end'
1928
+
1887
1929
  export type WithThemeValues<T extends object> = {
1888
- [K in keyof T]: ThemeValueGet<K> extends never
1889
- ? K extends keyof ExtraBaseProps
1890
- ? T[K]
1891
- : T[K] | 'unset'
1892
- : GetThemeValueForKey<K> | Exclude<T[K], string> | 'unset'
1930
+ [K in keyof T]:
1931
+ | (ThemeValueGet<K> extends never
1932
+ ? K extends keyof ExtraBaseProps
1933
+ ? T[K]
1934
+ : T[K] | 'unset'
1935
+ : GetThemeValueForKey<K> | Exclude<T[K], string> | 'unset')
1936
+ | (K extends SafeAreaValueKeys ? 'safe' : never)
1893
1937
  }
1894
1938
 
1895
1939
  export type NarrowShorthands = Narrow<Shorthands>
@@ -26,7 +26,10 @@ export const Theme = forwardRef(function Theme(props: ThemeComponentPropsOnly, r
26
26
 
27
27
  const isRoot = !!props['_isRoot']
28
28
 
29
- const [_, themeState] = useThemeWithState(props, isRoot)
29
+ // pass forThemeView=true so the descendant-cascade effect is installed —
30
+ // <Theme> pushes themeState.id into ThemeStateContext, so children subscribe
31
+ // under this id and need to be notified when our propsKey changes.
32
+ const [_, themeState] = useThemeWithState(props, isRoot, true)
30
33
 
31
34
  const disableDirectChildTheme = props['disable-child-theme']
32
35
 
@@ -1 +1 @@
1
- {"version":3,"file":"createComponent.d.ts","sourceRoot":"","sources":["../src/createComponent.tsx"],"names":[],"mappings":"AAYA,OAAO,KAA2C,MAAM,OAAO,CAAA;AA6B/D,OAAO,KAAK,EAQV,YAAY,EAEZ,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EAOf,MAAM,SAAS,CAAA;AAahB,KAAK,iBAAiB,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,CAAA;AAEpF,eAAO,MAAM,kBAAkB,wBAA+B,CAAA;AA8J9D,wBAAgB,eAAe,CAC7B,kBAAkB,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,EACnD,GAAG,SAAS,cAAc,GAAG,cAAc,EAC3C,SAAS,GAAG,KAAK,EACjB,UAAU,SAAS,MAAM,GAAG,KAAK,EACjC,YAAY,EAAE,YAAY,wEA+lD3B"}
1
+ {"version":3,"file":"createComponent.d.ts","sourceRoot":"","sources":["../src/createComponent.tsx"],"names":[],"mappings":"AAaA,OAAO,KAA2C,MAAM,OAAO,CAAA;AA6B/D,OAAO,KAAK,EAQV,YAAY,EAEZ,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EAOf,MAAM,SAAS,CAAA;AAahB,KAAK,iBAAiB,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,CAAA;AAEpF,eAAO,MAAM,kBAAkB,wBAA+B,CAAA;AAwK9D,wBAAgB,eAAe,CAC7B,kBAAkB,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,EACnD,GAAG,SAAS,cAAc,GAAG,cAAc,EAC3C,SAAS,GAAG,KAAK,EACjB,UAAU,SAAS,MAAM,GAAG,KAAK,EACjC,YAAY,EAAE,YAAY,wEA+nD3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"getSplitStyles.d.ts","sourceRoot":"","sources":["../../src/helpers/getSplitStyles.tsx"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEf,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,aAAa,EAIb,eAAe,EACf,YAAY,EAEZ,qBAAqB,EAErB,SAAS,EACT,WAAW,EAEZ,MAAM,UAAU,CAAA;AA0BjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAG3D,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAE9B,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAIhE,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,EAC3B,YAAY,CAAC,EAAE,gBAAgB,GAAG,IAAI,EAEtC,WAAW,CAAC,EAAE,MAAM,EACpB,iBAAiB,CAAC,EAAE,OAAO,EAC3B,KAAK,CAAC,EAAE,SAAS,EAEjB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,KACrC,IAAI,GAAG,cAAc,CAAA;AAE1B,eAAO,MAAM,UAAU,MAAM,CAAA;AAoD7B,eAAO,MAAM,cAAc,EAAE,aAo0C5B,CAAA;AA+DD,eAAO,MAAM,WAAW,GACtB,YAAY,aAAa,EACzB,QAAQ,MAAM,EACd,SAAS,MAAM,EACf,sBAAsB,OAAO,KAC5B,SA6HF,CAAA;AAQD,eAAO,MAAM,cAAc,EAAE,aAc5B,CAAA"}
1
+ {"version":3,"file":"getSplitStyles.d.ts","sourceRoot":"","sources":["../../src/helpers/getSplitStyles.tsx"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEf,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,aAAa,EAIb,eAAe,EACf,YAAY,EAEZ,qBAAqB,EAErB,SAAS,EACT,WAAW,EAEZ,MAAM,UAAU,CAAA;AA0BjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAG3D,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAE9B,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAE3D,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAIhE,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,EAC3B,YAAY,CAAC,EAAE,gBAAgB,GAAG,IAAI,EAEtC,WAAW,CAAC,EAAE,MAAM,EACpB,iBAAiB,CAAC,EAAE,OAAO,EAC3B,KAAK,CAAC,EAAE,SAAS,EAEjB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,KACrC,IAAI,GAAG,cAAc,CAAA;AAE1B,eAAO,MAAM,UAAU,MAAM,CAAA;AA6D7B,eAAO,MAAM,cAAc,EAAE,aA41C5B,CAAA;AA+DD,eAAO,MAAM,WAAW,GACtB,YAAY,aAAa,EACzB,QAAQ,MAAM,EACd,SAAS,MAAM,EACf,sBAAsB,OAAO,KAC5B,SA6HF,CAAA;AAQD,eAAO,MAAM,cAAc,EAAE,aAc5B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"pointerEvents.native.d.ts","sourceRoot":"","sources":["../../src/helpers/pointerEvents.native.ts"],"names":[],"mappings":"AASA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,QAqI1D"}
1
+ {"version":3,"file":"pointerEvents.native.d.ts","sourceRoot":"","sources":["../../src/helpers/pointerEvents.native.ts"],"names":[],"mappings":"AASA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,QA4I1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMedia.d.ts","sourceRoot":"","sources":["../../src/hooks/useMedia.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,iBAAiB,EACjB,SAAS,EACT,aAAa,EACb,WAAW,EAEX,qBAAqB,EACrB,aAAa,EACb,WAAW,EACZ,MAAM,UAAU,CAAA;AAKjB,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,OAKxC,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,KAAG,WAMzC,CAAA;AAOD,eAAO,MAAM,qBAAqB,GAAI,KAAK,MAAM,WAShD,CAAA;AAMD,eAAO,MAAM,cAAc,GAAI,QAAQ,qBAAqB,SAe3D,CAAA;AAaD,wBAAgB,mBAAmB,SAkClC;AAID,wBAAgB,oBAAoB,SAEnC;AAED,KAAK,UAAU,GAAG;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;CAC1B,CAAA;AAID,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE,OAAO,EACjB,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,QAW1B;AASD,wBAAgB,QAAQ,CACtB,gBAAgB,CAAC,EAAE,iBAAiB,EACpC,KAAK,CAAC,EAAE,SAAS,GAChB,aAAa,CAyEf;AAKD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,QAE9C;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,2BAa1E;AAED,eAAO,MAAM,iCAAiC,GAC5C,UAAU,MAAM,EAChB,KAAK,MAAM,EACX,YAAY,aAAa,EACzB,aAAa,OAAO,kBAOrB,CAAA;AAID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,UAK1C;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,WAY9C"}
1
+ {"version":3,"file":"useMedia.d.ts","sourceRoot":"","sources":["../../src/hooks/useMedia.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,iBAAiB,EACjB,SAAS,EACT,aAAa,EACb,WAAW,EAEX,qBAAqB,EACrB,aAAa,EACb,WAAW,EACZ,MAAM,UAAU,CAAA;AAKjB,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,OAKxC,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,KAAG,WAMzC,CAAA;AAOD,eAAO,MAAM,qBAAqB,GAAI,KAAK,MAAM,WAShD,CAAA;AAMD,eAAO,MAAM,cAAc,GAAI,QAAQ,qBAAqB,SAiB3D,CAAA;AAaD,wBAAgB,mBAAmB,SAkClC;AAID,wBAAgB,oBAAoB,SAEnC;AAED,KAAK,UAAU,GAAG;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;CAC1B,CAAA;AA6CD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE,OAAO,EACjB,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,QAW1B;AASD,wBAAgB,QAAQ,CACtB,gBAAgB,CAAC,EAAE,iBAAiB,EACpC,KAAK,CAAC,EAAE,SAAS,GAChB,aAAa,CAqIf;AAOD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,QAE9C;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,2BAa1E;AAED,eAAO,MAAM,iCAAiC,GAC5C,UAAU,MAAM,EAChB,KAAK,MAAM,EACX,YAAY,aAAa,EACzB,aAAa,OAAO,kBAOrB,CAAA;AAID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,UAK1C;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,WAY9C"}
@@ -5,5 +5,5 @@ export type ThemeWithState = [ThemeParsed, ThemeState];
5
5
  /**
6
6
  * Adds a proxy around themeState that tracks update keys
7
7
  */
8
- export declare const useThemeWithState: (props: UseThemeWithStateProps, isRoot?: boolean) => ThemeWithState;
8
+ export declare const useThemeWithState: (props: UseThemeWithStateProps, isRoot?: boolean, forThemeView?: boolean) => ThemeWithState;
9
9
  //# sourceMappingURL=useTheme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTheme.d.ts","sourceRoot":"","sources":["../../src/hooks/useTheme.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAC/E,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKtE,eAAO,MAAM,QAAQ,QAKL,YACf,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;AAEtD;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC5B,OAAO,sBAAsB,EAC7B,gBAAc,KACb,cAwBF,CAAA"}
1
+ {"version":3,"file":"useTheme.d.ts","sourceRoot":"","sources":["../../src/hooks/useTheme.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAC/E,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAUtE,eAAO,MAAM,QAAQ,QAKL,YACf,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;AAEtD;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC5B,OAAO,sBAAsB,EAC7B,gBAAc,EAQd,sBAAoB,KACnB,cAiCF,CAAA"}
@@ -5,7 +5,7 @@ export declare const ThemeStateContext: import("react").Context<string>;
5
5
  export declare const forceUpdateThemes: () => void;
6
6
  export declare const getThemeState: (id: ID) => ThemeState | undefined;
7
7
  export declare const getRootThemeState: () => ThemeState | null;
8
- export declare const useThemeState: (props: UseThemeWithStateProps, isRoot: boolean | undefined, keys: MutableRefObject<Set<string> | null>, schemeKeys?: MutableRefObject<Set<string> | null>) => ThemeState;
8
+ export declare const useThemeState: (props: UseThemeWithStateProps, isRoot: boolean | undefined, keys: MutableRefObject<Set<string> | null>, schemeKeys?: MutableRefObject<Set<string> | null>, cascadeOnChange?: boolean) => ThemeState;
9
9
  export declare const hasThemeUpdatingProps: (props: ThemeProps) => boolean;
10
10
  export {};
11
11
  //# sourceMappingURL=useThemeState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useThemeState.d.ts","sourceRoot":"","sources":["../../src/hooks/useThemeState.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,OAAO,CAAA;AAGd,OAAO,KAAK,EAEV,UAAU,EACV,UAAU,EACV,sBAAsB,EACvB,MAAM,UAAU,CAAA;AAEjB,KAAK,EAAE,GAAG,MAAM,CAAA;AAEhB,eAAO,MAAM,iBAAiB,iCAAwB,CAAA;AAatD,eAAO,MAAM,iBAAiB,YAK7B,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,IAAI,EAAE,2BAAmB,CAAA;AAWvD,eAAO,MAAM,iBAAiB,yBAAuB,CAAA;AAKrD,eAAO,MAAM,aAAa,GACxB,OAAO,sBAAsB,EAC7B,2BAAc,EACd,MAAM,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,EAC1C,aAAa,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAChD,UAyKF,CAAA;AAsUD,eAAO,MAAM,qBAAqB,GAAI,OAAO,UAAU,YACW,CAAA"}
1
+ {"version":3,"file":"useThemeState.d.ts","sourceRoot":"","sources":["../../src/hooks/useThemeState.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,OAAO,CAAA;AAGd,OAAO,KAAK,EAEV,UAAU,EACV,UAAU,EACV,sBAAsB,EACvB,MAAM,UAAU,CAAA;AAEjB,KAAK,EAAE,GAAG,MAAM,CAAA;AAEhB,eAAO,MAAM,iBAAiB,iCAAwB,CAAA;AAatD,eAAO,MAAM,iBAAiB,YAK7B,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,IAAI,EAAE,2BAAmB,CAAA;AAWvD,eAAO,MAAM,iBAAiB,yBAAuB,CAAA;AAcrD,eAAO,MAAM,aAAa,GACxB,OAAO,sBAAsB,EAC7B,2BAAc,EACd,MAAM,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,EAC1C,aAAa,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,EAOjD,yBAAuB,KACtB,UAoJF,CAAA;AA2cD,eAAO,MAAM,qBAAqB,GAAI,OAAO,UAAU,YACW,CAAA"}
package/types/index.d.ts CHANGED
@@ -52,9 +52,9 @@ export { getConfig, getSetting, getStyleCompat, getThemes, getToken, getTokens,
52
52
  export { setNonce } from './helpers/insertStyleRule';
53
53
  export * from './constants/constants';
54
54
  export * from './hooks/useIsTouchDevice';
55
- export { _disableMediaTouch, configureMedia, mediaKeyMatch, useMedia, } from './hooks/useMedia';
55
+ export { _disableMediaTouch, configureMedia, mediaKeyMatch, updateMediaListeners, useMedia, } from './hooks/useMedia';
56
56
  export { mediaObjectToString } from './helpers/mediaObjectToString';
57
- export { getMedia, mediaQueryConfig, mediaState } from './helpers/mediaState';
57
+ export { getMedia, mediaQueryConfig, mediaState, setMediaState, } from './helpers/mediaState';
58
58
  export * from './hooks/useProps';
59
59
  export * from './hooks/useTheme';
60
60
  export * from './hooks/useThemeName';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/types/types.d.ts CHANGED
@@ -1035,8 +1035,9 @@ export type ThemeValueGet<K extends string | number | symbol> = K extends 'theme
1035
1035
  export type GetThemeValueForKey<K extends string | symbol | number> = ThemeValueGet<K> | ThemeValueFallback | (TamaguiSettings extends {
1036
1036
  autocompleteSpecificTokens: infer Val;
1037
1037
  } ? Val extends true | undefined ? SpecificTokens : never : never);
1038
+ export type SafeAreaValueKeys = 'padding' | 'paddingTop' | 'paddingBottom' | 'paddingLeft' | 'paddingRight' | 'paddingHorizontal' | 'paddingVertical' | 'paddingStart' | 'paddingEnd' | 'paddingBlock' | 'paddingInline' | 'paddingBlockStart' | 'paddingBlockEnd' | 'paddingInlineStart' | 'paddingInlineEnd' | 'margin' | 'marginTop' | 'marginBottom' | 'marginLeft' | 'marginRight' | 'marginHorizontal' | 'marginVertical' | 'marginStart' | 'marginEnd' | 'marginBlock' | 'marginInline' | 'marginBlockStart' | 'marginBlockEnd' | 'marginInlineStart' | 'marginInlineEnd' | 'inset' | 'top' | 'bottom' | 'left' | 'right' | 'start' | 'end';
1038
1039
  export type WithThemeValues<T extends object> = {
1039
- [K in keyof T]: ThemeValueGet<K> extends never ? K extends keyof ExtraBaseProps ? T[K] : T[K] | 'unset' : GetThemeValueForKey<K> | Exclude<T[K], string> | 'unset';
1040
+ [K in keyof T]: (ThemeValueGet<K> extends never ? K extends keyof ExtraBaseProps ? T[K] : T[K] | 'unset' : GetThemeValueForKey<K> | Exclude<T[K], string> | 'unset') | (K extends SafeAreaValueKeys ? 'safe' : never);
1040
1041
  };
1041
1042
  export type NarrowShorthands = Narrow<Shorthands>;
1042
1043
  export type Longhands = NarrowShorthands[keyof NarrowShorthands];