@tamagui/web 1.68.5 → 1.69.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.
Files changed (65) hide show
  1. package/dist/cjs/createComponent.js +44 -25
  2. package/dist/cjs/createComponent.js.map +1 -1
  3. package/dist/cjs/createComponent.native.js +12 -17
  4. package/dist/cjs/createComponent.native.js.map +1 -1
  5. package/dist/cjs/helpers/createStyledContext.js +15 -5
  6. package/dist/cjs/helpers/createStyledContext.js.map +2 -2
  7. package/dist/cjs/helpers/createStyledContext.native.js +15 -5
  8. package/dist/cjs/helpers/createStyledContext.native.js.map +2 -2
  9. package/dist/cjs/helpers/getSplitStyles.js +35 -28
  10. package/dist/cjs/helpers/getSplitStyles.js.map +1 -1
  11. package/dist/cjs/helpers/getSplitStyles.native.js +18 -11
  12. package/dist/cjs/helpers/getSplitStyles.native.js.map +1 -1
  13. package/dist/cjs/helpers/propMapper.js +11 -9
  14. package/dist/cjs/helpers/propMapper.js.map +1 -1
  15. package/dist/cjs/helpers/propMapper.native.js +11 -9
  16. package/dist/cjs/helpers/propMapper.native.js.map +1 -1
  17. package/dist/cjs/hooks/useMedia.js +3 -37
  18. package/dist/cjs/hooks/useMedia.js.map +1 -1
  19. package/dist/cjs/hooks/useMedia.native.js +3 -37
  20. package/dist/cjs/hooks/useMedia.native.js.map +1 -1
  21. package/dist/cjs/hooks/useProps.js +40 -6
  22. package/dist/cjs/hooks/useProps.js.map +1 -1
  23. package/dist/cjs/hooks/useProps.native.js +40 -6
  24. package/dist/cjs/hooks/useProps.native.js.map +1 -1
  25. package/dist/cjs/index.js +1 -5
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/cjs/index.native.js +1 -5
  28. package/dist/cjs/index.native.js.map +1 -1
  29. package/dist/esm/createComponent.js +44 -25
  30. package/dist/esm/createComponent.js.map +1 -1
  31. package/dist/esm/helpers/createStyledContext.js +16 -6
  32. package/dist/esm/helpers/createStyledContext.js.map +2 -2
  33. package/dist/esm/helpers/getSplitStyles.js +35 -28
  34. package/dist/esm/helpers/getSplitStyles.js.map +1 -1
  35. package/dist/esm/helpers/propMapper.js +11 -9
  36. package/dist/esm/helpers/propMapper.js.map +1 -1
  37. package/dist/esm/hooks/useMedia.js +2 -37
  38. package/dist/esm/hooks/useMedia.js.map +1 -1
  39. package/dist/esm/hooks/useProps.js +42 -5
  40. package/dist/esm/hooks/useProps.js.map +1 -1
  41. package/dist/esm/index.js +1 -4
  42. package/dist/esm/index.js.map +1 -1
  43. package/package.json +9 -9
  44. package/src/createComponent.tsx +64 -45
  45. package/src/helpers/createStyledContext.tsx +32 -9
  46. package/src/helpers/getSplitStyles.tsx +213 -198
  47. package/src/helpers/propMapper.ts +49 -41
  48. package/src/hooks/useMedia.tsx +1 -74
  49. package/src/hooks/useProps.tsx +81 -14
  50. package/src/index.ts +0 -2
  51. package/src/types.tsx +17 -2
  52. package/types/createComponent.d.ts.map +1 -1
  53. package/types/helpers/createStyledContext.d.ts +8 -3
  54. package/types/helpers/createStyledContext.d.ts.map +1 -1
  55. package/types/helpers/getSplitStyles.d.ts.map +1 -1
  56. package/types/helpers/propMapper.d.ts.map +1 -1
  57. package/types/hooks/useMedia.d.ts +1 -17
  58. package/types/hooks/useMedia.d.ts.map +1 -1
  59. package/types/hooks/useProps.d.ts +28 -9
  60. package/types/hooks/useProps.d.ts.map +1 -1
  61. package/types/index.d.ts +1 -2
  62. package/types/index.d.ts.map +1 -1
  63. package/types/types.d.ts +16 -2
  64. package/types/types.d.ts.map +1 -1
  65. package/src/hooks/useStyle.tsx +0 -48
package/dist/esm/index.js CHANGED
@@ -49,13 +49,11 @@ import {
49
49
  mediaState,
50
50
  useMedia,
51
51
  getMedia,
52
- useMediaPropsActive,
53
52
  mediaObjectToString,
54
53
  mediaQueryConfig
55
54
  } from "./hooks/useMedia";
56
55
  export * from "./hooks/useTheme";
57
56
  export * from "./hooks/useThemeName";
58
- export * from "./hooks/useStyle";
59
57
  export * from "./hooks/useAnimationDriver";
60
58
  export * from "./hooks/useIsTouchDevice";
61
59
  export * from "./hooks/useProps";
@@ -87,7 +85,6 @@ export {
87
85
  mediaState,
88
86
  setupDev,
89
87
  updateConfig,
90
- useMedia,
91
- useMediaPropsActive
88
+ useMedia
92
89
  };
93
90
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AAEd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,cAAc;AAEd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;",
4
+ "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AAEd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,cAAc;AAEd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/web",
3
- "version": "1.68.5",
3
+ "version": "1.69.0",
4
4
  "source": "src/index.ts",
5
5
  "main": "dist/cjs",
6
6
  "module": "dist/esm",
@@ -27,19 +27,19 @@
27
27
  "reset.css"
28
28
  ],
29
29
  "dependencies": {
30
- "@tamagui/compose-refs": "1.68.5",
31
- "@tamagui/constants": "1.68.5",
32
- "@tamagui/helpers": "1.68.5",
33
- "@tamagui/normalize-css-color": "1.68.5",
34
- "@tamagui/timer": "1.68.5",
35
- "@tamagui/use-did-finish-ssr": "1.68.5",
36
- "@tamagui/use-force-update": "1.68.5"
30
+ "@tamagui/compose-refs": "1.69.0",
31
+ "@tamagui/constants": "1.69.0",
32
+ "@tamagui/helpers": "1.69.0",
33
+ "@tamagui/normalize-css-color": "1.69.0",
34
+ "@tamagui/timer": "1.69.0",
35
+ "@tamagui/use-did-finish-ssr": "1.69.0",
36
+ "@tamagui/use-force-update": "1.69.0"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "react": "*"
40
40
  },
41
41
  "devDependencies": {
42
- "@tamagui/build": "1.68.5",
42
+ "@tamagui/build": "1.69.0",
43
43
  "@testing-library/react": "^14.0.0",
44
44
  "csstype": "^3.0.10",
45
45
  "react": "^18.2.0",
@@ -580,7 +580,7 @@ export function createComponent<
580
580
 
581
581
  setDidGetVariableValue(false)
582
582
 
583
- const resolveVariablesAs =
583
+ const resolveValues =
584
584
  // if HOC + mounted + has animation prop, resolve as value so it passes non-variable to child
585
585
  (isAnimated && !supportsCSSVars) ||
586
586
  (isHOC && state.unmounted == false && hasAnimationProp)
@@ -593,7 +593,7 @@ export function createComponent<
593
593
  const styleProps = {
594
594
  mediaState,
595
595
  noClassNames,
596
- resolveVariablesAs,
596
+ resolveValues,
597
597
  isExiting,
598
598
  isAnimated,
599
599
  keepStyleSSR,
@@ -713,15 +713,15 @@ export function createComponent<
713
713
  const {
714
714
  asChild,
715
715
  children,
716
+ themeShallow,
717
+ spaceDirection: _spaceDirection,
718
+ disabled: disabledProp,
716
719
  onPress,
717
720
  onLongPress,
718
721
  onPressIn,
719
722
  onPressOut,
720
723
  onHoverIn,
721
724
  onHoverOut,
722
- themeShallow,
723
- spaceDirection: _spaceDirection,
724
- disabled: disabledProp,
725
725
  onMouseUp,
726
726
  onMouseDown,
727
727
  onMouseEnter,
@@ -950,16 +950,9 @@ export function createComponent<
950
950
  onClick
951
951
  )
952
952
  const runtimeHoverStyle = !disabled && noClassNames && pseudos?.hoverStyle
953
+ const needsHoverState = runtimeHoverStyle || onHoverIn || onHoverOut
953
954
  const isHoverable =
954
- isWeb &&
955
- !!(
956
- groupName ||
957
- runtimeHoverStyle ||
958
- onHoverIn ||
959
- onHoverOut ||
960
- onMouseEnter ||
961
- onMouseLeave
962
- )
955
+ isWeb && !!(groupName || needsHoverState || onMouseEnter || onMouseLeave)
963
956
 
964
957
  const handlesPressEvents = !(isWeb || asChild)
965
958
 
@@ -975,7 +968,7 @@ export function createComponent<
975
968
  if (process.env.NODE_ENV === 'development' && time) time`events-setup`
976
969
 
977
970
  const events: TamaguiComponentEvents | null =
978
- shouldAttach && !isDisabled && !asChild
971
+ shouldAttach && !isDisabled && !props.asChild
979
972
  ? {
980
973
  onPressOut: attachPress
981
974
  ? (e) => {
@@ -987,9 +980,13 @@ export function createComponent<
987
980
  ...((isHoverable || attachPress) && {
988
981
  onMouseEnter: (e) => {
989
982
  const next: Partial<typeof state> = {}
990
- next.hover = true
991
- if (state.pressIn) {
992
- next.press = true
983
+ if (needsHoverState) {
984
+ next.hover = true
985
+ }
986
+ if (runtimePressStyle) {
987
+ if (state.pressIn) {
988
+ next.press = true
989
+ }
993
990
  }
994
991
  setStateShallow(next)
995
992
  onHoverIn?.(e)
@@ -998,10 +995,14 @@ export function createComponent<
998
995
  onMouseLeave: (e) => {
999
996
  const next: Partial<typeof state> = {}
1000
997
  mouseUps.add(unPress)
1001
- next.hover = false
1002
- if (state.pressIn) {
1003
- next.press = false
1004
- next.pressIn = false
998
+ if (needsHoverState) {
999
+ next.hover = false
1000
+ }
1001
+ if (runtimePressStyle) {
1002
+ if (state.pressIn) {
1003
+ next.press = false
1004
+ next.pressIn = false
1005
+ }
1005
1006
  }
1006
1007
  setStateShallow(next)
1007
1008
  onHoverOut?.(e)
@@ -1010,10 +1011,12 @@ export function createComponent<
1010
1011
  }),
1011
1012
  onPressIn: attachPress
1012
1013
  ? (e) => {
1013
- setStateShallow({
1014
- press: true,
1015
- pressIn: true,
1016
- })
1014
+ if (runtimePressStyle) {
1015
+ setStateShallow({
1016
+ press: true,
1017
+ pressIn: true,
1018
+ })
1019
+ }
1017
1020
  onPressIn?.(e)
1018
1021
  onMouseDown?.(e)
1019
1022
  if (isWeb) {
@@ -1044,7 +1047,7 @@ export function createComponent<
1044
1047
  }
1045
1048
  : null
1046
1049
 
1047
- if (process.env.TAMAGUI_TARGET === 'native' && events) {
1050
+ if (process.env.TAMAGUI_TARGET === 'native' && events && !asChild) {
1048
1051
  // replicating TouchableWithoutFeedback
1049
1052
  Object.assign(events, {
1050
1053
  cancelable: !viewProps.rejectResponderTermination,
@@ -1072,9 +1075,6 @@ export function createComponent<
1072
1075
 
1073
1076
  if (process.env.NODE_ENV === 'development' && time) time`hooks`
1074
1077
 
1075
- // since we re-render without changing children often for animations or on mount
1076
- // we memo children here. tested this on the site homepage which has hundreds of components
1077
- // and i see no difference in startup performance, but i do see it memoing often
1078
1078
  let content =
1079
1079
  !children || asChild
1080
1080
  ? children
@@ -1089,12 +1089,27 @@ export function createComponent<
1089
1089
 
1090
1090
  if (asChild) {
1091
1091
  elementType = Slot
1092
- Object.assign(viewProps, {
1093
- onPress,
1094
- onLongPress,
1095
- onPressIn,
1096
- onPressOut,
1097
- })
1092
+ // on native this is already merged into viewProps in hooks.useEvents
1093
+ if (process.env.TAMAGUI_TARGET === 'web') {
1094
+ const passEvents = {
1095
+ onPress,
1096
+ onLongPress,
1097
+ onPressIn,
1098
+ onPressOut,
1099
+ onHoverIn,
1100
+ onHoverOut,
1101
+ onMouseUp,
1102
+ onMouseDown,
1103
+ onMouseEnter,
1104
+ onMouseLeave,
1105
+ }
1106
+ Object.assign(
1107
+ viewProps,
1108
+ asChild === 'web' || asChild === 'except-style-web'
1109
+ ? getWebEvents(passEvents as any)
1110
+ : passEvents
1111
+ )
1112
+ }
1098
1113
  }
1099
1114
 
1100
1115
  if (process.env.NODE_ENV === 'development' && time) time`spaced-as-child`
@@ -1168,15 +1183,7 @@ export function createComponent<
1168
1183
  content = (
1169
1184
  <span
1170
1185
  className={`${isAnimatedReactNativeWeb ? className : ''} _dsp_contents`}
1171
- {...(events && {
1172
- onMouseEnter: events.onMouseEnter,
1173
- onMouseLeave: events.onMouseLeave,
1174
- onClick: events.onPress,
1175
- onMouseDown: events.onPressIn,
1176
- onMouseUp: events.onPressOut,
1177
- onTouchStart: events.onPressIn,
1178
- onTouchEnd: events.onPressOut,
1179
- })}
1186
+ {...(events && getWebEvents(events))}
1180
1187
  >
1181
1188
  {content}
1182
1189
  </span>
@@ -1315,6 +1322,18 @@ export function createComponent<
1315
1322
  return res
1316
1323
  }
1317
1324
 
1325
+ function getWebEvents<E extends TamaguiComponentEvents>(events: E) {
1326
+ return {
1327
+ onMouseEnter: events.onMouseEnter,
1328
+ onMouseLeave: events.onMouseLeave,
1329
+ onClick: events.onPress,
1330
+ onMouseDown: events.onPressIn,
1331
+ onMouseUp: events.onPressOut,
1332
+ onTouchStart: events.onPressIn,
1333
+ onTouchEnd: events.onPressOut,
1334
+ }
1335
+ }
1336
+
1318
1337
  // for elements to avoid spacing
1319
1338
  export function Unspaced(props: { children?: any }) {
1320
1339
  return props.children
@@ -7,38 +7,61 @@ export type StyledContext<Props extends Object = any> = Omit<
7
7
  'Provider'
8
8
  > & {
9
9
  context: React.Context<Props>
10
- props: Object
10
+ props: Object | undefined
11
11
  Provider: React.ProviderExoticComponent<
12
- Partial<Props> & {
12
+ Partial<Props | undefined> & {
13
13
  children?: React.ReactNode
14
+ scope?: string
14
15
  }
15
16
  >
17
+ useStyledContext: (scope?: string) => Props
16
18
  }
17
19
 
18
20
  export function createStyledContext<VariantProps extends Record<string, any>>(
19
- props: VariantProps
21
+ defaultValues?: VariantProps
20
22
  ): StyledContext<VariantProps> {
21
- const OGContext = createContext<VariantProps>(props)
23
+ const OGContext = createContext<VariantProps | undefined>(defaultValues)
22
24
  const OGProvider = OGContext.Provider
23
25
  const Context = OGContext as any as StyledContext<VariantProps>
26
+ const scopedContexts = new Map<string, React.Context<VariantProps | undefined>>()
24
27
 
25
28
  const Provider = ({
26
29
  children,
30
+ scope,
27
31
  ...values
28
- }: VariantProps & { children?: React.ReactNode }) => {
32
+ }: VariantProps & { children?: React.ReactNode; scope: string }) => {
29
33
  const value = useMemo(() => {
30
34
  return {
31
- ...props,
35
+ // this ! is a workaround for ts error
36
+ ...defaultValues!,
32
37
  ...values,
33
38
  }
34
39
  }, [objectIdentityKey(values)])
35
- return <OGProvider value={value}>{children}</OGProvider>
40
+ let Provider = OGProvider
41
+ if (scope) {
42
+ let ScopedContext = scopedContexts.get(scope)
43
+ if (!ScopedContext) {
44
+ ScopedContext = createContext<VariantProps | undefined>(defaultValues)
45
+ scopedContexts.set(scope, ScopedContext)
46
+ }
47
+ Provider = ScopedContext.Provider
48
+ }
49
+ return <Provider value={value}>{children}</Provider>
50
+ }
51
+
52
+ // use consumerComponent just to give a better error message
53
+ const useStyledContext = (scope?: string) => {
54
+ const context = scope ? scopedContexts.get(scope) : OGContext
55
+ return useContext(context!) as VariantProps
36
56
  }
37
57
 
38
58
  // @ts-ignore
39
59
  Context.Provider = Provider
40
- Context.props = props
41
- Context.context = OGContext
60
+ Context.props = defaultValues
61
+ Context.context = OGContext as React.Context<VariantProps>
62
+ Context.useStyledContext = useStyledContext
42
63
 
43
64
  return Context
44
65
  }
66
+
67
+ export type ScopedProps<P, K extends string> = P & { [Key in `__scope${K}`]?: string }