@tamagui/web 1.46.0 → 1.46.2

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 (33) hide show
  1. package/dist/cjs/createComponent.js +12 -11
  2. package/dist/cjs/createComponent.js.map +1 -1
  3. package/dist/cjs/createTamagui.js +45 -43
  4. package/dist/cjs/createTamagui.js.map +1 -1
  5. package/dist/cjs/helpers/expandStyles.js +2 -5
  6. package/dist/cjs/helpers/expandStyles.js.map +1 -1
  7. package/dist/cjs/helpers/getSplitStyles.js +2 -2
  8. package/dist/cjs/helpers/getSplitStyles.js.map +1 -1
  9. package/dist/cjs/helpers/getThemeCSSRules.js +89 -91
  10. package/dist/cjs/helpers/getThemeCSSRules.js.map +1 -1
  11. package/dist/esm/createComponent.js +12 -11
  12. package/dist/esm/createComponent.js.map +1 -1
  13. package/dist/esm/createTamagui.js +45 -43
  14. package/dist/esm/createTamagui.js.map +1 -1
  15. package/dist/esm/helpers/expandStyles.js +2 -5
  16. package/dist/esm/helpers/expandStyles.js.map +1 -1
  17. package/dist/esm/helpers/getSplitStyles.js +2 -2
  18. package/dist/esm/helpers/getSplitStyles.js.map +1 -1
  19. package/dist/esm/helpers/getThemeCSSRules.js +89 -91
  20. package/dist/esm/helpers/getThemeCSSRules.js.map +1 -1
  21. package/package.json +9 -9
  22. package/src/createComponent.tsx +19 -13
  23. package/src/createTamagui.ts +56 -54
  24. package/src/helpers/expandStyles.ts +2 -9
  25. package/src/helpers/getSplitStyles.tsx +4 -10
  26. package/src/helpers/getThemeCSSRules.ts +127 -126
  27. package/types/createComponent.d.ts.map +1 -1
  28. package/types/createTamagui.d.ts.map +1 -1
  29. package/types/helpers/expandStyles.d.ts +1 -1
  30. package/types/helpers/expandStyles.d.ts.map +1 -1
  31. package/types/helpers/getSplitStyles.d.ts.map +1 -1
  32. package/types/helpers/getThemeCSSRules.d.ts +1 -1
  33. package/types/helpers/getThemeCSSRules.d.ts.map +1 -1
@@ -2,106 +2,104 @@ import { simpleHash } from "@tamagui/helpers";
2
2
  import { THEME_CLASSNAME_PREFIX } from "../constants/constants";
3
3
  import { variableToString } from "../createVariable";
4
4
  import { tokensValueToVariable } from "./registerCSSVariable";
5
- function getThemeCSSRules({
6
- config,
7
- themeName,
8
- theme,
9
- names
10
- }) {
5
+ function getThemeCSSRules(props) {
11
6
  const cssRuleSets = [];
12
- const hasDarkLight = "light" in config.themes && "dark" in config.themes;
13
- const CNP = `.${THEME_CLASSNAME_PREFIX}`;
14
- let vars = "";
15
- for (const themeKey in theme) {
16
- const variable = theme[themeKey];
17
- let value = null;
18
- if (!tokensValueToVariable.has(variable.val)) {
19
- value = variable.val;
20
- } else {
21
- value = tokensValueToVariable.get(variable.val).variable;
22
- }
23
- vars += `--${simpleHash(themeKey, 40)}:${value};`;
24
- }
25
- const isDarkOrLightBase = themeName === "dark" || themeName === "light";
26
- const baseSelectors = names.map((name) => `${CNP}${name}`);
27
- const selectorsSet = new Set(baseSelectors);
28
- if (hasDarkLight) {
29
- for (const subName of names) {
30
- const isDark = themeName === "dark" || subName.startsWith("dark_");
31
- const isLight = themeName === "light" || themeName.startsWith("light_");
32
- const maxDepth = config.maxDarkLightNesting ?? 3;
33
- if (!(isDark || isLight)) {
34
- selectorsSet.add(`:root:root ${CNP}${subName}`);
35
- continue;
7
+ if (process.env.TAMAGUI_DOES_SSR_CSS !== "true") {
8
+ const { config, themeName, theme, names } = props;
9
+ const hasDarkLight = "light" in config.themes && "dark" in config.themes;
10
+ const CNP = `.${THEME_CLASSNAME_PREFIX}`;
11
+ let vars = "";
12
+ for (const themeKey in theme) {
13
+ const variable = theme[themeKey];
14
+ let value = null;
15
+ if (!tokensValueToVariable.has(variable.val)) {
16
+ value = variable.val;
17
+ } else {
18
+ value = tokensValueToVariable.get(variable.val).variable;
36
19
  }
37
- const childSelector = `${CNP}${subName.replace(/^(dark|light)_/, "")}`;
38
- const [altLightDark, altSubTheme] = [
39
- isDark ? ["dark", "light"] : ["light", "dark"],
40
- isDark ? ["dark", "sub_theme"] : ["light", "sub_theme"]
41
- ];
42
- for (const order of [altLightDark, altSubTheme]) {
43
- if (isDarkOrLightBase) {
44
- order.reverse();
20
+ vars += `--${simpleHash(themeKey, 40)}:${value};`;
21
+ }
22
+ const isDarkOrLightBase = themeName === "dark" || themeName === "light";
23
+ const baseSelectors = names.map((name) => `${CNP}${name}`);
24
+ const selectorsSet = new Set(baseSelectors);
25
+ if (hasDarkLight) {
26
+ for (const subName of names) {
27
+ const isDark = themeName === "dark" || subName.startsWith("dark_");
28
+ const isLight = themeName === "light" || themeName.startsWith("light_");
29
+ const maxDepth = config.maxDarkLightNesting ?? 3;
30
+ if (!(isDark || isLight)) {
31
+ selectorsSet.add(`:root:root ${CNP}${subName}`);
32
+ continue;
45
33
  }
46
- const [stronger, weaker] = order;
47
- const numSelectors = Math.round(maxDepth * 1.5);
48
- for (let depth = 0; depth < numSelectors; depth++) {
49
- const isOdd = depth % 2 === 1;
50
- if (isOdd && depth < 3) {
51
- continue;
34
+ const childSelector = `${CNP}${subName.replace(/^(dark|light)_/, "")}`;
35
+ const [altLightDark, altSubTheme] = [
36
+ isDark ? ["dark", "light"] : ["light", "dark"],
37
+ isDark ? ["dark", "sub_theme"] : ["light", "sub_theme"]
38
+ ];
39
+ for (const order of [altLightDark, altSubTheme]) {
40
+ if (isDarkOrLightBase) {
41
+ order.reverse();
52
42
  }
53
- const parents = new Array(depth + 1).fill(0).map((_, psi) => {
54
- return `${CNP}${psi % 2 === 0 ? stronger : weaker}`;
55
- });
56
- let parentSelectors = parents.length > 1 ? parents.slice(1) : parents;
57
- if (isOdd) {
58
- const [_first, second, ...rest] = parentSelectors;
59
- parentSelectors = [second, ...rest, second];
43
+ const [stronger, weaker] = order;
44
+ const numSelectors = Math.round(maxDepth * 1.5);
45
+ for (let depth = 0; depth < numSelectors; depth++) {
46
+ const isOdd = depth % 2 === 1;
47
+ if (isOdd && depth < 3) {
48
+ continue;
49
+ }
50
+ const parents = new Array(depth + 1).fill(0).map((_, psi) => {
51
+ return `${CNP}${psi % 2 === 0 ? stronger : weaker}`;
52
+ });
53
+ let parentSelectors = parents.length > 1 ? parents.slice(1) : parents;
54
+ if (isOdd) {
55
+ const [_first, second, ...rest] = parentSelectors;
56
+ parentSelectors = [second, ...rest, second];
57
+ }
58
+ const lastParentSelector = parentSelectors[parentSelectors.length - 1];
59
+ const nextChildSelector = childSelector === lastParentSelector ? "" : childSelector;
60
+ selectorsSet.add(`${parentSelectors.join(" ")} ${nextChildSelector}`.trim());
60
61
  }
61
- const lastParentSelector = parentSelectors[parentSelectors.length - 1];
62
- const nextChildSelector = childSelector === lastParentSelector ? "" : childSelector;
63
- selectorsSet.add(`${parentSelectors.join(" ")} ${nextChildSelector}`.trim());
64
62
  }
65
63
  }
66
64
  }
67
- }
68
- const selectors = [...selectorsSet].sort((a, b) => a.localeCompare(b));
69
- const selectorsString = selectors.map((x) => {
70
- const rootSep = isBaseTheme(x) && config.themeClassNameOnRoot ? "" : " ";
71
- return `:root${rootSep}${x}`;
72
- }).join(", ");
73
- const css = `${selectorsString} {${vars}}`;
74
- cssRuleSets.push(css);
75
- if (config.shouldAddPrefersColorThemes) {
76
- const bgString = theme.background ? `background:${variableToString(theme.background)};` : "";
77
- const fgString = theme.color ? `color:${variableToString(theme.color)}` : "";
78
- const bodyRules = `body{${bgString}${fgString}}`;
79
- const isDark = themeName.startsWith("dark");
80
- const baseName = isDark ? "dark" : "light";
81
- const lessSpecificSelectors = selectors.map((x) => {
82
- if (x == darkSelector || x === lightSelector)
83
- return `:root`;
84
- if (isDark && x.startsWith(lightSelector) || !isDark && x.startsWith(darkSelector)) {
85
- return;
65
+ const selectors = [...selectorsSet].sort((a, b) => a.localeCompare(b));
66
+ const selectorsString = selectors.map((x) => {
67
+ const rootSep = isBaseTheme(x) && config.themeClassNameOnRoot ? "" : " ";
68
+ return `:root${rootSep}${x}`;
69
+ }).join(", ");
70
+ const css = `${selectorsString} {${vars}}`;
71
+ cssRuleSets.push(css);
72
+ if (config.shouldAddPrefersColorThemes) {
73
+ const bgString = theme.background ? `background:${variableToString(theme.background)};` : "";
74
+ const fgString = theme.color ? `color:${variableToString(theme.color)}` : "";
75
+ const bodyRules = `body{${bgString}${fgString}}`;
76
+ const isDark = themeName.startsWith("dark");
77
+ const baseName = isDark ? "dark" : "light";
78
+ const lessSpecificSelectors = selectors.map((x) => {
79
+ if (x == darkSelector || x === lightSelector)
80
+ return `:root`;
81
+ if (isDark && x.startsWith(lightSelector) || !isDark && x.startsWith(darkSelector)) {
82
+ return;
83
+ }
84
+ return x.replace(/^\.t_(dark|light) /, "").trim();
85
+ }).filter(Boolean).join(", ");
86
+ const themeRules = `${lessSpecificSelectors} {${vars}}`;
87
+ const prefersMediaSelectors = `@media(prefers-color-scheme:${baseName}){
88
+ ${bodyRules}
89
+ ${themeRules}
90
+ }`;
91
+ cssRuleSets.push(prefersMediaSelectors);
92
+ }
93
+ if (config.selectionStyles) {
94
+ const selectionSelectors = baseSelectors.map((s) => `${s} ::selection`).join(", ");
95
+ const rules = config.selectionStyles(theme);
96
+ if (rules) {
97
+ const styles = Object.entries(rules).flatMap(
98
+ ([k, v]) => v ? `${k === "backgroundColor" ? "background" : k}:${variableToString(v)}` : []
99
+ ).join(";");
100
+ const css2 = `${selectionSelectors} {${styles}}`;
101
+ cssRuleSets.push(css2);
86
102
  }
87
- return x.replace(/^\.t_(dark|light) /, "").trim();
88
- }).filter(Boolean).join(", ");
89
- const themeRules = `${lessSpecificSelectors} {${vars}}`;
90
- const prefersMediaSelectors = `@media(prefers-color-scheme:${baseName}){
91
- ${bodyRules}
92
- ${themeRules}
93
- }`;
94
- cssRuleSets.push(prefersMediaSelectors);
95
- }
96
- if (config.selectionStyles) {
97
- const selectionSelectors = baseSelectors.map((s) => `${s} ::selection`).join(", ");
98
- const rules = config.selectionStyles(theme);
99
- if (rules) {
100
- const styles = Object.entries(rules).flatMap(
101
- ([k, v]) => v ? `${k === "backgroundColor" ? "background" : k}:${variableToString(v)}` : []
102
- ).join(";");
103
- const css2 = `${selectionSelectors} {${styles}}`;
104
- cssRuleSets.push(css2);
105
103
  }
106
104
  }
107
105
  return cssRuleSets;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/getThemeCSSRules.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["css"]
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/web",
3
- "version": "1.46.0",
3
+ "version": "1.46.2",
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.46.0",
31
- "@tamagui/constants": "1.46.0",
32
- "@tamagui/helpers": "1.46.0",
33
- "@tamagui/normalize-css-color": "1.46.0",
34
- "@tamagui/use-did-finish-ssr": "1.46.0",
35
- "@tamagui/use-event": "1.46.0",
36
- "@tamagui/use-force-update": "1.46.0"
30
+ "@tamagui/compose-refs": "1.46.2",
31
+ "@tamagui/constants": "1.46.2",
32
+ "@tamagui/helpers": "1.46.2",
33
+ "@tamagui/normalize-css-color": "1.46.2",
34
+ "@tamagui/use-did-finish-ssr": "1.46.2",
35
+ "@tamagui/use-event": "1.46.2",
36
+ "@tamagui/use-force-update": "1.46.2"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "react": "*"
40
40
  },
41
41
  "devDependencies": {
42
- "@tamagui/build": "1.46.0",
42
+ "@tamagui/build": "1.46.2",
43
43
  "@testing-library/react": "^13.4.0",
44
44
  "csstype": "^3.0.10",
45
45
  "react": "^18.2.0",
@@ -263,9 +263,6 @@ export function createComponent<
263
263
  if (isServer) return false
264
264
  const curState = stateRef.current
265
265
  const next = !!(hasAnimationProp && !isHOC && useAnimations)
266
- if (next && !curState.hasAnimated) {
267
- curState.hasAnimated = true
268
- }
269
266
  return Boolean(next || curState.hasAnimated)
270
267
  })()
271
268
 
@@ -292,6 +289,8 @@ export function createComponent<
292
289
  ? { ...states[0], [propsIn.forceStyle]: true }
293
290
  : states[0]
294
291
  const setState = states[1]
292
+
293
+ // TODO performance optimization could avoid useCallback and just have this be setStateShallow(setState, state) at call-sites
295
294
  const setStateShallow = useShallowSetState(setState, debugProp, componentName)
296
295
 
297
296
  let isAnimated = willBeAnimated
@@ -616,19 +615,26 @@ export function createComponent<
616
615
 
617
616
  const shouldSetMounted = needsMount && state.unmounted
618
617
 
619
- // combined two effects into one for performance so be careful with logic
620
- // because no need for mouseUp removal effect if its not even mounted yet
618
+ // combined multiple effects into one for performance so be careful with logic
621
619
  useIsomorphicLayoutEffect(() => {
622
- if (!shouldSetMounted) {
623
- return () => {
624
- mouseUps.delete(unPress)
625
- }
620
+ // once animated, always animated to preserve hooks
621
+ if (willBeAnimated && !stateRef.current.hasAnimated) {
622
+ stateRef.current.hasAnimated = true
626
623
  }
627
624
 
628
- const unmounted = state.unmounted === true && hasEnterStyle ? 'should-enter' : false
629
- setStateShallow({
630
- unmounted,
631
- })
625
+ if (shouldSetMounted) {
626
+ const unmounted =
627
+ state.unmounted === true && hasEnterStyle ? 'should-enter' : false
628
+ setStateShallow({
629
+ unmounted,
630
+ })
631
+ return
632
+ // no need for mouseUp removal effect if its not even mounted yet
633
+ }
634
+
635
+ return () => {
636
+ mouseUps.delete(unPress)
637
+ }
632
638
  }, [shouldSetMounted, state.unmounted])
633
639
 
634
640
  let styles: Record<string, any>[] | undefined
@@ -74,68 +74,70 @@ export function createTamagui<Conf extends CreateTamaguiProps>(
74
74
  const themes = { ...configIn.themes }
75
75
  const cssRuleSets: string[] = []
76
76
 
77
- if (isWeb) {
78
- const declarations: string[] = []
79
- const fontDeclarations: Record<
80
- string,
81
- { name: string; declarations: string[]; language?: string }
82
- > = {}
83
-
84
- for (const key in configIn.tokens) {
85
- for (const skey in configIn.tokens[key]) {
86
- const variable = configIn.tokens[key][skey] as Variable
87
-
88
- // set specific tokens (like $size.sm)
89
- specificTokens[`$${key}.${skey}`] = variable
90
-
91
- if (process.env.NODE_ENV === 'development') {
92
- if (typeof variable === 'undefined') {
93
- throw new Error(
94
- `No value for tokens.${key}.${skey}:\n${JSON.stringify(
95
- variable,
96
- null,
97
- 2
98
- )}`
99
- )
77
+ if (process.env.TAMAGUI_DOES_SSR_CSS !== 'true') {
78
+ if (isWeb) {
79
+ const declarations: string[] = []
80
+ const fontDeclarations: Record<
81
+ string,
82
+ { name: string; declarations: string[]; language?: string }
83
+ > = {}
84
+
85
+ for (const key in configIn.tokens) {
86
+ for (const skey in configIn.tokens[key]) {
87
+ const variable = configIn.tokens[key][skey] as Variable
88
+
89
+ // set specific tokens (like $size.sm)
90
+ specificTokens[`$${key}.${skey}`] = variable
91
+
92
+ if (process.env.NODE_ENV === 'development') {
93
+ if (typeof variable === 'undefined') {
94
+ throw new Error(
95
+ `No value for tokens.${key}.${skey}:\n${JSON.stringify(
96
+ variable,
97
+ null,
98
+ 2
99
+ )}`
100
+ )
101
+ }
100
102
  }
101
- }
102
103
 
103
- registerCSSVariable(variable)
104
- declarations.push(variableToCSS(variable, key === 'zIndex'))
104
+ registerCSSVariable(variable)
105
+ declarations.push(variableToCSS(variable, key === 'zIndex'))
106
+ }
105
107
  }
106
- }
107
108
 
108
- for (const key in fontsParsed) {
109
- const fontParsed = fontsParsed[key]
110
- const [name, language] = key.includes('_') ? key.split('_') : [key]
111
- const fontVars = registerFontVariables(fontParsed)
112
- fontDeclarations[key] = {
113
- name: name.slice(1),
114
- declarations: fontVars,
115
- language,
109
+ for (const key in fontsParsed) {
110
+ const fontParsed = fontsParsed[key]
111
+ const [name, language] = key.includes('_') ? key.split('_') : [key]
112
+ const fontVars = registerFontVariables(fontParsed)
113
+ fontDeclarations[key] = {
114
+ name: name.slice(1),
115
+ declarations: fontVars,
116
+ language,
117
+ }
116
118
  }
117
- }
118
119
 
119
- const sep =
120
- process.env.NODE_ENV === 'development' ? configIn.cssStyleSeparator || ' ' : ''
120
+ const sep =
121
+ process.env.NODE_ENV === 'development' ? configIn.cssStyleSeparator || ' ' : ''
121
122
 
122
- function declarationsToRuleSet(decs: string[], selector = '') {
123
- return `:root${selector} {${sep}${[...decs].join(`;${sep}`)}${sep}}`
124
- }
123
+ function declarationsToRuleSet(decs: string[], selector = '') {
124
+ return `:root${selector} {${sep}${[...decs].join(`;${sep}`)}${sep}}`
125
+ }
125
126
 
126
- // non-font
127
- cssRuleSets.push(declarationsToRuleSet(declarations))
128
-
129
- // fonts
130
- if (fontDeclarations) {
131
- for (const key in fontDeclarations) {
132
- const { name, declarations, language = 'default' } = fontDeclarations[key]
133
- const fontSelector = `.font_${name}`
134
- const langSelector = `:root .t_lang-${name}-${language} ${fontSelector}`
135
- const selectors =
136
- language === 'default' ? ` ${fontSelector}, ${langSelector}` : langSelector
137
- const specificRuleSet = declarationsToRuleSet(declarations, selectors)
138
- cssRuleSets.push(specificRuleSet)
127
+ // non-font
128
+ cssRuleSets.push(declarationsToRuleSet(declarations))
129
+
130
+ // fonts
131
+ if (fontDeclarations) {
132
+ for (const key in fontDeclarations) {
133
+ const { name, declarations, language = 'default' } = fontDeclarations[key]
134
+ const fontSelector = `.font_${name}`
135
+ const langSelector = `:root .t_lang-${name}-${language} ${fontSelector}`
136
+ const selectors =
137
+ language === 'default' ? ` ${fontSelector}, ${langSelector}` : langSelector
138
+ const specificRuleSet = declarationsToRuleSet(declarations, selectors)
139
+ cssRuleSets.push(specificRuleSet)
140
+ }
139
141
  }
140
142
  }
141
143
  }
@@ -1,6 +1,5 @@
1
1
  import { isWeb } from '@tamagui/constants'
2
2
 
3
- import { getConfig } from '../config'
4
3
  import { expandStyle } from './expandStyle'
5
4
  import { normalizeShadow } from './normalizeShadow'
6
5
  import { normalizeValueWithProperty } from './normalizeValueWithProperty'
@@ -14,18 +13,12 @@ import { pseudoDescriptors } from './pseudoDescriptors'
14
13
  * 3. Expands react-native shorthands, ie paddingHorizontal => paddingLeft, paddingRight
15
14
  */
16
15
 
17
- export function expandStylesAndRemoveNullishValues(
18
- style: Record<string, any>,
19
- { shorthands } = getConfig()
20
- ) {
16
+ export function expandStylesAndRemoveNullishValues(style: Record<string, any>) {
21
17
  const res: Record<string, any> = {}
22
18
 
23
19
  for (let key in style) {
24
20
  const valIn = style[key]
25
- if (valIn == null) {
26
- continue
27
- }
28
- key = shorthands?.[key] || key
21
+ if (valIn == null) continue
29
22
  if (key in pseudoDescriptors) {
30
23
  res[key] = expandStylesAndRemoveNullishValues(valIn)
31
24
  continue
@@ -178,6 +178,8 @@ export const getSplitStyles: StyleSplitter = (
178
178
 
179
179
  // handle before the loop so we can mark usedKeys in className
180
180
  // since the compiler will optimize to className we just treat className as the more powerful
181
+ // TODO the compiler should probably just leave things inline if its not flattening
182
+ // that way it keeps merging order
181
183
  if (typeof props.className === 'string') {
182
184
  for (const cn of props.className.split(' ')) {
183
185
  if (cn[0] === '_') {
@@ -630,8 +632,8 @@ export const getSplitStyles: StyleSplitter = (
630
632
  )
631
633
 
632
634
  const descriptor = pseudoDescriptors[key as keyof typeof pseudoDescriptors]
633
- const isEnter = descriptor.name === 'enter'
634
- const isExit = descriptor.name === 'exit'
635
+ const isEnter = key === 'enterStyle'
636
+ const isExit = key === 'exitStyle'
635
637
 
636
638
  // dev-time warning that helps clear confusion around need for animation when using enter/exit style
637
639
  if (
@@ -718,14 +720,6 @@ export const getSplitStyles: StyleSplitter = (
718
720
  console.groupEnd()
719
721
  }
720
722
 
721
- // if (!isDisabled) {
722
- // if (valInit === staticConfig.defaultProps[keyInit]) {
723
- // // ignore:
724
- // // if it's a default property given by styled(), we don't mark it as used, so
725
- // // that props given inline can override:
726
- // }
727
- // }
728
-
729
723
  const importance = descriptor.priority
730
724
 
731
725
  if (!isDisabled) {