@tamagui/web 1.5.8 → 1.5.10

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.
@@ -41,80 +41,112 @@ export function getThemeCSSRules({
41
41
  }
42
42
 
43
43
  const isDarkOrLightBase = themeName === 'dark' || themeName === 'light'
44
- const selectors = names.map((name) => {
45
- return `${CNP}${name}`
46
- })
44
+ const selectorsSet = new Set(
45
+ names.map((name) => {
46
+ return `${CNP}${name}`
47
+ })
48
+ )
47
49
 
48
50
  // since we dont specify dark/light in classnames we have to do an awkward specificity war
49
51
  // use config.maxDarkLightNesting to determine how deep you can nest until it breaks
50
52
  if (hasDarkLight) {
51
53
  for (const subName of names) {
52
- const isDark = isDarkOrLightBase || subName.startsWith('dark_')
53
- const max = config.maxDarkLightNesting ?? 3
54
+ const isDark = themeName === 'dark' || subName.startsWith('dark_')
55
+ const maxDepth = config.maxDarkLightNesting ?? 3
54
56
 
55
57
  if (!(isDark || subName.startsWith('light_'))) {
56
58
  // neither light nor dark subtheme, just generate one selector with :root:root which
57
59
  // will override all :root light/dark selectors generated below
58
- selectors.push(`:root:root ${CNP}${subName}`)
60
+ selectorsSet.add(`:root:root ${CNP}${subName}`)
59
61
  continue
60
62
  }
61
63
 
62
64
  const childSelector = `${CNP}${subName.replace(isDark ? 'dark_' : 'light_', '')}`
63
- const order = isDark ? ['dark', 'light'] : ['light', 'dark']
64
- if (isDarkOrLightBase) {
65
- order.reverse()
66
- }
67
- const [stronger, weaker] = order
68
- const numSelectors = Math.round(max * 1.5)
69
-
70
- for (let pi = 0; pi < numSelectors; pi++) {
71
- const isOdd = pi % 2 === 1
72
- if (isOdd && pi < 3) continue
73
- const parents = new Array(pi + 1).fill(undefined).map((_, psi) => {
74
- return `${CNP}${psi % 2 === 0 ? stronger : weaker}`
75
- })
76
- let parentSelectors = parents.length > 1 ? parents.slice(1) : parents
77
- if (isOdd) {
78
- const [_first, second, ...rest] = parentSelectors
79
- parentSelectors = [second, ...rest, second]
65
+
66
+ const [altLightDark, altSubTheme] = [
67
+ isDark ? ['dark', 'light'] : ['light', 'dark'],
68
+ isDark ? ['dark', 'sub_theme'] : ['light', 'sub_theme'],
69
+ ]
70
+
71
+ for (const order of [altLightDark, altSubTheme]) {
72
+ if (isDarkOrLightBase) {
73
+ order.reverse()
80
74
  }
81
- // avoid .t_light .t_light at the end (make sure child is unique from last parent)
82
- const lastParentSelector = parentSelectors[parentSelectors.length - 1]
83
- selectors.push(
84
- `${parentSelectors.join(' ')} ${
75
+ const [stronger, weaker] = order
76
+ const numSelectors = Math.round(maxDepth * 1.5)
77
+
78
+ for (let depth = 0; depth < numSelectors; depth++) {
79
+ const isOdd = depth % 2 === 1
80
+
81
+ // wtf is this continue:
82
+ if (isOdd && depth < 3) {
83
+ continue
84
+ }
85
+
86
+ const parents = new Array(depth + 1).fill(0).map((_, psi) => {
87
+ return `${CNP}${psi % 2 === 0 ? stronger : weaker}`
88
+ })
89
+
90
+ let parentSelectors = parents.length > 1 ? parents.slice(1) : parents
91
+
92
+ if (isOdd) {
93
+ const [_first, second, ...rest] = parentSelectors
94
+ parentSelectors = [second, ...rest, second]
95
+ }
96
+
97
+ const lastParentSelector = parentSelectors[parentSelectors.length - 1]
98
+ const nextChildSelector =
85
99
  childSelector === lastParentSelector ? '' : childSelector
86
- }`
87
- )
100
+
101
+ // for light/dark/light:
102
+ selectorsSet.add(`${parentSelectors.join(' ')} ${nextChildSelector}`.trim())
103
+ }
88
104
  }
89
105
  }
90
106
  }
91
107
 
92
- const selectorsString = selectors.map((x) => {
93
- // only do our :root attach if it's not light/dark - not support sub themes on root saves a lot of effort/size
94
- // this isBaseTheme logic could probably be done more efficiently above
95
- const isBaseTheme =
96
- x === '.t_dark' ||
97
- x === '.t_light' ||
98
- x.startsWith('.t_dark ') ||
99
- x.startsWith('.t_light ')
100
- const rootSep = isBaseTheme && config.themeClassNameOnRoot ? '' : ' '
101
- return `:root${rootSep}${x}`
102
- })
103
- const css = `${selectorsString.join(', ')} {${vars}}`
108
+ const selectors = [...selectorsSet]
109
+
110
+ // only do our :root attach if it's not light/dark - not support sub themes on root saves a lot of effort/size
111
+ // this isBaseTheme logic could probably be done more efficiently above
112
+ const selectorsString = selectors
113
+ .map((x) => {
114
+ const rootSep = isBaseTheme(x) && config.themeClassNameOnRoot ? '' : ' '
115
+ return `:root${rootSep}${x}`
116
+ })
117
+ .join(', ')
118
+
119
+ const css = `${selectorsString} {${vars}}`
104
120
  cssRuleSets.push(css)
105
121
 
106
- if (config.shouldAddPrefersColorThemes && isDarkOrLightBase) {
107
- // add media prefers for dark/light base
122
+ if (config.shouldAddPrefersColorThemes) {
123
+ const bgString = variableToString(theme.background)
124
+ const fgString = variableToString(theme.color)
125
+ const bodyRules = `body{background:${bgString};color:${fgString};}`
108
126
  const isDark = themeName.startsWith('dark')
109
- cssRuleSets.push(
110
- `@media(prefers-color-scheme: ${isDark ? 'dark' : 'light'}) {
111
- body { background:${variableToString(theme.background)}; color: ${variableToString(
112
- theme.color
113
- )} }
114
- :root {${vars} }
127
+ const baseName = isDark ? 'dark' : 'light'
128
+ const lessSpecificSelectors = selectors
129
+ .map((x) => {
130
+ if (x == darkSelector || x === lightSelector) return `:root`
131
+ return x.replace(/^\.t_(dark|light) /, '').trim()
132
+ })
133
+ .filter(Boolean)
134
+ .join(', ')
135
+ const themeRules = `${lessSpecificSelectors} {${vars}}`
136
+ const prefersMediaSelectors = `@media(prefers-color-scheme:${baseName}){
137
+ ${bodyRules}
138
+ ${themeRules}
115
139
  }`
116
- )
140
+ cssRuleSets.push(prefersMediaSelectors)
117
141
  }
118
142
 
119
143
  return cssRuleSets
120
144
  }
145
+
146
+ const darkSelector = '.t_dark'
147
+ const lightSelector = '.t_light'
148
+ const isBaseTheme = (x: string) =>
149
+ x === darkSelector ||
150
+ x === lightSelector ||
151
+ x.startsWith('.t_dark ') ||
152
+ x.startsWith('.t_light ')
@@ -42,23 +42,20 @@ export function proxyThemeToParents(
42
42
  return cur.join('_')
43
43
  })
44
44
 
45
- const len = parents.length
45
+ const numParents = parents.length
46
46
 
47
47
  // proxy fallback values to parent theme values
48
48
  return new Proxy(theme, {
49
49
  get(target, key) {
50
- if (key === GetThemeUnwrapped) {
51
- return theme
52
- }
53
- if (!len || Reflect.has(target, key)) {
54
- return Reflect.get(target, key)
55
- }
56
- // check parents
57
- for (let i = len - 1; i >= 0; i--) {
58
- const parent = themes[parents[i]]
59
- if (!parent) continue
60
- if (Reflect.has(parent, key)) {
61
- return Reflect.get(parent, key)
50
+ if (key === GetThemeUnwrapped) return theme
51
+ if (numParents && !Reflect.has(target, key)) {
52
+ // check parents
53
+ for (let i = numParents - 1; i >= 0; i--) {
54
+ const parent = themes[parents[i]]
55
+ if (!parent) continue
56
+ if (Reflect.has(parent, key)) {
57
+ return Reflect.get(parent, key)
58
+ }
62
59
  }
63
60
  }
64
61
  return Reflect.get(target, key)
package/src/index.ts CHANGED
@@ -33,6 +33,7 @@ export * from './helpers/matchMedia.js'
33
33
  export * from './helpers/proxyThemeVariables.js'
34
34
  export * from './helpers/themeable.js'
35
35
  export * from './helpers/withStaticProperties.js'
36
+ export * from './helpers/normalizeColor.js'
36
37
 
37
38
  export * from './contexts/ButtonNestingContext.js'
38
39
 
@@ -1 +1 @@
1
- {"version":3,"file":"getThemeCSSRules.d.ts","sourceRoot":"","sources":["../../src/helpers/getThemeCSSRules.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGlE,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,SAAS,EACT,KAAK,EACL,KAAK,GACN,EAAE;IACD,MAAM,EAAE,kBAAkB,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,WAAW,CAAA;IAClB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,YAsGA"}
1
+ {"version":3,"file":"getThemeCSSRules.d.ts","sourceRoot":"","sources":["../../src/helpers/getThemeCSSRules.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGlE,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,SAAS,EACT,KAAK,EACL,KAAK,GACN,EAAE;IACD,MAAM,EAAE,kBAAkB,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,WAAW,CAAA;IAClB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,YA8HA"}
@@ -1 +1 @@
1
- {"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../../src/helpers/themes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAIhD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,QAmB1D;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,OAoCrC"}
1
+ {"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../../src/helpers/themes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAIhD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,QAmB1D;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,OAiCrC"}
package/types/index.d.ts CHANGED
@@ -30,6 +30,7 @@ export * from './helpers/matchMedia.js';
30
30
  export * from './helpers/proxyThemeVariables.js';
31
31
  export * from './helpers/themeable.js';
32
32
  export * from './helpers/withStaticProperties.js';
33
+ export * from './helpers/normalizeColor.js';
33
34
  export * from './contexts/ButtonNestingContext.js';
34
35
  export * from './hooks/useId.js';
35
36
  export * from './hooks/useIsTouchDevice.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,uBAAuB,CAAA;AAErC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE/E,cAAc,0BAA0B,CAAA;AAExC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,oCAAoC,CAAA;AAClD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,yBAAyB,CAAA;AACvC,cAAc,2BAA2B,CAAA;AACzC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,kCAAkC,CAAA;AAChD,cAAc,wBAAwB,CAAA;AACtC,cAAc,mCAAmC,CAAA;AAEjD,cAAc,oCAAoC,CAAA;AAElD,cAAc,kBAAkB,CAAA;AAChC,cAAc,6BAA6B,CAAA;AAE3C,OAAO,EACL,cAAc,EACd,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAC5B,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mCAAmC,CAAA;AACjD,cAAc,kBAAkB,CAAA;AAChC,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAE1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAElC,cAAc,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,uBAAuB,CAAA;AAErC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE/E,cAAc,0BAA0B,CAAA;AAExC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,oCAAoC,CAAA;AAClD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,yBAAyB,CAAA;AACvC,cAAc,2BAA2B,CAAA;AACzC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,kCAAkC,CAAA;AAChD,cAAc,wBAAwB,CAAA;AACtC,cAAc,mCAAmC,CAAA;AACjD,cAAc,6BAA6B,CAAA;AAE3C,cAAc,oCAAoC,CAAA;AAElD,cAAc,kBAAkB,CAAA;AAChC,cAAc,6BAA6B,CAAA;AAE3C,OAAO,EACL,cAAc,EACd,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAC5B,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mCAAmC,CAAA;AACjD,cAAc,kBAAkB,CAAA;AAChC,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAE1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAElC,cAAc,iBAAiB,CAAA"}