@sanity/ui 2.0.0-alpha.10 → 2.0.0-alpha.11

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 (107) hide show
  1. package/dist/index.cjs.mjs +0 -2
  2. package/dist/index.d.ts +404 -281
  3. package/dist/index.esm.js +2305 -5015
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +2332 -5044
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/components/dialog/dialog.tsx +3 -3
  9. package/src/components/dialog/styles.ts +4 -3
  10. package/src/components/menu/__workshop__/closableMenuButton.tsx +2 -2
  11. package/src/components/menu/menuDivider.ts +1 -2
  12. package/src/components/menu/menuGroup.tsx +2 -2
  13. package/src/components/menu/menuItem.tsx +4 -4
  14. package/src/components/skeleton/styles.ts +7 -8
  15. package/src/components/tree/style.ts +20 -19
  16. package/src/primitives/_selectable/style.ts +21 -25
  17. package/src/primitives/avatar/avatar.tsx +3 -8
  18. package/src/primitives/avatar/avatarCounter.tsx +4 -5
  19. package/src/primitives/avatar/styles.ts +7 -5
  20. package/src/primitives/avatar/types.ts +0 -14
  21. package/src/primitives/badge/styles.ts +8 -7
  22. package/src/primitives/box/__workshop__/responsive.tsx +2 -2
  23. package/src/primitives/button/button.tsx +2 -2
  24. package/src/primitives/button/styles.ts +16 -82
  25. package/src/primitives/card/__workshop__/selected.tsx +9 -8
  26. package/src/primitives/card/card.tsx +8 -43
  27. package/src/primitives/card/styles.ts +22 -30
  28. package/src/primitives/card/types.ts +1 -3
  29. package/src/primitives/checkbox/styles.ts +20 -20
  30. package/src/primitives/code/code.tsx +3 -15
  31. package/src/primitives/code/styles.ts +42 -51
  32. package/src/primitives/heading/styles.ts +5 -6
  33. package/src/primitives/kbd/kbd.tsx +1 -2
  34. package/src/primitives/label/styles.ts +2 -3
  35. package/src/primitives/popover/popoverArrow.tsx +2 -3
  36. package/src/primitives/popover/popoverCard.tsx +2 -6
  37. package/src/primitives/radio/styles.ts +15 -15
  38. package/src/primitives/select/styles.ts +22 -20
  39. package/src/primitives/switch/styles.ts +13 -13
  40. package/src/primitives/text/__workshop__/colored.tsx +11 -10
  41. package/src/primitives/text/styles.ts +9 -10
  42. package/src/primitives/textArea/textArea.tsx +11 -7
  43. package/src/primitives/textInput/textInput.tsx +12 -12
  44. package/src/primitives/tooltip/__workshop__/props.tsx +3 -20
  45. package/src/primitives/tooltip/tooltipArrow.tsx +2 -3
  46. package/src/styles/border/borderStyle.ts +1 -2
  47. package/src/styles/colorVars/colorVarsStyle.ts +32 -73
  48. package/src/styles/focusRing/index.ts +4 -6
  49. package/src/styles/input/textInputStyle.ts +93 -76
  50. package/src/styles/margin/marginsStyle.test.ts +2 -1
  51. package/src/styles/padding/paddingStyle.test.ts +2 -1
  52. package/src/styles/shadow/shadowStyle.ts +5 -5
  53. package/src/theme/__workshop__/canvas.tsx +395 -0
  54. package/src/theme/__workshop__/color.tsx +2 -2
  55. package/src/theme/__workshop__/index.ts +5 -0
  56. package/src/theme/lib/theme/color/_generic/index.ts +1 -0
  57. package/src/theme/lib/theme/color/_generic/types.ts +30 -0
  58. package/src/theme/lib/theme/color/base/index.ts +1 -0
  59. package/src/theme/lib/theme/color/base/types.ts +19 -0
  60. package/src/theme/lib/theme/color/button/createButtonModes.ts +20 -0
  61. package/src/theme/lib/theme/color/button/createButtonTones.ts +52 -0
  62. package/src/theme/lib/theme/color/button/index.ts +1 -0
  63. package/src/theme/lib/theme/color/button/types.ts +44 -0
  64. package/src/theme/lib/theme/color/card/createCardStates.ts +58 -0
  65. package/src/theme/lib/theme/color/card/index.ts +1 -0
  66. package/src/theme/lib/theme/color/card/types.ts +18 -0
  67. package/src/theme/lib/theme/color/color.test.ts +63 -0
  68. package/src/theme/lib/theme/color/defaults.ts +390 -0
  69. package/src/theme/lib/theme/color/factory.ts +138 -0
  70. package/src/theme/lib/theme/color/index.ts +12 -3
  71. package/src/theme/lib/theme/color/input/createInputModes.ts +84 -0
  72. package/src/theme/lib/theme/color/input/index.ts +1 -0
  73. package/src/theme/lib/theme/color/input/types.ts +28 -0
  74. package/src/theme/lib/theme/color/muted/createMuted.ts +56 -0
  75. package/src/theme/lib/theme/color/muted/index.ts +1 -0
  76. package/src/theme/lib/theme/color/muted/types.ts +24 -0
  77. package/src/theme/lib/theme/color/selectable/createSelectableTones.ts +73 -0
  78. package/src/theme/lib/theme/color/selectable/index.ts +1 -0
  79. package/src/theme/lib/theme/color/selectable/types.ts +29 -0
  80. package/src/theme/lib/theme/color/solid/createSolidTones.ts +56 -0
  81. package/src/theme/lib/theme/color/solid/index.ts +1 -0
  82. package/src/theme/lib/theme/color/solid/types.ts +24 -0
  83. package/src/theme/lib/theme/color/spot/createSpot.ts +21 -0
  84. package/src/theme/lib/theme/color/spot/index.ts +1 -0
  85. package/src/theme/lib/theme/color/spot/types.ts +28 -0
  86. package/src/theme/lib/theme/color/syntax/index.ts +1 -0
  87. package/src/theme/lib/theme/color/syntax/types.ts +41 -0
  88. package/src/theme/lib/theme/color/types.ts +37 -6
  89. package/src/theme/studioTheme/color.ts +661 -6
  90. package/src/theme/studioTheme/theme.ts +2 -8
  91. package/src/theme/{lib/theme/color/cssVariables → studioTheme}/tints.ts +2 -2
  92. package/src/theme/themeColorProvider.tsx +0 -2
  93. package/src/theme/themeProvider.tsx +8 -28
  94. package/src/theme/types.ts +4 -2
  95. package/src/utils/elementQuery/__workshop__/customMedia.tsx +3 -4
  96. package/src/primitives/avatar/spotColors.ts +0 -53
  97. package/src/theme/lib/theme/color/cssVariables/cardVariables.ts +0 -88
  98. package/src/theme/lib/theme/color/cssVariables/createCssVars.ts +0 -31
  99. package/src/theme/lib/theme/color/cssVariables/cssVars.test.ts +0 -262
  100. package/src/theme/lib/theme/color/cssVariables/index.ts +0 -1
  101. package/src/theme/lib/theme/color/cssVariables/tones.ts +0 -67
  102. package/src/theme/lib/theme/color/cssVariables/utils.test.ts +0 -15
  103. package/src/theme/lib/theme/color/cssVariables/utils.ts +0 -9
  104. package/src/theme/toneContext/toneContext.ts +0 -12
  105. package/src/theme/toneContext/toneProvider.tsx +0 -31
  106. package/src/theme/toneContext/types.ts +0 -10
  107. package/src/theme/toneContext/useToneContext.tsx +0 -26
@@ -1,11 +1,666 @@
1
- import {ColorTints, hues} from '@sanity/color'
2
- import {ThemeColorName} from '../lib/theme'
1
+ import {black, ColorTints, hues, white} from '@sanity/color'
2
+ import {rgba} from '../lib/color-fns'
3
+ import {createColorTheme} from '../lib/theme'
4
+ import {multiply, screen} from './helpers'
3
5
 
4
- export const tones: Record<ThemeColorName, ColorTints> = {
6
+ export const tones: {[key: string]: ColorTints} = {
5
7
  default: hues.gray,
6
8
  transparent: hues.gray,
7
- primary: hues.gray,
8
- positive: hues.cyan,
9
+ primary: hues.blue,
10
+ positive: hues.green,
9
11
  caution: hues.yellow,
10
12
  critical: hues.red,
11
- } as const
13
+ }
14
+
15
+ const NEUTRAL_TONES = ['default', 'transparent']
16
+
17
+ export const color = createColorTheme({
18
+ base: ({dark, name}) => {
19
+ if (name === 'default') {
20
+ const tints = hues.gray
21
+ const skeletonFrom = dark ? tints[900].hex : tints[100].hex
22
+
23
+ return {
24
+ fg: dark ? white.hex : black.hex,
25
+ bg: dark ? black.hex : white.hex,
26
+ border: tints[dark ? 800 : 200].hex,
27
+ focusRing: hues.blue[dark ? 500 : 500].hex,
28
+ shadow: {
29
+ outline: rgba(tints[500].hex, 0.4),
30
+ umbra: dark ? rgba(tints[950].hex, 0.4) : rgba(tints[500].hex, 0.2),
31
+ penumbra: dark ? rgba(tints[950].hex, 0.28) : rgba(tints[500].hex, 0.14),
32
+ ambient: dark ? rgba(tints[950].hex, 0.24) : rgba(tints[500].hex, 0.12),
33
+ },
34
+ skeleton: {
35
+ from: skeletonFrom,
36
+ to: rgba(skeletonFrom, 0.5),
37
+ },
38
+ }
39
+ }
40
+
41
+ if (name === 'transparent') {
42
+ const tints = tones.default
43
+ const skeletonFrom = tints[dark ? 800 : 200].hex
44
+
45
+ return {
46
+ fg: tints[dark ? 100 : 900].hex,
47
+ bg: tints[dark ? 950 : 50].hex,
48
+ border: tints[dark ? 800 : 300].hex,
49
+ focusRing: hues.blue[500].hex,
50
+ shadow: {
51
+ outline: rgba(tints[500].hex, 0.4),
52
+ umbra: dark ? rgba(tints[900].hex, 0.4) : rgba(tints[500].hex, 0.2),
53
+ penumbra: dark ? rgba(tints[900].hex, 0.28) : rgba(tints[500].hex, 0.14),
54
+ ambient: dark ? rgba(tints[900].hex, 0.24) : rgba(tints[500].hex, 0.12),
55
+ },
56
+ skeleton: {
57
+ from: skeletonFrom,
58
+ to: rgba(skeletonFrom, 0.5),
59
+ },
60
+ }
61
+ }
62
+
63
+ const tints = tones[name] || tones.default
64
+ const skeletonFrom = tints[dark ? 800 : 200].hex
65
+
66
+ return {
67
+ fg: tints[dark ? 100 : 900].hex,
68
+ bg: tints[dark ? 950 : 50].hex,
69
+ border: tints[dark ? 800 : 200].hex,
70
+ focusRing: tints[500].hex,
71
+ shadow: {
72
+ outline: rgba(tints[500].hex, 0.4),
73
+ umbra: dark ? rgba(tints[900].hex, 0.4) : rgba(tints[500].hex, 0.2),
74
+ penumbra: dark ? rgba(tints[900].hex, 0.28) : rgba(tints[500].hex, 0.14),
75
+ ambient: dark ? rgba(tints[900].hex, 0.24) : rgba(tints[500].hex, 0.12),
76
+ },
77
+ skeleton: {
78
+ from: skeletonFrom,
79
+ to: rgba(skeletonFrom, 0.5),
80
+ },
81
+ }
82
+ },
83
+
84
+ solid: ({base, dark, name, state, tone}) => {
85
+ const mix = dark ? screen : multiply
86
+ const mix2 = dark ? multiply : screen
87
+ const defaultTints = tones[name] || tones.default
88
+ const isNeutral = NEUTRAL_TONES.includes(name) && NEUTRAL_TONES.includes(tone)
89
+
90
+ let tints = tones[tone === 'default' ? name : tone] || defaultTints
91
+
92
+ if (state === 'disabled') {
93
+ tints = defaultTints
94
+
95
+ const bg = mix(base.bg, tints[dark ? 800 : 200].hex)
96
+ const skeletonFrom = mix2(bg, tints[dark ? 200 : 800].hex)
97
+
98
+ return {
99
+ bg,
100
+ bg2: mix2(bg, tints[dark ? 50 : 950].hex),
101
+ border: mix(base.bg, tints[dark ? 800 : 200].hex),
102
+ iconColor: '', // Add color
103
+
104
+ fg: mix(base.bg, dark ? black.hex : white.hex),
105
+ muted: {
106
+ fg: mix(base.bg, tints[dark ? 950 : 50].hex),
107
+ },
108
+ accent: {
109
+ fg: mix(base.bg, tints[dark ? 950 : 50].hex),
110
+ },
111
+ link: {
112
+ fg: mix(base.bg, tints[dark ? 950 : 50].hex),
113
+ },
114
+ code: {
115
+ bg,
116
+ fg: mix(base.bg, tints[dark ? 950 : 50].hex),
117
+ },
118
+ skeleton: {
119
+ from: skeletonFrom,
120
+ to: rgba(skeletonFrom, 0.5),
121
+ },
122
+ }
123
+ }
124
+
125
+ if (state === 'hovered') {
126
+ const bg = mix(base.bg, tints[dark ? 300 : 600].hex)
127
+ const skeletonFrom = mix2(bg, tints[dark ? 200 : 800].hex)
128
+
129
+ return {
130
+ bg,
131
+ bg2: mix2(bg, tints[dark ? 50 : 950].hex),
132
+ border: mix(base.bg, tints[dark ? 300 : 600].hex),
133
+ fg: mix(base.bg, dark ? black.hex : white.hex),
134
+ iconColor: '', // Add color
135
+
136
+ muted: {
137
+ fg: mix(base.bg, tints[dark ? 800 : 200].hex),
138
+ },
139
+ accent: {
140
+ fg: mix2(bg, hues.red[dark ? 800 : 200].hex),
141
+ },
142
+ link: {
143
+ fg: mix2(bg, hues.blue[dark ? 800 : 200].hex),
144
+ },
145
+ code: {
146
+ bg: mix(bg, tints[dark ? 950 : 50].hex),
147
+ fg: mix(base.bg, tints[dark ? 800 : 200].hex),
148
+ },
149
+ skeleton: {
150
+ from: skeletonFrom,
151
+ to: rgba(skeletonFrom, 0.5),
152
+ },
153
+ }
154
+ }
155
+
156
+ if (state === 'pressed') {
157
+ const bg = mix(base.bg, tints[dark ? 200 : 800].hex)
158
+ const skeletonFrom = mix2(bg, tints[dark ? 200 : 800].hex)
159
+
160
+ return {
161
+ bg: mix(base.bg, tints[dark ? 200 : 800].hex),
162
+ bg2: mix2(bg, tints[dark ? 50 : 950].hex),
163
+ iconColor: '', // Add color
164
+
165
+ border: mix(base.bg, tints[dark ? 200 : 800].hex),
166
+ fg: mix(base.bg, dark ? black.hex : white.hex),
167
+ muted: {
168
+ fg: mix(base.bg, tints[dark ? 800 : 200].hex),
169
+ },
170
+ accent: {
171
+ fg: mix2(bg, hues.red[dark ? 800 : 200].hex),
172
+ },
173
+ link: {
174
+ fg: mix2(bg, hues.blue[dark ? 800 : 200].hex),
175
+ },
176
+ code: {
177
+ bg: mix(bg, tints[dark ? 950 : 50].hex),
178
+ fg: mix(base.bg, tints[dark ? 800 : 200].hex),
179
+ },
180
+ skeleton: {
181
+ from: skeletonFrom,
182
+ to: rgba(skeletonFrom, 0.5),
183
+ },
184
+ }
185
+ }
186
+
187
+ if (state === 'selected') {
188
+ if (isNeutral) {
189
+ tints = tones.primary
190
+ }
191
+
192
+ const bg = mix(base.bg, tints[dark ? 200 : 800].hex)
193
+ const skeletonFrom = mix2(bg, tints[dark ? 200 : 800].hex)
194
+
195
+ return {
196
+ bg,
197
+ bg2: mix2(bg, tints[dark ? 50 : 950].hex),
198
+ border: mix(base.bg, tints[dark ? 200 : 800].hex),
199
+ fg: mix(base.bg, dark ? black.hex : white.hex),
200
+ iconColor: '', // Add color
201
+
202
+ muted: {
203
+ fg: mix(base.bg, tints[dark ? 800 : 200].hex),
204
+ },
205
+ accent: {
206
+ fg: mix2(bg, hues.red[dark ? 800 : 200].hex),
207
+ },
208
+ link: {
209
+ fg: mix2(bg, hues.blue[dark ? 800 : 200].hex),
210
+ },
211
+ code: {
212
+ bg: mix(bg, tints[dark ? 950 : 50].hex),
213
+ fg: mix(base.bg, tints[dark ? 800 : 200].hex),
214
+ },
215
+ skeleton: {
216
+ from: skeletonFrom,
217
+ to: rgba(skeletonFrom, 0.5),
218
+ },
219
+ }
220
+ }
221
+
222
+ // state: "enabled" | unknown
223
+ const bg = mix(base.bg, tints[dark ? 400 : 500].hex)
224
+ const skeletonFrom = mix2(bg, tints[dark ? 200 : 800].hex)
225
+
226
+ return {
227
+ bg,
228
+ bg2: mix2(bg, tints[dark ? 50 : 950].hex),
229
+ border: mix(base.bg, tints[dark ? 400 : 500].hex),
230
+ iconColor: '', // Add color
231
+
232
+ fg: mix(base.bg, dark ? black.hex : white.hex),
233
+ muted: {
234
+ fg: mix(base.bg, tints[dark ? 900 : 100].hex),
235
+ },
236
+ accent: {
237
+ fg: mix2(bg, hues.red[dark ? 900 : 100].hex),
238
+ },
239
+ link: {
240
+ fg: mix2(bg, hues.blue[dark ? 900 : 100].hex),
241
+ },
242
+ code: {
243
+ bg: mix(bg, tints[dark ? 950 : 50].hex),
244
+ fg: mix(base.bg, tints[dark ? 900 : 100].hex),
245
+ },
246
+ skeleton: {
247
+ from: skeletonFrom,
248
+ to: rgba(skeletonFrom, 0.5),
249
+ },
250
+ }
251
+ },
252
+
253
+ muted: ({base, dark, name, state, tone}) => {
254
+ const mix = dark ? screen : multiply
255
+ const defaultTints = tones[name] || tones.default
256
+ const isNeutral = NEUTRAL_TONES.includes(name) && NEUTRAL_TONES.includes(tone)
257
+
258
+ let tints = tones[tone === 'default' ? name : tone] || defaultTints
259
+
260
+ if (state === 'disabled') {
261
+ tints = defaultTints
262
+
263
+ const bg = base.bg
264
+ const skeletonFrom = mix(bg, tints[dark ? 900 : 100].hex)
265
+
266
+ return {
267
+ bg,
268
+ bg2: mix(bg, tints[dark ? 950 : 50].hex),
269
+ border: mix(bg, tints[dark ? 950 : 50].hex),
270
+ iconColor: '', // Add color
271
+ fg: mix(bg, tints[dark ? 800 : 200].hex),
272
+ muted: {
273
+ fg: mix(bg, tints[dark ? 900 : 100].hex),
274
+ },
275
+ accent: {
276
+ fg: mix(bg, tints[dark ? 900 : 100].hex),
277
+ },
278
+ link: {
279
+ fg: mix(bg, tints[dark ? 900 : 100].hex),
280
+ },
281
+ code: {
282
+ bg,
283
+ fg: mix(bg, tints[dark ? 900 : 100].hex),
284
+ },
285
+ skeleton: {
286
+ from: rgba(skeletonFrom, 0.5),
287
+ to: rgba(skeletonFrom, 0.25),
288
+ },
289
+ }
290
+ }
291
+
292
+ if (state === 'hovered') {
293
+ // if (isNeutral) {
294
+ // tints = tones.primary
295
+ // }
296
+
297
+ const bg = mix(base.bg, tints[dark ? 950 : 50].hex)
298
+ const skeletonFrom = mix(bg, tints[dark ? 900 : 100].hex)
299
+
300
+ return {
301
+ bg,
302
+ bg2: mix(bg, tints[dark ? 950 : 50].hex),
303
+ border: mix(bg, tints[dark ? 900 : 100].hex),
304
+ fg: mix(base.bg, tints[dark ? 200 : 800].hex),
305
+ iconColor: '', // Add color
306
+
307
+ muted: {
308
+ fg: mix(base.bg, tints[dark ? 400 : 600].hex),
309
+ },
310
+ accent: {
311
+ fg: mix(base.bg, hues.red[dark ? 400 : 500].hex),
312
+ },
313
+ link: {
314
+ fg: mix(base.bg, hues.blue[dark ? 400 : 600].hex),
315
+ },
316
+ code: {
317
+ bg: mix(bg, tints[dark ? 950 : 50].hex),
318
+ fg: mix(base.bg, tints[dark ? 400 : 600].hex),
319
+ },
320
+ skeleton: {
321
+ from: skeletonFrom,
322
+ to: rgba(skeletonFrom, 0.5),
323
+ },
324
+ }
325
+ }
326
+
327
+ if (state === 'pressed') {
328
+ if (isNeutral) {
329
+ tints = tones.primary
330
+ }
331
+
332
+ const bg = mix(base.bg, tints[dark ? 900 : 100].hex)
333
+ const skeletonFrom = mix(bg, tints[dark ? 900 : 100].hex)
334
+
335
+ return {
336
+ bg,
337
+ bg2: mix(bg, tints[dark ? 950 : 50].hex),
338
+ border: mix(bg, tints[dark ? 900 : 100].hex),
339
+ iconColor: '', // Add color
340
+
341
+ fg: mix(base.bg, tints[dark ? 200 : 800].hex),
342
+ muted: {
343
+ fg: mix(base.bg, tints[dark ? 400 : 600].hex),
344
+ },
345
+ accent: {
346
+ fg: mix(bg, hues.red[dark ? 400 : 500].hex),
347
+ },
348
+ link: {
349
+ fg: mix(bg, hues.blue[dark ? 400 : 600].hex),
350
+ },
351
+ code: {
352
+ bg: mix(bg, tints[dark ? 950 : 50].hex),
353
+ fg: mix(base.bg, tints[dark ? 400 : 600].hex),
354
+ },
355
+ skeleton: {
356
+ from: skeletonFrom,
357
+ to: rgba(skeletonFrom, 0.5),
358
+ },
359
+ }
360
+ }
361
+
362
+ if (state === 'selected') {
363
+ if (isNeutral) {
364
+ tints = tones.primary
365
+ }
366
+
367
+ const bg = mix(base.bg, tints[dark ? 900 : 100].hex)
368
+ const skeletonFrom = mix(bg, tints[dark ? 900 : 100].hex)
369
+
370
+ return {
371
+ bg,
372
+ bg2: mix(bg, tints[dark ? 950 : 50].hex),
373
+ border: mix(bg, tints[dark ? 900 : 100].hex),
374
+ fg: mix(base.bg, tints[dark ? 200 : 800].hex),
375
+ iconColor: '', // Add color
376
+
377
+ muted: {
378
+ fg: mix(base.bg, tints[dark ? 400 : 600].hex),
379
+ },
380
+ accent: {
381
+ fg: mix(bg, hues.red[dark ? 400 : 500].hex),
382
+ },
383
+ link: {
384
+ fg: mix(bg, hues.blue[dark ? 400 : 600].hex),
385
+ },
386
+ code: {
387
+ bg: mix(bg, tints[dark ? 950 : 50].hex),
388
+ fg: mix(base.bg, tints[dark ? 400 : 600].hex),
389
+ },
390
+ skeleton: {
391
+ from: skeletonFrom,
392
+ to: rgba(skeletonFrom, 0.5),
393
+ },
394
+ }
395
+ }
396
+
397
+ const bg = base.bg
398
+ const skeletonFrom = mix(bg, tints[dark ? 900 : 100].hex)
399
+
400
+ return {
401
+ bg,
402
+ bg2: mix(bg, tints[dark ? 950 : 50].hex),
403
+ border: mix(bg, tints[dark ? 900 : 100].hex),
404
+ fg: mix(base.bg, tints[dark ? 300 : 700].hex),
405
+ iconColor: '', // Add color
406
+
407
+ muted: {
408
+ fg: mix(base.bg, tints[dark ? 400 : 600].hex),
409
+ },
410
+ accent: {
411
+ fg: mix(base.bg, hues.red[dark ? 400 : 500].hex),
412
+ },
413
+ link: {
414
+ fg: mix(base.bg, hues.blue[dark ? 400 : 600].hex),
415
+ },
416
+ code: {
417
+ bg: mix(base.bg, tints[dark ? 950 : 50].hex),
418
+ fg: mix(base.bg, tints[dark ? 400 : 600].hex),
419
+ },
420
+ skeleton: {
421
+ from: skeletonFrom,
422
+ to: rgba(skeletonFrom, 0.5),
423
+ },
424
+ }
425
+ },
426
+
427
+ button: ({base, mode, muted, solid}) => {
428
+ if (mode === 'bleed') {
429
+ return {
430
+ enabled: {
431
+ ...muted.enabled,
432
+ border: muted.enabled.bg,
433
+ },
434
+ hovered: {
435
+ ...muted.hovered,
436
+ border: muted.hovered.bg,
437
+ },
438
+ pressed: {
439
+ ...muted.pressed,
440
+ border: muted.pressed.bg,
441
+ },
442
+ selected: {
443
+ ...muted.selected,
444
+ border: muted.selected.bg,
445
+ },
446
+ disabled: {
447
+ ...muted.disabled,
448
+ border: muted.disabled.bg,
449
+ },
450
+ }
451
+ }
452
+
453
+ if (mode === 'ghost') {
454
+ return {
455
+ ...solid,
456
+ enabled: {
457
+ ...muted.enabled,
458
+ border: base.border,
459
+ },
460
+ disabled: muted.disabled,
461
+ }
462
+ }
463
+
464
+ return solid
465
+ },
466
+
467
+ card: ({base, dark, muted, name, solid, state}) => {
468
+ if (state === 'hovered') {
469
+ return muted[name].hovered
470
+ }
471
+
472
+ if (state === 'disabled') {
473
+ return muted[name].disabled
474
+ }
475
+
476
+ const isNeutral = NEUTRAL_TONES.includes(name)
477
+ const tints = tones[name] || tones.default
478
+ const mix = dark ? screen : multiply
479
+
480
+ if (state === 'pressed') {
481
+ if (isNeutral) {
482
+ return muted.primary.pressed
483
+ }
484
+
485
+ return muted[name].pressed
486
+ }
487
+
488
+ if (state === 'selected') {
489
+ if (isNeutral) {
490
+ return solid.primary.enabled
491
+ }
492
+
493
+ return solid[name].enabled
494
+ }
495
+
496
+ const bg = base.bg
497
+ const skeletonFrom = mix(base.bg, tints[dark ? 900 : 100].hex)
498
+
499
+ return {
500
+ bg,
501
+ bg2: mix(bg, tints[dark ? 950 : 50].hex),
502
+ fg: base.fg,
503
+ border: base.border,
504
+ iconColor: '', // Add color
505
+ muted: {
506
+ fg: mix(base.bg, tints[dark ? 400 : 600].hex),
507
+ },
508
+ accent: {
509
+ fg: mix(base.bg, hues.red[dark ? 400 : 500].hex),
510
+ },
511
+ link: {
512
+ fg: mix(base.bg, hues.blue[dark ? 400 : 600].hex),
513
+ },
514
+ code: {
515
+ bg: mix(base.bg, tints[dark ? 950 : 50].hex),
516
+ fg: tints[dark ? 400 : 600].hex,
517
+ },
518
+ skeleton: {
519
+ from: skeletonFrom,
520
+ to: rgba(skeletonFrom, 0.5),
521
+ },
522
+ }
523
+ },
524
+
525
+ input: ({base, dark, mode, state}) => {
526
+ const mix = dark ? screen : multiply
527
+
528
+ if (mode === 'invalid') {
529
+ const tints = tones.critical
530
+
531
+ return {
532
+ bg: mix(base.bg, tints[dark ? 950 : 50].hex),
533
+ bg2: '', // Add color
534
+ fg: mix(base.bg, tints[dark ? 400 : 600].hex),
535
+ border: mix(base.bg, tints[dark ? 800 : 200].hex),
536
+ placeholder: mix(base.bg, tints[dark ? 600 : 400].hex),
537
+ }
538
+ }
539
+
540
+ if (state === 'hovered') {
541
+ return {
542
+ bg: base.bg,
543
+ bg2: '', // Add color
544
+
545
+ fg: base.fg,
546
+ border: mix(base.bg, hues.gray[dark ? 700 : 300].hex),
547
+ placeholder: mix(base.bg, hues.gray[dark ? 600 : 400].hex),
548
+ }
549
+ }
550
+
551
+ if (state === 'disabled') {
552
+ return {
553
+ bg: mix(base.bg, hues.gray[dark ? 950 : 50].hex),
554
+ bg2: '', // Add color
555
+
556
+ fg: mix(base.bg, hues.gray[dark ? 700 : 300].hex),
557
+ border: mix(base.bg, hues.gray[dark ? 900 : 100].hex),
558
+ placeholder: mix(base.bg, hues.gray[dark ? 800 : 200].hex),
559
+ }
560
+ }
561
+
562
+ if (state === 'readOnly') {
563
+ return {
564
+ bg: mix(base.bg, hues.gray[dark ? 950 : 50].hex),
565
+ bg2: '', // Add color
566
+
567
+ fg: mix(base.bg, hues.gray[dark ? 200 : 800].hex),
568
+ border: mix(base.bg, hues.gray[dark ? 800 : 200].hex),
569
+ placeholder: mix(base.bg, hues.gray[dark ? 600 : 400].hex),
570
+ }
571
+ }
572
+
573
+ return {
574
+ bg: base.bg,
575
+ bg2: '', // Add color
576
+ fg: base.fg,
577
+ border: base.border,
578
+ placeholder: mix(base.bg, hues.gray[dark ? 600 : 400].hex),
579
+ }
580
+ },
581
+
582
+ selectable: ({base, muted, tone, solid, state}) => {
583
+ if (state === 'enabled') {
584
+ return {
585
+ ...muted[tone].enabled,
586
+ bg: base.bg,
587
+ }
588
+ }
589
+
590
+ if (state === 'pressed') {
591
+ if (tone === 'default') {
592
+ return muted.primary.pressed
593
+ }
594
+
595
+ return muted[tone].pressed
596
+ }
597
+
598
+ if (state === 'selected') {
599
+ if (tone === 'default') {
600
+ return solid.primary.enabled
601
+ }
602
+
603
+ return solid[tone].enabled
604
+ }
605
+
606
+ if (state === 'disabled') {
607
+ return {
608
+ ...muted[tone].disabled,
609
+ bg: base.bg,
610
+ }
611
+ }
612
+
613
+ return muted[tone][state]
614
+ },
615
+
616
+ spot: ({base, dark, key}) => {
617
+ const mix = dark ? screen : multiply
618
+
619
+ return mix(base.bg, hues[key][dark ? 400 : 500].hex)
620
+ },
621
+
622
+ syntax: ({base, dark}) => {
623
+ const mix = dark ? screen : multiply
624
+ const mainShade = dark ? 400 : 600
625
+ const secondaryShade = dark ? 600 : 400
626
+
627
+ return {
628
+ atrule: mix(base.bg, hues.purple[mainShade].hex),
629
+ attrName: mix(base.bg, hues.green[mainShade].hex),
630
+ attrValue: mix(base.bg, hues.yellow[mainShade].hex),
631
+ attribute: mix(base.bg, hues.yellow[mainShade].hex),
632
+ boolean: mix(base.bg, hues.purple[mainShade].hex),
633
+ builtin: mix(base.bg, hues.purple[mainShade].hex),
634
+ cdata: mix(base.bg, hues.yellow[mainShade].hex),
635
+ char: mix(base.bg, hues.yellow[mainShade].hex),
636
+ class: mix(base.bg, hues.orange[mainShade].hex),
637
+ className: mix(base.bg, hues.cyan[mainShade].hex),
638
+ comment: mix(base.bg, hues.gray[secondaryShade].hex),
639
+ constant: mix(base.bg, hues.purple[mainShade].hex),
640
+ deleted: mix(base.bg, hues.red[mainShade].hex),
641
+ doctype: mix(base.bg, hues.gray[secondaryShade].hex),
642
+ entity: mix(base.bg, hues.red[mainShade].hex),
643
+ function: mix(base.bg, hues.green[mainShade].hex),
644
+ hexcode: mix(base.bg, hues.blue[mainShade].hex),
645
+ id: mix(base.bg, hues.purple[mainShade].hex),
646
+ important: mix(base.bg, hues.purple[mainShade].hex),
647
+ inserted: mix(base.bg, hues.yellow[mainShade].hex),
648
+ keyword: mix(base.bg, hues.magenta[mainShade].hex),
649
+ number: mix(base.bg, hues.purple[mainShade].hex),
650
+ operator: mix(base.bg, hues.magenta[mainShade].hex),
651
+ prolog: mix(base.bg, hues.gray[secondaryShade].hex),
652
+ property: mix(base.bg, hues.blue[mainShade].hex),
653
+ pseudoClass: mix(base.bg, hues.yellow[mainShade].hex),
654
+ pseudoElement: mix(base.bg, hues.yellow[mainShade].hex),
655
+ punctuation: mix(base.bg, hues.gray[mainShade].hex),
656
+ regex: mix(base.bg, hues.blue[mainShade].hex),
657
+ selector: mix(base.bg, hues.red[mainShade].hex),
658
+ string: mix(base.bg, hues.yellow[mainShade].hex),
659
+ symbol: mix(base.bg, hues.purple[mainShade].hex),
660
+ tag: mix(base.bg, hues.red[mainShade].hex),
661
+ unit: mix(base.bg, hues.orange[mainShade].hex),
662
+ url: mix(base.bg, hues.red[mainShade].hex),
663
+ variable: mix(base.bg, hues.red[mainShade].hex),
664
+ }
665
+ },
666
+ })
@@ -1,5 +1,5 @@
1
1
  import {RootTheme} from '../types'
2
- import {tones} from './color'
2
+ import {color} from './color'
3
3
  import {fonts} from './fonts'
4
4
 
5
5
  /**
@@ -21,13 +21,7 @@ export const studioTheme: RootTheme = {
21
21
  card: {
22
22
  focusRing: {offset: -1, width: 1},
23
23
  },
24
- color: {
25
- tones: tones,
26
-
27
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
28
- // @ts-ignore This is necessary until workshop is updated.
29
- base: {bg: '#fffff'},
30
- },
24
+ color,
31
25
  container: [320, 640, 960, 1280, 1600, 1920],
32
26
  focusRing: {
33
27
  offset: 1,
@@ -5,8 +5,8 @@
5
5
  * This is not possible in the previous configuration, as each ThemeColor uses only one tint.
6
6
  */
7
7
  import {ColorTintKey, ColorTints, ColorTint, black, hues, white} from '@sanity/color'
8
- import {rgba} from '../../../color-fns'
9
- import {ThemeColorName, ThemeColorSchemeKey} from '../types'
8
+ import {rgba} from '../lib/color-fns'
9
+ import {ThemeColorName, ThemeColorSchemeKey} from '../lib/theme'
10
10
 
11
11
  export const colorKeys = [
12
12
  'text-primary',
@@ -4,7 +4,6 @@ import {useRootTheme} from './useRootTheme'
4
4
 
5
5
  /**
6
6
  * @public
7
- * @deprecated
8
7
  */
9
8
  export interface ThemeColorProviderProps {
10
9
  children?: React.ReactNode
@@ -14,7 +13,6 @@ export interface ThemeColorProviderProps {
14
13
 
15
14
  /**
16
15
  * @public
17
- * @deprecated Use `toneContext` instead.
18
16
  */
19
17
  export function ThemeColorProvider(props: ThemeColorProviderProps): React.ReactElement {
20
18
  const {children, scheme, tone} = props