@sanity/ui 2.0.0-alpha.2 → 2.0.0-alpha.21

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 (96) hide show
  1. package/dist/index.cjs.mjs +28 -0
  2. package/dist/index.d.ts +476 -12
  3. package/dist/index.esm.js +1326 -524
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +1353 -523
  6. package/dist/index.js.map +1 -1
  7. package/package.json +6 -8
  8. package/src/components/autocomplete/autocomplete.tsx +6 -0
  9. package/src/components/dialog/constants.ts +4 -0
  10. package/src/components/dialog/dialog.tsx +79 -15
  11. package/src/components/hotkeys/hotkeys.tsx +2 -0
  12. package/src/components/menu/menu.tsx +2 -0
  13. package/src/components/menu/menuButton.tsx +2 -0
  14. package/src/components/menu/menuGroup.tsx +22 -23
  15. package/src/components/menu/menuItem.tsx +29 -35
  16. package/src/components/tab/tab.tsx +4 -1
  17. package/src/components/toast/toast.tsx +4 -0
  18. package/src/primitives/_selectable/style.ts +2 -1
  19. package/src/primitives/avatar/avatar.tsx +16 -9
  20. package/src/primitives/avatar/avatarCounter.tsx +3 -3
  21. package/src/primitives/avatar/styles.ts +1 -1
  22. package/src/primitives/badge/badge.tsx +7 -3
  23. package/src/primitives/box/box.tsx +3 -0
  24. package/src/primitives/button/__workshop__/sanityUploadButton.tsx +2 -1
  25. package/src/primitives/button/button.tsx +7 -3
  26. package/src/primitives/button/styles.ts +9 -2
  27. package/src/primitives/card/card.tsx +4 -0
  28. package/src/primitives/card/styles.ts +2 -0
  29. package/src/primitives/checkbox/checkbox.tsx +2 -0
  30. package/src/primitives/code/code.tsx +1 -0
  31. package/src/primitives/container/container.tsx +2 -0
  32. package/src/primitives/flex/flex.tsx +2 -0
  33. package/src/primitives/grid/grid.tsx +2 -0
  34. package/src/primitives/heading/heading.tsx +2 -0
  35. package/src/primitives/inline/inline.tsx +3 -0
  36. package/src/primitives/kbd/kbd.tsx +2 -0
  37. package/src/primitives/label/label.tsx +2 -0
  38. package/src/primitives/popover/popover.tsx +6 -1
  39. package/src/primitives/radio/radio.tsx +2 -0
  40. package/src/primitives/select/select.tsx +2 -0
  41. package/src/primitives/select/styles.ts +2 -0
  42. package/src/primitives/spinner/spinner.tsx +2 -0
  43. package/src/primitives/stack/stack.tsx +2 -0
  44. package/src/primitives/switch/switch.tsx +4 -0
  45. package/src/primitives/text/text.tsx +3 -0
  46. package/src/primitives/textArea/textArea.tsx +4 -1
  47. package/src/primitives/textInput/textInput.tsx +10 -1
  48. package/src/primitives/tooltip/__workshop__/customPortal.tsx +99 -0
  49. package/src/primitives/tooltip/__workshop__/index.ts +15 -0
  50. package/src/primitives/tooltip/__workshop__/overflowingBoundary.tsx +73 -0
  51. package/src/primitives/tooltip/__workshop__/resizableBoundary.tsx +85 -0
  52. package/src/primitives/tooltip/constants.ts +1 -0
  53. package/src/primitives/tooltip/tooltip.test.tsx +192 -0
  54. package/src/primitives/tooltip/tooltip.tsx +109 -33
  55. package/src/primitives/types.ts +4 -0
  56. package/src/styles/input/textInputStyle.ts +11 -6
  57. package/src/theme/_internal/__workshop__/build/story.tsx +288 -0
  58. package/src/theme/_internal/__workshop__/build/theme.ts +3 -0
  59. package/src/theme/_internal/__workshop__/index.ts +14 -0
  60. package/src/theme/_internal/build/buildTheme.test.ts +78 -0
  61. package/src/theme/_internal/build/buildTheme.ts +16 -0
  62. package/src/theme/_internal/build/colorTheme/buildColorTheme.test.ts +185 -0
  63. package/src/theme/_internal/build/colorTheme/buildColorTheme.ts +164 -0
  64. package/src/theme/_internal/build/colorTheme/renderColorTheme.ts +242 -0
  65. package/src/theme/_internal/build/colorTheme/resolveColorTokens.ts +121 -0
  66. package/src/theme/_internal/build/defaults/colorPalette.ts +8 -0
  67. package/src/theme/_internal/build/defaults/colorTokens.ts +147 -0
  68. package/src/theme/_internal/build/helpers.ts +65 -0
  69. package/src/theme/_internal/build/index.ts +1 -0
  70. package/src/theme/_internal/config/helpers.ts +47 -0
  71. package/src/theme/_internal/config/index.ts +3 -0
  72. package/src/theme/_internal/config/token/index.ts +2 -0
  73. package/src/theme/_internal/config/token/parseTokenKey.test.ts +72 -0
  74. package/src/theme/_internal/config/token/parseTokenKey.ts +88 -0
  75. package/src/theme/_internal/config/token/parseTokenValue.test.ts +45 -0
  76. package/src/theme/_internal/config/token/parseTokenValue.ts +123 -0
  77. package/src/theme/_internal/config/types.ts +137 -0
  78. package/src/theme/_internal/constants.ts +48 -0
  79. package/src/theme/_internal/helpers.ts +19 -0
  80. package/src/theme/_internal/index.ts +5 -0
  81. package/src/theme/_internal/types.ts +91 -0
  82. package/src/theme/index.ts +1 -0
  83. package/src/theme/lib/color-fns/blend/multiply.ts +2 -2
  84. package/src/theme/lib/color-fns/blend/screen.ts +2 -2
  85. package/src/theme/lib/color-fns/convert.ts +15 -1
  86. package/src/theme/lib/color-fns/parse.ts +7 -3
  87. package/src/theme/lib/color-fns/types.ts +11 -0
  88. package/src/theme/lib/theme/avatar.ts +2 -0
  89. package/src/theme/lib/theme/color/_legacy/createColorTheme.ts +7 -0
  90. package/src/theme/lib/theme/color/_legacy/index.ts +1 -0
  91. package/src/theme/lib/theme/color/_legacy/legacyColor.ts +3997 -0
  92. package/src/theme/studioTheme/color.ts +98 -82
  93. package/src/theme/studioTheme/helpers.ts +15 -1
  94. package/src/theme/studioTheme/theme.ts +5 -5
  95. package/src/theme/studioTheme/tints.ts +244 -84
  96. package/src/types/button.ts +5 -0
@@ -0,0 +1,288 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+
3
+ import {ReactElement} from 'react'
4
+ import styled from 'styled-components'
5
+ import {COLOR_BASE_TONES, COLOR_BUTTON_MODES, COLOR_STATE_TONES} from '../../constants'
6
+ import {ColorBaseTone, TMP_Theme} from '../../types'
7
+ import {theme} from './theme'
8
+
9
+ const Root = styled.div`
10
+ background: #000;
11
+ font-family:
12
+ system-ui,
13
+ -apple-system,
14
+ BlinkMacSystemFont,
15
+ 'Segoe UI',
16
+ Roboto,
17
+ Oxygen,
18
+ Ubuntu,
19
+ Cantarell,
20
+ 'Open Sans',
21
+ 'Helvetica Neue',
22
+ sans-serif;
23
+ font-size: 13px;
24
+ line-height: 9px;
25
+ margin: 0;
26
+ -webkit-font-smoothing: antialiased;
27
+ user-select: none;
28
+
29
+ pre {
30
+ font: inherit;
31
+ font-family: 'SF Mono', Menlo, monospace;
32
+ margin: 0;
33
+ padding: 0;
34
+ }
35
+
36
+ .button {
37
+ background-color: var(--bg);
38
+ color: var(--fg);
39
+ box-shadow:
40
+ inset 0 0 0 1px var(--border),
41
+ 0 1px 0 0 color-mix(in srgb, var(--border), transparent 75%);
42
+ text-align: center;
43
+ border-radius: 3px;
44
+ font-weight: 500;
45
+ cursor: default;
46
+ transition: box-shadow 50ms ease-in-out;
47
+
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);
53
+ }
54
+
55
+ .button:hover {
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);
75
+ }
76
+
77
+ .button:active {
78
+ background-color: var(--button-pressed-bg);
79
+ color: var(--button-pressed-fg);
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);
84
+ }
85
+
86
+ .button.selected {
87
+ background-color: var(--button-selected-bg);
88
+ color: var(--button-selected-fg);
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);
93
+ }
94
+
95
+ .button.disabled {
96
+ background-color: var(--button-disabled-bg);
97
+ color: var(--button-disabled-fg);
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);
102
+ }
103
+ `
104
+
105
+ export default function BuildStory(): ReactElement {
106
+ return (
107
+ <Root>
108
+ <div style={{display: 'flex'}}>
109
+ <div style={{flex: 1}}>
110
+ {COLOR_BASE_TONES.map((baseTone) => (
111
+ <BaseTonePreview baseTone={baseTone} key={baseTone} scheme="light" theme={theme} />
112
+ ))}
113
+ </div>
114
+ <div style={{flex: 1}}>
115
+ {COLOR_BASE_TONES.map((baseTone) => (
116
+ <BaseTonePreview baseTone={baseTone} key={baseTone} scheme="dark" theme={theme} />
117
+ ))}
118
+ </div>
119
+ </div>
120
+ </Root>
121
+ )
122
+ }
123
+
124
+ function BaseTonePreview(props: {
125
+ baseTone: ColorBaseTone
126
+ scheme: 'light' | 'dark'
127
+ theme: TMP_Theme
128
+ }) {
129
+ const {baseTone, scheme, theme} = props
130
+ const color = theme.color[scheme]
131
+
132
+ return (
133
+ <div
134
+ style={
135
+ {
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,
150
+ } as any
151
+ }
152
+ >
153
+ <div style={{maxWidth: 320, margin: 'auto', padding: '20px 0'}}>
154
+ <pre style={{padding: 12}}>
155
+ color/{scheme}/{baseTone}
156
+ </pre>
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'}}>
174
+ {COLOR_BUTTON_MODES.map((mode) => (
175
+ <div key={mode} style={{display: 'flex', flexDirection: 'column'}}>
176
+ {COLOR_STATE_TONES.map((tone) => {
177
+ const button = color[baseTone].button[tone][mode]
178
+
179
+ return (
180
+ <div
181
+ key={tone}
182
+ style={
183
+ {
184
+ border: '1px solid var(--border)',
185
+ padding: 4,
186
+ display: 'flex',
187
+ flexDirection: 'column',
188
+ marginTop: -1,
189
+
190
+ '--button-enabled-bg': button.enabled.bg,
191
+ '--button-enabled-bg2': button.enabled.bg2,
192
+ '--button-enabled-fg': button.enabled.fg,
193
+ '--button-enabled-border': button.enabled.border,
194
+ '--button-enabled-muted-fg': button.enabled.muted.fg,
195
+
196
+ '--button-hovered-bg': button.hovered.bg,
197
+ '--button-hovered-bg2': button.hovered.bg2,
198
+ '--button-hovered-fg': button.hovered.fg,
199
+ '--button-hovered-border': button.hovered.border,
200
+ '--button-hovered-muted-fg': button.hovered.muted.fg,
201
+
202
+ '--button-pressed-bg': button.pressed.bg,
203
+ '--button-pressed-bg2': button.pressed.bg2,
204
+ '--button-pressed-fg': button.pressed.fg,
205
+ '--button-pressed-border': button.pressed.border,
206
+ '--button-pressed-muted-fg': button.pressed.muted.fg,
207
+
208
+ '--button-selected-bg': button.selected.bg,
209
+ '--button-selected-bg2': button.selected.bg2,
210
+ '--button-selected-fg': button.selected.fg,
211
+ '--button-selected-border': button.selected.border,
212
+ '--button-selected-muted-fg': button.selected.muted.fg,
213
+
214
+ '--button-disabled-bg': button.disabled.bg,
215
+ '--button-disabled-bg2': button.disabled.bg2,
216
+ '--button-disabled-fg': button.disabled.fg,
217
+ '--button-disabled-border': button.disabled.border,
218
+ '--button-disabled-muted-fg': button.disabled.muted.fg,
219
+ } as any
220
+ }
221
+ >
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>
278
+ </div>
279
+ </div>
280
+ )
281
+ })}
282
+ </div>
283
+ ))}
284
+ </div>
285
+ </div>
286
+ </div>
287
+ )
288
+ }
@@ -0,0 +1,3 @@
1
+ import {buildTheme} from '../../build'
2
+
3
+ export const theme = buildTheme()
@@ -0,0 +1,14 @@
1
+ import {defineScope} from '@sanity/ui-workshop'
2
+ import {lazy} from 'react'
3
+
4
+ export default defineScope({
5
+ name: '_internal/theme',
6
+ title: 'Theming',
7
+ stories: [
8
+ {
9
+ name: 'build',
10
+ title: 'Build theme',
11
+ component: lazy(() => import('./build/story')),
12
+ },
13
+ ],
14
+ })
@@ -0,0 +1,78 @@
1
+ import {buildTheme} from './buildTheme'
2
+
3
+ test('build theme', () => {
4
+ const {color} = buildTheme({
5
+ color: {
6
+ tokens: {
7
+ default: {
8
+ bg: ['white/0', 'black/0'],
9
+ },
10
+ button: {
11
+ default: {
12
+ ghost: {
13
+ '*': {
14
+ border: ['white/0', 'black/0'],
15
+ },
16
+ },
17
+ },
18
+ },
19
+ },
20
+ },
21
+ })
22
+
23
+ expect({
24
+ light: {
25
+ bg: color.light.default.base.bg,
26
+ fg: color.light.default.base.fg,
27
+ default: {
28
+ button: {
29
+ ghost: {
30
+ enabled: {
31
+ border: color.light.default.button.default.ghost.enabled.border,
32
+ },
33
+ },
34
+ },
35
+ },
36
+ },
37
+ dark: {
38
+ bg: color.dark.default.base.bg,
39
+ fg: color.dark.default.base.fg,
40
+ default: {
41
+ button: {
42
+ ghost: {
43
+ enabled: {
44
+ border: color.dark.default.button.default.ghost.enabled.border,
45
+ },
46
+ },
47
+ },
48
+ },
49
+ },
50
+ }).toEqual({
51
+ light: {
52
+ bg: 'rgba(255,255,255,0)',
53
+ fg: '#ffffff',
54
+ default: {
55
+ button: {
56
+ ghost: {
57
+ enabled: {
58
+ border: 'rgba(255,255,255,0)',
59
+ },
60
+ },
61
+ },
62
+ },
63
+ },
64
+ dark: {
65
+ bg: 'rgba(0,0,0,0)',
66
+ fg: '#000000',
67
+ default: {
68
+ button: {
69
+ ghost: {
70
+ enabled: {
71
+ border: 'rgba(0,0,0,0)',
72
+ },
73
+ },
74
+ },
75
+ },
76
+ },
77
+ })
78
+ })
@@ -0,0 +1,16 @@
1
+ import {ThemeConfig} from '../config'
2
+ import {TMP_Theme} from '../types'
3
+ import {buildColorTheme} from './colorTheme/buildColorTheme'
4
+ import {renderColorTheme} from './colorTheme/renderColorTheme'
5
+
6
+ /** @internal */
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
+
13
+ return {
14
+ color: renderColorTheme(color, config),
15
+ }
16
+ }
@@ -0,0 +1,185 @@
1
+ import {ColorThemeConfig} from '../../config'
2
+ import {buildColorTheme} from './buildColorTheme'
3
+
4
+ test('buildColorTheme: base', () => {
5
+ const colorConfig: ColorThemeConfig = {
6
+ tokens: {
7
+ '*': {
8
+ bg: ['50', '900'],
9
+ fg: ['800', '200'],
10
+ },
11
+ transparent: {
12
+ bg: ['50', 'black'],
13
+ },
14
+ default: {
15
+ bg: ['white', '950'],
16
+ fg: ['black', '200'],
17
+ },
18
+ primary: {
19
+ _hue: 'purple',
20
+ },
21
+ positive: {
22
+ _hue: 'cyan',
23
+ },
24
+ caution: {
25
+ _hue: 'yellow',
26
+ },
27
+ critical: {
28
+ _hue: 'red',
29
+ },
30
+ },
31
+ }
32
+
33
+ const light = buildColorTheme({scheme: 'light'}, {color: colorConfig})
34
+ const dark = buildColorTheme({scheme: 'dark'}, {color: colorConfig})
35
+
36
+ expect({
37
+ light: {
38
+ transparent: {
39
+ bg: light.transparent.base.bg,
40
+ fg: light.transparent.base.fg,
41
+ },
42
+ default: {
43
+ bg: light.default.base.bg,
44
+ fg: light.default.base.fg,
45
+ },
46
+ primary: {
47
+ bg: light.primary.base.bg,
48
+ fg: light.primary.base.fg,
49
+ },
50
+ },
51
+ dark: {
52
+ transparent: {
53
+ bg: dark.transparent.base.bg,
54
+ fg: dark.transparent.base.fg,
55
+ },
56
+ default: {
57
+ bg: dark.default.base.bg,
58
+ fg: dark.default.base.fg,
59
+ },
60
+ primary: {
61
+ bg: dark.primary.base.bg,
62
+ fg: dark.primary.base.fg,
63
+ },
64
+ },
65
+ }).toEqual({
66
+ light: {
67
+ transparent: {
68
+ bg: 'gray/50',
69
+ fg: 'gray/800',
70
+ },
71
+ default: {
72
+ bg: 'white',
73
+ fg: 'black',
74
+ },
75
+ primary: {
76
+ bg: 'purple/50',
77
+ fg: 'purple/800',
78
+ },
79
+ },
80
+ dark: {
81
+ transparent: {
82
+ bg: 'black',
83
+ fg: 'gray/200',
84
+ },
85
+ default: {
86
+ bg: 'gray/950',
87
+ fg: 'gray/200',
88
+ },
89
+ primary: {
90
+ bg: 'purple/900',
91
+ fg: 'purple/200',
92
+ },
93
+ },
94
+ })
95
+ })
96
+
97
+ test('buildColorTheme: button', () => {
98
+ const colorConfig: ColorThemeConfig = {
99
+ tokens: {
100
+ '*': {
101
+ bg: ['50', '900'],
102
+ fg: ['800', '200'],
103
+ },
104
+ transparent: {
105
+ bg: ['50', 'black'],
106
+ },
107
+ default: {
108
+ bg: ['white', '950'],
109
+ fg: ['black', '200'],
110
+ },
111
+ primary: {
112
+ _hue: 'purple',
113
+ },
114
+ positive: {
115
+ _hue: 'cyan',
116
+ },
117
+ caution: {
118
+ _hue: 'yellow',
119
+ },
120
+ critical: {
121
+ _hue: 'red',
122
+ },
123
+ button: {
124
+ '*': {
125
+ default: {
126
+ '*': {
127
+ bg: ['500', '400'],
128
+ fg: ['white', 'black'],
129
+ },
130
+ hovered: {
131
+ bg: ['600', '300'],
132
+ },
133
+ },
134
+ },
135
+ },
136
+ },
137
+ }
138
+
139
+ const light = buildColorTheme({scheme: 'light'}, {color: colorConfig})
140
+ const dark = buildColorTheme({scheme: 'dark'}, {color: colorConfig})
141
+
142
+ expect({
143
+ light: {
144
+ enabled: {
145
+ bg: light.default.button.primary.default.enabled.bg,
146
+ fg: light.default.button.primary.default.enabled.fg,
147
+ },
148
+ hovered: {
149
+ bg: light.default.button.primary.default.hovered.bg,
150
+ fg: light.default.button.primary.default.hovered.fg,
151
+ },
152
+ },
153
+ dark: {
154
+ enabled: {
155
+ bg: dark.default.button.primary.default.enabled.bg,
156
+ fg: dark.default.button.primary.default.enabled.fg,
157
+ },
158
+ hovered: {
159
+ bg: dark.default.button.primary.default.hovered.bg,
160
+ fg: dark.default.button.primary.default.hovered.fg,
161
+ },
162
+ },
163
+ }).toEqual({
164
+ light: {
165
+ enabled: {
166
+ bg: 'purple/500',
167
+ fg: 'white',
168
+ },
169
+ hovered: {
170
+ bg: 'purple/600',
171
+ fg: 'white',
172
+ },
173
+ },
174
+ dark: {
175
+ enabled: {
176
+ bg: 'purple/400',
177
+ fg: 'black',
178
+ },
179
+ hovered: {
180
+ bg: 'purple/300',
181
+ fg: 'black',
182
+ },
183
+ },
184
+ })
185
+ })