@sanity/ui 2.0.0-alpha.14 → 2.0.0-alpha.16

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/ui",
3
- "version": "2.0.0-alpha.14",
3
+ "version": "2.0.0-alpha.16",
4
4
  "sideEffects": false,
5
5
  "types": "./dist/index.d.ts",
6
6
  "source": "./src/index.ts",
@@ -309,10 +309,9 @@ const DialogCard = forwardRef(function DialogCard(
309
309
  <DialogHeader
310
310
  $isContentScrollable={isContentScrollable}
311
311
  $hasScrolledFromTop={hasScrolledFromTop}
312
- padding={3}
313
312
  >
314
313
  <Flex align="center">
315
- <Box flex={1} padding={3}>
314
+ <Box flex={1} margin={1} padding={4}>
316
315
  {header && (
317
316
  <Text id={labelId} size={1} weight="medium">
318
317
  {header}
@@ -320,14 +319,15 @@ const DialogCard = forwardRef(function DialogCard(
320
319
  )}
321
320
  </Box>
322
321
  {showCloseButton && (
323
- <Button
324
- aria-label="Close dialog"
325
- disabled={!onClose}
326
- icon={CloseIcon}
327
- mode="bleed"
328
- onClick={onClose}
329
- padding={3}
330
- />
322
+ <Box padding={3}>
323
+ <Button
324
+ aria-label="Close dialog"
325
+ disabled={!onClose}
326
+ icon={CloseIcon}
327
+ mode="bleed"
328
+ onClick={onClose}
329
+ />
330
+ </Box>
331
331
  )}
332
332
  </Flex>
333
333
  </DialogHeader>
@@ -34,45 +34,71 @@ const Root = styled.div`
34
34
  }
35
35
 
36
36
  .button {
37
- background-color: var(--button-enabled-bg);
38
- color: var(--button-enabled-fg);
37
+ background-color: var(--bg);
38
+ color: var(--fg);
39
39
  box-shadow:
40
- inset 0 0 0 1px var(--border-color),
41
- 0 1px 0 0 color-mix(in srgb, var(--border-color), transparent 75%);
40
+ inset 0 0 0 1px var(--border),
41
+ 0 1px 0 0 color-mix(in srgb, var(--border), transparent 75%);
42
42
  text-align: center;
43
43
  border-radius: 3px;
44
44
  font-weight: 500;
45
45
  cursor: default;
46
- transition: box-shadow 80ms ease-in-out;
46
+ transition: box-shadow 50ms ease-in-out;
47
47
 
48
- --border-color: var(--button-enabled-border);
48
+ --bg: var(--button-enabled-bg);
49
+ --fg: var(--button-enabled-fg);
50
+ --border: var(--button-enabled-border);
51
+ --bg2: var(--button-enabled-bg2);
52
+ --muted-fg: var(--button-enabled-muted-fg);
49
53
  }
50
54
 
51
55
  .button:hover {
52
- background-color: var(--button-hovered-bg);
53
- color: var(--button-hovered-fg);
54
- --border-color: var(--button-hovered-border);
56
+ --bg: var(--button-hovered-bg);
57
+ --fg: var(--button-hovered-fg);
58
+ --border: var(--button-hovered-border);
59
+ --bg2: var(--button-hovered-bg2);
60
+ --muted-fg: var(--button-hovered-muted-fg);
61
+ }
62
+
63
+ .button:focus {
64
+ outline: none;
65
+ box-shadow:
66
+ inset 0 0 0 1px var(--border),
67
+ 0 0 0 1px var(--base-bg),
68
+ 0 0 0 3px var(--focus-ring);
69
+
70
+ --bg: var(--button-hovered-bg);
71
+ --fg: var(--button-hovered-fg);
72
+ --border: var(--button-hovered-border);
73
+ --bg2: var(--button-hovered-bg2);
74
+ --muted-fg: var(--button-hovered-muted-fg);
55
75
  }
56
76
 
57
77
  .button:active {
58
78
  background-color: var(--button-pressed-bg);
59
79
  color: var(--button-pressed-fg);
60
- --border-color: var(--button-pressed-border);
61
- box-shadow: inset 0 0 0 1px var(--border-color);
80
+ box-shadow: inset 0 0 0 1px var(--border);
81
+ --border: var(--button-pressed-border);
82
+ --bg2: var(--button-pressed-bg2);
83
+ --muted-fg: var(--button-pressed-muted-fg);
62
84
  }
63
85
 
64
86
  .button.selected {
65
87
  background-color: var(--button-selected-bg);
66
88
  color: var(--button-selected-fg);
67
- --border-color: var(--button-selected-border);
68
- box-shadow: inset 0 0 0 1px var(--border-color);
89
+ box-shadow: inset 0 0 0 1px var(--border);
90
+ --border: var(--button-selected-border);
91
+ --bg2: var(--button-selected-bg2);
92
+ --muted-fg: var(--button-selected-muted-fg);
69
93
  }
70
94
 
71
95
  .button.disabled {
72
96
  background-color: var(--button-disabled-bg);
73
97
  color: var(--button-disabled-fg);
74
- --border-color: var(--button-disabled-border);
75
- box-shadow: inset 0 0 0 1px var(--border-color);
98
+ box-shadow: inset 0 0 0 1px var(--border);
99
+ --border: var(--button-disabled-border);
100
+ --bg2: var(--button-disabled-bg2);
101
+ --muted-fg: var(--button-disabled-muted-fg);
76
102
  }
77
103
  `
78
104
 
@@ -107,17 +133,44 @@ function BaseTonePreview(props: {
107
133
  <div
108
134
  style={
109
135
  {
110
- backgroundColor: color[baseTone].base.bg,
111
- color: color[baseTone].base.fg,
112
- '--border-color': color[baseTone].base.border,
136
+ backgroundColor: 'var(--bg)',
137
+ color: 'var(--fg)',
138
+
139
+ '--base-bg': color[baseTone].base.bg,
140
+ '--bg': 'var(--base-bg)',
141
+ '--fg': color[baseTone].base.fg,
142
+ '--border': color[baseTone].base.border,
143
+ '--focus-ring': color[baseTone].base.focusRing,
144
+ '--shadow-outline': color[baseTone].base.shadow.outline,
145
+ '--shadow-umbra': color[baseTone].base.shadow.umbra,
146
+ '--shadow-penumbra': color[baseTone].base.shadow.penumbra,
147
+ '--shadow-ambient': color[baseTone].base.shadow.ambient,
148
+ '--skeleton-from': color[baseTone].base.skeleton.from,
149
+ '--skeleton-to': color[baseTone].base.skeleton.to,
113
150
  } as any
114
151
  }
115
152
  >
116
- <div style={{maxWidth: 540, margin: 'auto', padding: '20px 0'}}>
153
+ <div style={{maxWidth: 320, margin: 'auto', padding: '20px 0'}}>
117
154
  <pre style={{padding: 12}}>
118
155
  color/{scheme}/{baseTone}
119
156
  </pre>
120
- <div style={{padding: '1px 12px 12px 12px'}}>
157
+ <div style={{padding: 12}}>
158
+ <div
159
+ style={{
160
+ boxShadow: [
161
+ `0 0 0 1px var(--shadow-outline)`,
162
+ `0 6px 8px -4px var(--shadow-umbra)`,
163
+ `0 12px 17px 2px var(--shadow-penumbra)`,
164
+ `0 5px 22px 4px var(--shadow-ambient)`,
165
+ ].join(', '),
166
+ padding: 12,
167
+ borderRadius: 3,
168
+ }}
169
+ >
170
+ Shadow
171
+ </div>
172
+ </div>
173
+ <div style={{marginTop: 20, padding: '1px 12px 12px 12px'}}>
121
174
  {COLOR_BUTTON_MODES.map((mode) => (
122
175
  <div key={mode} style={{display: 'flex', flexDirection: 'column'}}>
123
176
  {COLOR_STATE_TONES.map((tone) => {
@@ -128,43 +181,100 @@ function BaseTonePreview(props: {
128
181
  key={tone}
129
182
  style={
130
183
  {
131
- border: '1px solid var(--border-color)',
184
+ border: '1px solid var(--border)',
132
185
  padding: 4,
133
186
  display: 'flex',
187
+ flexDirection: 'column',
134
188
  marginTop: -1,
135
- gap: 4,
136
189
 
137
190
  '--button-enabled-bg': button.enabled.bg,
191
+ '--button-enabled-bg2': button.enabled.bg2,
138
192
  '--button-enabled-fg': button.enabled.fg,
139
193
  '--button-enabled-border': button.enabled.border,
194
+ '--button-enabled-muted-fg': button.enabled.muted.fg,
140
195
 
141
196
  '--button-hovered-bg': button.hovered.bg,
197
+ '--button-hovered-bg2': button.hovered.bg2,
142
198
  '--button-hovered-fg': button.hovered.fg,
143
199
  '--button-hovered-border': button.hovered.border,
200
+ '--button-hovered-muted-fg': button.hovered.muted.fg,
144
201
 
145
202
  '--button-pressed-bg': button.pressed.bg,
203
+ '--button-pressed-bg2': button.pressed.bg2,
146
204
  '--button-pressed-fg': button.pressed.fg,
147
205
  '--button-pressed-border': button.pressed.border,
206
+ '--button-pressed-muted-fg': button.pressed.muted.fg,
148
207
 
149
208
  '--button-selected-bg': button.selected.bg,
209
+ '--button-selected-bg2': button.selected.bg2,
150
210
  '--button-selected-fg': button.selected.fg,
151
211
  '--button-selected-border': button.selected.border,
212
+ '--button-selected-muted-fg': button.selected.muted.fg,
152
213
 
153
214
  '--button-disabled-bg': button.disabled.bg,
215
+ '--button-disabled-bg2': button.disabled.bg2,
154
216
  '--button-disabled-fg': button.disabled.fg,
155
217
  '--button-disabled-border': button.disabled.border,
218
+ '--button-disabled-muted-fg': button.disabled.muted.fg,
156
219
  } as any
157
220
  }
158
221
  >
159
- <pre style={{flex: 2, padding: 8}}>{`mode="${mode}" tone="${tone}"`}</pre>
160
- <div className="button" style={{flex: 'none', padding: 8}}>
161
- Button
162
- </div>
163
- <div className="button selected" style={{flex: 'none', padding: 8}}>
164
- Button
165
- </div>
166
- <div className="button disabled" style={{flex: 'none', padding: 8}}>
167
- Button
222
+ <pre style={{padding: 8}}>{`mode="${mode}" tone="${tone}"`}</pre>
223
+ <div
224
+ style={{
225
+ display: 'flex',
226
+ gap: 4,
227
+ }}
228
+ >
229
+ <div
230
+ className="button"
231
+ style={{flex: 'none', padding: 8, display: 'flex', gap: 4}}
232
+ tabIndex={0}
233
+ >
234
+ <div style={{flex: 'none'}}>Button</div>
235
+ <div style={{flex: 'none', color: 'var(--muted-fg)'}}>m</div>
236
+ <div style={{flex: 'none'}}>
237
+ <div
238
+ style={{
239
+ width: 4,
240
+ height: 9,
241
+ backgroundColor: 'var(--button-enabled-bg2)',
242
+ }}
243
+ />
244
+ </div>
245
+ </div>
246
+ <div
247
+ className="button selected"
248
+ style={{flex: 'none', padding: 8, display: 'flex', gap: 4}}
249
+ >
250
+ <div style={{flex: 'none'}}>Button</div>
251
+ <div style={{flex: 'none', color: 'var(--muted-fg)'}}>m</div>
252
+ <div style={{flex: 'none'}}>
253
+ <div
254
+ style={{
255
+ width: 4,
256
+ height: 9,
257
+ backgroundColor: 'var(--bg2)',
258
+ }}
259
+ />
260
+ </div>
261
+ </div>
262
+ <div
263
+ className="button disabled"
264
+ style={{flex: 'none', padding: 8, display: 'flex', gap: 4}}
265
+ >
266
+ <div style={{flex: 'none'}}>Button</div>
267
+ <div style={{flex: 'none', color: 'var(--muted-fg)'}}>m</div>
268
+ <div style={{flex: 'none'}}>
269
+ <div
270
+ style={{
271
+ width: 4,
272
+ height: 9,
273
+ backgroundColor: 'var(--bg2)',
274
+ }}
275
+ />
276
+ </div>
277
+ </div>
168
278
  </div>
169
279
  </div>
170
280
  )
@@ -2,14 +2,15 @@ import {ThemeConfig} from '../config'
2
2
  import {TMP_Theme} from '../types'
3
3
  import {buildColorTheme} from './colorTheme/buildColorTheme'
4
4
  import {renderColorTheme} from './colorTheme/renderColorTheme'
5
- import {defaultColorPalette} from './defaults/colorPalette'
6
5
 
7
6
  /** @internal */
8
7
  export function buildTheme(config?: ThemeConfig): TMP_Theme {
8
+ const color: TMP_Theme['color'] = {
9
+ light: buildColorTheme({scheme: 'light'}, config),
10
+ dark: buildColorTheme({scheme: 'dark'}, config),
11
+ }
12
+
9
13
  return {
10
- color: renderColorTheme(config?.color?.palette ?? defaultColorPalette, {
11
- light: buildColorTheme({scheme: 'light'}, config),
12
- dark: buildColorTheme({scheme: 'dark'}, config),
13
- }),
14
+ color: renderColorTheme(color, config),
14
15
  }
15
16
  }
@@ -13,7 +13,8 @@ import {
13
13
  TMP_StateColorTheme,
14
14
  } from '../../types'
15
15
  import {defaultColorTokens} from '../defaults/colorTokens'
16
- import {resolveColorTokenValue} from '../helpers'
16
+ import {ColorTokenContext, resolveColorTokenValue as _color} from '../helpers'
17
+ import {resolveColorTokens} from './resolveColorTokens'
17
18
 
18
19
  export function buildColorTheme(
19
20
  options: {scheme: 'light' | 'dark'},
@@ -21,13 +22,21 @@ export function buildColorTheme(
21
22
  ): TMP_ColorTheme {
22
23
  const {scheme} = options
23
24
 
25
+ const resolvedConfig = {
26
+ ...config,
27
+ color: {
28
+ ...config?.color,
29
+ tokens: resolveColorTokens(config?.color?.tokens ?? defaultColorTokens),
30
+ },
31
+ }
32
+
24
33
  return {
25
- transparent: buildBaseColorTheme({scheme, tone: 'transparent'}, config),
26
- default: buildBaseColorTheme({scheme, tone: 'default'}, config),
27
- primary: buildBaseColorTheme({scheme, tone: 'primary'}, config),
28
- positive: buildBaseColorTheme({scheme, tone: 'positive'}, config),
29
- caution: buildBaseColorTheme({scheme, tone: 'caution'}, config),
30
- critical: buildBaseColorTheme({scheme, tone: 'critical'}, config),
34
+ transparent: buildBaseColorTheme({scheme, tone: 'transparent'}, resolvedConfig),
35
+ default: buildBaseColorTheme({scheme, tone: 'default'}, resolvedConfig),
36
+ primary: buildBaseColorTheme({scheme, tone: 'primary'}, resolvedConfig),
37
+ positive: buildBaseColorTheme({scheme, tone: 'positive'}, resolvedConfig),
38
+ caution: buildBaseColorTheme({scheme, tone: 'caution'}, resolvedConfig),
39
+ critical: buildBaseColorTheme({scheme, tone: 'critical'}, resolvedConfig),
31
40
  }
32
41
  }
33
42
 
@@ -36,34 +45,30 @@ export function buildBaseColorTheme(
36
45
  config?: ThemeConfig,
37
46
  ): TMP_BaseColorTheme {
38
47
  const {scheme, tone} = options
39
- const tokens = config?.color?.tokens ?? defaultColorTokens
40
- const any = tokens?.['*']
41
- const toneTokens = tokens?.[tone]
42
- const hue = toneTokens?._hue || any?._hue || 'gray'
43
-
44
- const bg = resolveColorTokenValue({
45
- hue,
46
- scheme,
47
- value: toneTokens?.bg || any?.bg || ['gray/50', 'black'],
48
- })
49
-
50
- const _blend = toneTokens?._blend || any?._blend || ['screen', 'multiply']
48
+ const tokens = config?.color?.tokens?.[tone]
49
+ const hue = tokens?._hue || 'gray'
50
+ const context: ColorTokenContext = {hue, scheme}
51
+ const bg = _color(context, tokens?.bg || ['gray/50', 'black'])
52
+ const blendMode = tokens?._blend || ['screen', 'multiply']
51
53
 
52
54
  return {
53
- _blend: _blend[scheme === 'light' ? 0 : 1],
55
+ _blend: blendMode[scheme === 'light' ? 0 : 1],
54
56
  dark: scheme === 'dark',
55
57
  base: {
56
58
  bg,
57
- fg: resolveColorTokenValue({
58
- hue,
59
- scheme,
60
- value: toneTokens?.fg || any?.fg || ['black', 'white'],
61
- }),
62
- border: resolveColorTokenValue({
63
- hue,
64
- scheme,
65
- value: toneTokens?.border || any?.border || ['black', 'white'],
66
- }),
59
+ fg: _color(context, tokens?.fg || ['black', 'white']),
60
+ border: _color(context, tokens?.border || ['black', 'white']),
61
+ focusRing: _color(context, tokens?.focusRing || ['black', 'white']),
62
+ shadow: {
63
+ outline: _color(context, tokens?.shadow?.outline || ['500/0.2', '500/0.2']),
64
+ umbra: _color(context, tokens?.shadow?.umbra || ['500/0.2', '500/0.2']),
65
+ penumbra: _color(context, tokens?.shadow?.penumbra || ['500/0.2', '500/0.2']),
66
+ ambient: _color(context, tokens?.shadow?.ambient || ['500/0.2', '500/0.2']),
67
+ },
68
+ skeleton: {
69
+ from: _color(context, tokens?.skeleton?.from || ['500/0.2', '500/0.2']),
70
+ to: _color(context, tokens?.skeleton?.to || ['500/0.2', '500/0.2']),
71
+ },
67
72
  },
68
73
  button: buildButtonColorTheme({scheme}, config),
69
74
  }
@@ -131,92 +136,29 @@ function buildButtonStateColorTheme(
131
136
  config?: ThemeConfig,
132
137
  ): TMP_StateColorTheme {
133
138
  const {mode, tone, scheme, state} = options
134
- const tokens = config?.color?.tokens ?? defaultColorTokens
135
- const hue =
136
- tokens?.button?.[tone]?.[mode]?.[state]?._hue ||
137
- tokens?.button?.['*']?.[mode]?.[state]?._hue ||
138
- tokens?.button?.[tone]?._hue ||
139
- tokens?.[tone]?._hue ||
140
- 'gray'
141
- const spec3 = tokens?.button?.['*']?.[mode]?.['*']
142
- const spec2 = tokens?.button?.['*']?.[mode]?.[state]
143
- const spec1 = tokens?.button?.[tone]?.[mode]?.['*']
144
- const spec0 = tokens?.button?.[tone]?.[mode]?.[state]
145
-
146
- const _blend = spec0?._blend ||
147
- spec1?._blend ||
148
- spec2?._blend ||
149
- spec3?._blend || ['screen', 'multiply']
139
+ const tokens = config?.color?.tokens?.button?.[tone]?.[mode]?.[state]
140
+ const hue = tokens?._hue || 'gray'
141
+ const blendMode = tokens?._blend || ['screen', 'multiply']
142
+ const context: ColorTokenContext = {hue, scheme}
150
143
 
151
144
  return {
152
- _blend: _blend[scheme === 'light' ? 0 : 1],
153
- bg: resolveColorTokenValue({
154
- hue,
155
- scheme,
156
- value: spec0?.bg || spec1?.bg || spec2?.bg || spec3?.bg || ['500', '400'],
157
- }),
158
- bg2: resolveColorTokenValue({
159
- hue,
160
- scheme,
161
- value: spec0?.bg2 || spec1?.bg2 || spec2?.bg2 || spec3?.bg2 || ['500', '400'],
162
- }),
163
- fg: resolveColorTokenValue({
164
- hue,
165
- scheme,
166
- value: spec0?.fg || spec1?.fg || spec2?.fg || spec3?.fg || ['white', 'black'],
167
- }),
168
- border: resolveColorTokenValue({
169
- hue,
170
- scheme,
171
- value: spec0?.border || spec1?.border || spec2?.border || spec3?.border || ['500', '400'],
172
- }),
145
+ _blend: blendMode[scheme === 'light' ? 0 : 1],
146
+ bg: _color(context, tokens?.bg || ['500', '400']),
147
+ bg2: _color(context, tokens?.bg2 || ['500', '400']),
148
+ fg: _color(context, tokens?.fg || ['white', 'black']),
149
+ border: _color(context, tokens?.border || ['500', '400']),
173
150
  muted: {
174
- fg: resolveColorTokenValue({
175
- hue,
176
- scheme,
177
- value: spec0?.muted?.fg ||
178
- spec1?.muted?.fg ||
179
- spec2?.muted?.fg ||
180
- spec3?.muted?.fg || ['500', '400'],
181
- }),
151
+ fg: _color(context, tokens?.fg || ['500', '400']),
182
152
  },
183
153
  accent: {
184
- fg: resolveColorTokenValue({
185
- hue,
186
- scheme,
187
- value: spec0?.accent?.fg ||
188
- spec1?.accent?.fg ||
189
- spec2?.accent?.fg ||
190
- spec3?.accent?.fg || ['500', '400'],
191
- }),
154
+ fg: _color(context, tokens?.fg || ['500', '400']),
192
155
  },
193
156
  link: {
194
- fg: resolveColorTokenValue({
195
- hue,
196
- scheme,
197
- value: spec0?.link?.fg ||
198
- spec1?.link?.fg ||
199
- spec2?.link?.fg ||
200
- spec3?.link?.fg || ['500', '400'],
201
- }),
157
+ fg: _color(context, tokens?.fg || ['500', '400']),
202
158
  },
203
159
  code: {
204
- bg: resolveColorTokenValue({
205
- hue,
206
- scheme,
207
- value: spec0?.code?.bg ||
208
- spec1?.code?.bg ||
209
- spec2?.code?.bg ||
210
- spec3?.code?.bg || ['500', '400'],
211
- }),
212
- fg: resolveColorTokenValue({
213
- hue,
214
- scheme,
215
- value: spec0?.code?.fg ||
216
- spec1?.code?.fg ||
217
- spec2?.code?.fg ||
218
- spec3?.code?.fg || ['500', '400'],
219
- }),
160
+ bg: _color(context, tokens?.bg || ['500', '400']),
161
+ fg: _color(context, tokens?.fg || ['500', '400']),
220
162
  },
221
163
  }
222
164
  }
@@ -1,6 +1,6 @@
1
1
  import {ColorTint as ColorPaletteValue} from '@sanity/color'
2
2
  import {rgba} from '../../../lib/color-fns'
3
- import {ColorBlendModeValue, parseTokenValue, TMP_ColorPalette} from '../../config'
3
+ import {ColorBlendModeValue, parseTokenValue, ThemeConfig, TMP_ColorPalette} from '../../config'
4
4
  import {
5
5
  TMP_BaseColorTheme,
6
6
  TMP_ButtonColorTheme,
@@ -8,19 +8,17 @@ import {
8
8
  TMP_ButtonStatesColorTheme,
9
9
  TMP_ColorTheme,
10
10
  TMP_StateColorTheme,
11
+ TMP_Theme,
11
12
  } from '../../types'
13
+ import {defaultColorPalette} from '../defaults/colorPalette'
12
14
  import {multiply, screen} from '../helpers'
13
15
 
14
16
  export function renderColorTheme(
15
- colorPalette: TMP_ColorPalette,
16
- value: {
17
- light: TMP_ColorTheme
18
- dark: TMP_ColorTheme
19
- },
20
- ): {
21
- light: TMP_ColorTheme
22
- dark: TMP_ColorTheme
23
- } {
17
+ value: TMP_Theme['color'],
18
+ config?: ThemeConfig,
19
+ ): TMP_Theme['color'] {
20
+ const colorPalette = config?.color?.palette ?? defaultColorPalette
21
+
24
22
  return {
25
23
  light: renderColorScheme(colorPalette, value.light),
26
24
  dark: renderColorScheme(colorPalette, value.dark),
@@ -67,6 +65,22 @@ function renderColorBase(
67
65
  bg: nestedBg,
68
66
  fg: renderColorValue(colorPalette, nestedBg, value._blend, value.base.fg),
69
67
  border: renderColorValue(colorPalette, nestedBg, value._blend, value.base.border),
68
+ focusRing: renderColorValue(colorPalette, nestedBg, value._blend, value.base.focusRing),
69
+ shadow: {
70
+ outline: renderColorValue(colorPalette, nestedBg, value._blend, value.base.shadow.outline),
71
+ umbra: renderColorValue(colorPalette, nestedBg, value._blend, value.base.shadow.umbra),
72
+ penumbra: renderColorValue(
73
+ colorPalette,
74
+ nestedBg,
75
+ value._blend,
76
+ value.base.shadow.penumbra,
77
+ ),
78
+ ambient: renderColorValue(colorPalette, nestedBg, value._blend, value.base.shadow.ambient),
79
+ },
80
+ skeleton: {
81
+ from: renderColorValue(colorPalette, nestedBg, value._blend, value.base.skeleton.from),
82
+ to: renderColorValue(colorPalette, nestedBg, value._blend, value.base.skeleton.to),
83
+ },
70
84
  },
71
85
  button: renderButtonColorTheme(colorPalette, nestedBg, value._blend, value.button),
72
86
  }
@@ -135,43 +149,45 @@ function renderStateColorTheme(
135
149
  value.bg,
136
150
  )
137
151
 
138
- const bg2 = renderColorValue(colorPalette, bg, blendMode, value.bg2 || value.bg)
139
- const fg = renderColorValue(colorPalette, bg, blendMode, value.fg)
140
- const border = renderColorValue(colorPalette, bg, blendMode, value.border)
141
- const muted = {
142
- fg: renderColorValue(colorPalette, bg, blendMode, value.muted.fg),
143
- }
144
- const accent = {
145
- fg: renderColorValue(colorPalette, bg, blendMode, value.accent.fg),
146
- }
147
- const link = {
148
- fg: renderColorValue(colorPalette, bg, blendMode, value.link.fg),
149
- }
150
- const code = {
151
- bg: renderColorValue(colorPalette, bg, blendMode, value.code.bg),
152
- fg: renderColorValue(colorPalette, bg, blendMode, value.code.fg),
153
- }
154
-
155
152
  const blend = rootBlendMode === 'multiply' ? multiply : screen
156
153
 
154
+ const unmixed = {
155
+ bg2: renderColorValue(colorPalette, bg, blendMode, value.bg2 || value.bg),
156
+ fg: renderColorValue(colorPalette, bg, blendMode, value.fg),
157
+ border: renderColorValue(colorPalette, bg, blendMode, value.border),
158
+ muted: {
159
+ fg: renderColorValue(colorPalette, bg, blendMode, value.muted.fg),
160
+ },
161
+ accent: {
162
+ fg: renderColorValue(colorPalette, bg, blendMode, value.accent.fg),
163
+ },
164
+ link: {
165
+ fg: renderColorValue(colorPalette, bg, blendMode, value.link.fg),
166
+ },
167
+ code: {
168
+ bg: renderColorValue(colorPalette, bg, blendMode, value.code.bg),
169
+ fg: renderColorValue(colorPalette, bg, blendMode, value.code.fg),
170
+ },
171
+ }
172
+
157
173
  return {
158
174
  _blend: blendMode,
159
175
  bg: blend(baseBg, bg),
160
- bg2: blend(baseBg, bg2),
161
- fg: blend(baseBg, fg),
162
- border: blend(baseBg, border),
176
+ bg2: blend(baseBg, unmixed.bg2),
177
+ fg: blend(baseBg, unmixed.fg),
178
+ border: blend(baseBg, unmixed.border),
163
179
  muted: {
164
- fg: blend(baseBg, muted.fg),
180
+ fg: blend(baseBg, unmixed.muted.fg),
165
181
  },
166
182
  accent: {
167
- fg: blend(baseBg, accent.fg),
183
+ fg: blend(baseBg, unmixed.accent.fg),
168
184
  },
169
185
  link: {
170
- fg: blend(baseBg, link.fg),
186
+ fg: blend(baseBg, unmixed.link.fg),
171
187
  },
172
188
  code: {
173
- bg: blend(baseBg, code.bg),
174
- fg: blend(baseBg, code.fg),
189
+ bg: blend(baseBg, unmixed.code.bg),
190
+ fg: blend(baseBg, unmixed.code.fg),
175
191
  },
176
192
  }
177
193
  }