@sanity/ui 2.0.0-alpha.1 → 2.0.0-alpha.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.
Files changed (120) hide show
  1. package/dist/index.cjs.mjs +3 -0
  2. package/dist/index.d.ts +309 -411
  3. package/dist/index.esm.js +5098 -2428
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +5230 -2557
  6. package/dist/index.js.map +1 -1
  7. package/package.json +2 -2
  8. package/src/components/dialog/constants.ts +4 -0
  9. package/src/components/dialog/dialog.tsx +86 -24
  10. package/src/components/dialog/styles.ts +3 -4
  11. package/src/components/menu/__workshop__/closableMenuButton.tsx +2 -2
  12. package/src/components/menu/menuDivider.ts +2 -1
  13. package/src/components/menu/menuGroup.tsx +22 -23
  14. package/src/components/menu/menuItem.tsx +31 -37
  15. package/src/components/skeleton/styles.ts +8 -7
  16. package/src/components/tree/style.ts +19 -20
  17. package/src/primitives/_selectable/style.ts +25 -22
  18. package/src/primitives/avatar/avatar.tsx +8 -3
  19. package/src/primitives/avatar/avatarCounter.tsx +5 -4
  20. package/src/primitives/avatar/spotColors.ts +53 -0
  21. package/src/primitives/avatar/styles.ts +5 -7
  22. package/src/primitives/avatar/types.ts +14 -0
  23. package/src/primitives/badge/badge.tsx +5 -3
  24. package/src/primitives/badge/styles.ts +7 -8
  25. package/src/primitives/box/__workshop__/responsive.tsx +2 -2
  26. package/src/primitives/button/button.tsx +2 -2
  27. package/src/primitives/button/styles.ts +82 -16
  28. package/src/primitives/card/__workshop__/selected.tsx +8 -9
  29. package/src/primitives/card/card.tsx +43 -7
  30. package/src/primitives/card/styles.ts +30 -22
  31. package/src/primitives/card/types.ts +3 -1
  32. package/src/primitives/checkbox/styles.ts +20 -20
  33. package/src/primitives/code/code.tsx +15 -3
  34. package/src/primitives/code/styles.ts +51 -42
  35. package/src/primitives/heading/styles.ts +6 -5
  36. package/src/primitives/kbd/kbd.tsx +2 -1
  37. package/src/primitives/label/styles.ts +3 -2
  38. package/src/primitives/popover/popoverArrow.tsx +3 -2
  39. package/src/primitives/popover/popoverCard.tsx +6 -2
  40. package/src/primitives/radio/styles.ts +15 -15
  41. package/src/primitives/select/styles.ts +20 -22
  42. package/src/primitives/switch/styles.ts +13 -13
  43. package/src/primitives/text/__workshop__/colored.tsx +10 -11
  44. package/src/primitives/text/styles.ts +10 -9
  45. package/src/primitives/textArea/textArea.tsx +8 -12
  46. package/src/primitives/textInput/textInput.tsx +13 -13
  47. package/src/primitives/tooltip/__workshop__/props.tsx +20 -3
  48. package/src/primitives/tooltip/tooltipArrow.tsx +3 -2
  49. package/src/styles/border/borderStyle.ts +2 -1
  50. package/src/styles/colorVars/colorVarsStyle.ts +73 -32
  51. package/src/styles/focusRing/index.ts +6 -4
  52. package/src/styles/input/textInputStyle.ts +76 -93
  53. package/src/styles/margin/marginsStyle.test.ts +1 -2
  54. package/src/styles/padding/paddingStyle.test.ts +1 -2
  55. package/src/styles/shadow/shadowStyle.ts +5 -5
  56. package/src/theme/__workshop__/color.tsx +2 -2
  57. package/src/theme/__workshop__/index.ts +0 -5
  58. package/src/theme/lib/color-fns/blend/multiply.ts +2 -2
  59. package/src/theme/lib/color-fns/blend/screen.ts +2 -2
  60. package/src/theme/lib/color-fns/convert.ts +15 -1
  61. package/src/theme/lib/color-fns/parse.ts +7 -3
  62. package/src/theme/lib/color-fns/types.ts +11 -0
  63. package/src/theme/lib/theme/color/_legacy/createColorTheme.ts +7 -0
  64. package/src/theme/lib/theme/color/_legacy/index.ts +1 -0
  65. package/src/theme/lib/theme/color/_legacy/legacyColor.ts +3997 -0
  66. package/src/theme/lib/theme/color/cssVariables/cardVariables.ts +88 -0
  67. package/src/theme/lib/theme/color/cssVariables/createCssVars.ts +31 -0
  68. package/src/theme/lib/theme/color/cssVariables/cssVars.test.ts +262 -0
  69. package/src/theme/lib/theme/color/cssVariables/index.ts +1 -0
  70. package/src/theme/lib/theme/color/cssVariables/tints.ts +312 -0
  71. package/src/theme/lib/theme/color/cssVariables/tones.ts +67 -0
  72. package/src/theme/lib/theme/color/cssVariables/utils.test.ts +15 -0
  73. package/src/theme/lib/theme/color/cssVariables/utils.ts +9 -0
  74. package/src/theme/lib/theme/color/index.ts +3 -12
  75. package/src/theme/lib/theme/color/types.ts +6 -37
  76. package/src/theme/lib/theme/theme.ts +9 -4
  77. package/src/theme/studioTheme/color.ts +2 -641
  78. package/src/theme/studioTheme/helpers.ts +15 -1
  79. package/src/theme/studioTheme/theme.ts +13 -3
  80. package/src/theme/themeColorProvider.tsx +2 -0
  81. package/src/theme/themeProvider.tsx +28 -8
  82. package/src/theme/toneContext/toneContext.ts +12 -0
  83. package/src/theme/toneContext/toneProvider.tsx +31 -0
  84. package/src/theme/toneContext/types.ts +10 -0
  85. package/src/theme/toneContext/useToneContext.tsx +26 -0
  86. package/src/theme/types.ts +2 -4
  87. package/src/utils/elementQuery/__workshop__/customMedia.tsx +4 -3
  88. package/src/theme/__workshop__/canvas.tsx +0 -395
  89. package/src/theme/lib/theme/color/_generic/index.ts +0 -1
  90. package/src/theme/lib/theme/color/_generic/types.ts +0 -30
  91. package/src/theme/lib/theme/color/base/index.ts +0 -1
  92. package/src/theme/lib/theme/color/base/types.ts +0 -19
  93. package/src/theme/lib/theme/color/button/createButtonModes.ts +0 -20
  94. package/src/theme/lib/theme/color/button/createButtonTones.ts +0 -52
  95. package/src/theme/lib/theme/color/button/index.ts +0 -1
  96. package/src/theme/lib/theme/color/button/types.ts +0 -44
  97. package/src/theme/lib/theme/color/card/createCardStates.ts +0 -58
  98. package/src/theme/lib/theme/color/card/index.ts +0 -1
  99. package/src/theme/lib/theme/color/card/types.ts +0 -18
  100. package/src/theme/lib/theme/color/color.test.ts +0 -63
  101. package/src/theme/lib/theme/color/defaults.ts +0 -390
  102. package/src/theme/lib/theme/color/factory.ts +0 -138
  103. package/src/theme/lib/theme/color/input/createInputModes.ts +0 -84
  104. package/src/theme/lib/theme/color/input/index.ts +0 -1
  105. package/src/theme/lib/theme/color/input/types.ts +0 -28
  106. package/src/theme/lib/theme/color/muted/createMuted.ts +0 -56
  107. package/src/theme/lib/theme/color/muted/index.ts +0 -1
  108. package/src/theme/lib/theme/color/muted/types.ts +0 -24
  109. package/src/theme/lib/theme/color/selectable/createSelectableTones.ts +0 -73
  110. package/src/theme/lib/theme/color/selectable/index.ts +0 -1
  111. package/src/theme/lib/theme/color/selectable/types.ts +0 -29
  112. package/src/theme/lib/theme/color/solid/createSolidTones.ts +0 -56
  113. package/src/theme/lib/theme/color/solid/index.ts +0 -1
  114. package/src/theme/lib/theme/color/solid/types.ts +0 -24
  115. package/src/theme/lib/theme/color/spot/createSpot.ts +0 -21
  116. package/src/theme/lib/theme/color/spot/index.ts +0 -1
  117. package/src/theme/lib/theme/color/spot/types.ts +0 -28
  118. package/src/theme/lib/theme/color/syntax/index.ts +0 -1
  119. package/src/theme/lib/theme/color/syntax/types.ts +0 -41
  120. package/src/theme/studioTheme/tints.ts +0 -152
@@ -8,6 +8,8 @@ import {
8
8
  ResponsiveRadiusStyleProps,
9
9
  } from '../../styles/internal'
10
10
  import {ThemeFontSize} from '../../theme'
11
+ import {mutableCardVariables} from '../../theme/lib/theme/color/cssVariables/cardVariables'
12
+ import {cssVars} from '../../theme/lib/theme/color/cssVariables/createCssVars'
11
13
  import {CSSObject} from '../../types/styled'
12
14
 
13
15
  function rootStyle(): ReturnType<typeof css> {
@@ -45,24 +47,23 @@ function inputColorStyle(props: ThemeProps) {
45
47
  const {theme} = props
46
48
  const {input} = theme.sanity
47
49
  const {focusRing} = input.select
48
- const color = theme.sanity.color.input
49
50
 
50
51
  return css`
51
52
  /* enabled */
52
- background-color: ${color.default.enabled.bg};
53
- color: ${color.default.enabled.fg};
53
+ background-color: ${cssVars.default['bg-base']};
54
+ color: ${cssVars.default['text-primary']};
54
55
  box-shadow: ${focusRingBorderStyle({
55
- color: color.default.enabled.border,
56
+ color: cssVars.default['border-base'],
56
57
  width: input.border.width,
57
58
  })};
58
59
 
59
60
  /* hovered */
60
61
  @media (hover: hover) {
61
62
  &:not(:disabled):hover {
62
- background-color: ${color.default.hovered.bg};
63
- color: ${color.default.hovered.fg};
63
+ background-color: ${cssVars.default['bg-base-hover']};
64
+ color: ${cssVars.default['text-primary']};
64
65
  box-shadow: ${focusRingBorderStyle({
65
- color: color.default.hovered.border,
66
+ color: cssVars.default['border-base-hover'],
66
67
  width: input.border.width,
67
68
  })};
68
69
  }
@@ -71,27 +72,27 @@ function inputColorStyle(props: ThemeProps) {
71
72
  /* focused */
72
73
  &:not(:disabled):focus {
73
74
  box-shadow: ${focusRingStyle({
74
- border: {width: input.border.width, color: color.default.enabled.border},
75
+ border: {width: input.border.width, color: cssVars.default['border-base']},
75
76
  focusRing,
76
77
  })};
77
78
  }
78
79
 
79
80
  /* read-only */
80
81
  &[data-read-only] {
81
- background-color: ${color.default.readOnly.bg};
82
- color: ${color.default.readOnly.fg};
82
+ background-color: ${cssVars.default['bg-tint']};
83
+ color: ${cssVars.default['text-primary']};
83
84
  box-shadow: ${focusRingBorderStyle({
84
- color: color.default.readOnly.border,
85
+ color: cssVars.default['border-base'],
85
86
  width: input.border.width,
86
87
  })};
87
88
  }
88
89
 
89
90
  /* disabled */
90
91
  &:not([data-read-only]):disabled {
91
- background-color: ${color.default.disabled.bg};
92
- color: ${color.default.disabled.fg};
92
+ background-color: ${cssVars.default['bg-tint']};
93
+ color: ${cssVars.default['text-primary']};
93
94
  box-shadow: ${focusRingBorderStyle({
94
- color: color.default.disabled.border,
95
+ color: cssVars.default['border-base'],
95
96
  width: input.border.width,
96
97
  })};
97
98
  }
@@ -130,10 +131,7 @@ function inputStyle(): Array<
130
131
  ]
131
132
  }
132
133
 
133
- function iconBoxStyle(props: ThemeProps): ReturnType<typeof css> {
134
- const {theme} = props
135
- const color = theme.sanity.color.input
136
-
134
+ function iconBoxStyle(): ReturnType<typeof css> {
137
135
  return css`
138
136
  pointer-events: none;
139
137
  position: absolute;
@@ -141,23 +139,23 @@ function iconBoxStyle(props: ThemeProps): ReturnType<typeof css> {
141
139
  right: 0;
142
140
 
143
141
  /* enabled */
144
- --card-fg-color: ${color.default.enabled.fg};
142
+ ${mutableCardVariables['fg-color']}: ${cssVars.default['text-primary']};
145
143
 
146
144
  /* hover */
147
145
  @media (hover: hover) {
148
146
  select:not(disabled):not(:read-only):hover + && {
149
- --card-fg-color: ${color.default.hovered.fg};
147
+ ${mutableCardVariables['fg-color']}: ${cssVars.default['text-primary']};
150
148
  }
151
149
  }
152
150
 
153
151
  /* disabled */
154
152
  select:disabled + && {
155
- --card-fg-color: ${color.default.disabled.fg};
153
+ ${mutableCardVariables['fg-color']}: ${cssVars.default['text-primary']};
156
154
  }
157
155
 
158
156
  /* read-only */
159
157
  select[data-read-only] + && {
160
- --card-fg-color: ${color.default.readOnly.fg};
158
+ ${mutableCardVariables['fg-color']}: ${cssVars.default['text-primary']};
161
159
  }
162
160
  `
163
161
  }
@@ -1,6 +1,7 @@
1
1
  import {css} from 'styled-components'
2
2
  import {rem, ThemeProps} from '../../styles'
3
3
  import {focusRingStyle} from '../../styles/internal'
4
+ import {cssVars} from '../../theme/lib/theme/color/cssVariables/createCssVars'
4
5
 
5
6
  /* Root */
6
7
  export function switchBaseStyles(): ReturnType<typeof css> {
@@ -38,11 +39,10 @@ export function switchRepresentationStyles(props: ThemeProps): ReturnType<typeof
38
39
  const {theme} = props
39
40
  const {input} = theme.sanity
40
41
  const {focusRing} = input.switch
41
- const color = theme.sanity.color.input
42
42
 
43
43
  return css`
44
- --switch-bg-color: ${color.default.enabled.border};
45
- --switch-fg-color: ${color.default.enabled.bg};
44
+ --switch-bg-color: ${cssVars.default['border-base']};
45
+ --switch-fg-color: ${cssVars.default['bg-base']};
46
46
  --switch-box-shadow: none;
47
47
 
48
48
  &:not([hidden]) {
@@ -79,30 +79,30 @@ export function switchRepresentationStyles(props: ThemeProps): ReturnType<typeof
79
79
  }
80
80
 
81
81
  input:checked + && {
82
- --switch-bg-color: var(--card-focus-ring-color);
83
- --switch-fg-color: ${color.default.enabled.bg};
82
+ --switch-bg-color: ${cssVars.positive['border-accent']};
83
+ --switch-fg-color: ${cssVars.positive['bg-base']};
84
84
  }
85
85
 
86
86
  @media (hover: hover) {
87
87
  input:not(:disabled):hover + && {
88
- --switch-bg-color: ${color.default.hovered.border};
89
- --switch-fg-color: ${color.default.hovered.bg};
88
+ --switch-bg-color: ${cssVars.default['border-base']};
89
+ --switch-fg-color: ${cssVars.default['bg-base']};
90
90
  }
91
91
 
92
92
  input:not(:disabled):checked:hover + && {
93
- --switch-bg-color: var(--card-focus-ring-color);
94
- --switch-fg-color: ${color.default.enabled.bg};
93
+ --switch-bg-color: ${cssVars.positive['border-accent']};
94
+ --switch-fg-color: ${cssVars.positive['bg-base']};
95
95
  }
96
96
  }
97
97
 
98
98
  input:not([data-read-only]):disabled + && {
99
- --switch-bg-color: ${color.default.disabled.border};
100
- --switch-fg-color: ${color.default.disabled.bg};
99
+ --switch-bg-color: ${cssVars.default['border-base']};
100
+ --switch-fg-color: ${cssVars.default['bg-tint']};
101
101
  }
102
102
 
103
103
  input[data-read-only]:disabled + && {
104
- --switch-bg-color: ${color.default.readOnly.border};
105
- --switch-fg-color: ${color.default.readOnly.bg};
104
+ --switch-bg-color: ${cssVars.default['border-base']};
105
+ --switch-fg-color: ${cssVars.default['bg-tint']};
106
106
  }
107
107
  `
108
108
  }
@@ -1,27 +1,26 @@
1
- import {Flex, Text, Theme, ThemeColorSpotKey, useTheme} from '@sanity/ui'
1
+ import {Flex, Text, useTheme} from '@sanity/ui'
2
2
  import {useSelect} from '@sanity/ui-workshop'
3
3
  import styled, {css} from 'styled-components'
4
4
  import {WORKSHOP_SPOT_COLOR_OPTIONS} from '../../../__workshop__/constants'
5
+ import {useToneContext} from '../../../theme/toneContext/useToneContext'
6
+ import {spotColor} from '../../avatar/spotColors'
5
7
 
6
- const ColoredText = styled(Text)<{color?: ThemeColorSpotKey}>((props: {
7
- color?: ThemeColorSpotKey
8
- theme: Theme
9
- }) => {
10
- const {spot} = props.theme.sanity.color
11
-
8
+ const ColoredText = styled(Text)<{color: string}>((props: {color: string}) => {
12
9
  return css`
13
- color: ${spot[props.color || 'gray']};
10
+ color: ${props.color};
14
11
  `
15
12
  })
16
13
 
17
14
  export default function ColoredTextStory() {
18
15
  const theme = useTheme()
19
- const color = useSelect('Color', WORKSHOP_SPOT_COLOR_OPTIONS, 'gray')
16
+ const selectedColor = useSelect('Color', WORKSHOP_SPOT_COLOR_OPTIONS, 'gray')
17
+ const {scheme} = useToneContext()
18
+ const color = spotColor[selectedColor ?? 'gray'][scheme]
20
19
 
21
20
  return (
22
21
  <Flex align="center" height="fill" justify="center" padding={[4, 5, 6]} sizing="border">
23
- <ColoredText align="center" color={color} size={4} theme={theme} weight="bold">
24
- {color}
22
+ <ColoredText align="center" color={color.hex} size={4} theme={theme} weight="bold">
23
+ {color.title}
25
24
  </ColoredText>
26
25
  </Flex>
27
26
  )
@@ -1,5 +1,6 @@
1
1
  import {css} from 'styled-components'
2
2
  import {ThemeProps} from '../../styles'
3
+ import {cssVars} from '../../theme'
3
4
 
4
5
  export function textBaseStyle(
5
6
  props: {$accent?: boolean; $muted?: boolean} & ThemeProps,
@@ -8,29 +9,29 @@ export function textBaseStyle(
8
9
  const {weights} = theme.sanity.fonts.text
9
10
 
10
11
  return css`
11
- color: var(--card-fg-color);
12
+ color: ${cssVars.mutable['fg-color']};
12
13
 
13
14
  ${$accent &&
14
15
  css`
15
- color: var(--card-accent-fg-color);
16
+ color: ${cssVars.default['text-accent']};
16
17
  `}
17
18
 
18
19
  ${$muted &&
19
20
  css`
20
- color: var(--card-muted-fg-color);
21
+ color: ${cssVars.mutable['muted-fg-color']};
21
22
  `}
22
23
 
23
24
  & code {
24
25
  font-family: ${theme.sanity.fonts.code.family};
25
26
  border-radius: 1px;
26
- background-color: var(--card-code-bg-color);
27
- color: var(--card-code-fg-color);
27
+ background-color: ${cssVars.default['bg-tint-code']};
28
+ color: ${cssVars.default['text-code']};
28
29
  }
29
30
 
30
31
  & a {
31
32
  text-decoration: none;
32
33
  border-radius: 1px;
33
- color: var(--card-link-color);
34
+ color: ${cssVars.default['text-link']};
34
35
  outline: none;
35
36
 
36
37
  @media (hover: hover) {
@@ -41,8 +42,8 @@ export function textBaseStyle(
41
42
 
42
43
  &:focus {
43
44
  box-shadow:
44
- 0 0 0 1px var(--card-bg-color),
45
- 0 0 0 3px var(--card-focus-ring-color);
45
+ 0 0 0 1px ${cssVars.mutable['bg-color']},
46
+ 0 0 0 3px ${cssVars.positive['border-accent']};
46
47
  }
47
48
 
48
49
  &:focus:not(:focus-visible) {
@@ -62,7 +63,7 @@ export function textBaseStyle(
62
63
 
63
64
  & [data-sanity-icon] {
64
65
  vertical-align: baseline;
65
- color: var(--card-icon-color);
66
+ color: ${cssVars.mutable['icon-color']};
66
67
  }
67
68
  `
68
69
  }
@@ -13,7 +13,7 @@ import {
13
13
  textInputFontSizeStyle,
14
14
  textInputRepresentationStyle,
15
15
  } from '../../styles/internal'
16
- import {ThemeFontWeightKey, useRootTheme} from '../../theme'
16
+ import {ThemeColorToneKey, ThemeFontWeightKey} from '../../theme'
17
17
  import {ResponsiveRadiusProps} from '../types'
18
18
 
19
19
  /**
@@ -25,6 +25,7 @@ export interface TextAreaProps extends ResponsiveRadiusProps {
25
25
  fontSize?: number | number[]
26
26
  padding?: number | number[]
27
27
  weight?: ThemeFontWeightKey
28
+ tone?: ThemeColorToneKey
28
29
  }
29
30
 
30
31
  const Root = styled.span(textInputRootStyle)
@@ -60,15 +61,14 @@ export const TextArea = forwardRef(function TextArea(
60
61
  disabled = false,
61
62
  fontSize = 2,
62
63
  padding = 3,
63
- radius = 1,
64
+ radius = 2,
64
65
  weight,
66
+ tone = 'default',
65
67
  ...restProps
66
68
  } = props
67
69
 
68
70
  const ref = useForwardedRef(forwardedRef)
69
71
 
70
- const rootTheme = useRootTheme()
71
-
72
72
  useCustomValidity(ref, customValidity)
73
73
 
74
74
  return (
@@ -76,25 +76,21 @@ export const TextArea = forwardRef(function TextArea(
76
76
  <InputRoot>
77
77
  <Input
78
78
  data-as="textarea"
79
- data-scheme={rootTheme.scheme}
80
- data-tone={rootTheme.tone}
79
+ data-tone={tone}
81
80
  {...restProps}
82
81
  $fontSize={useArrayProp(fontSize)}
83
82
  $padding={useArrayProp(padding)}
84
- $scheme={rootTheme.scheme}
85
83
  $space={useArrayProp(0)}
86
- $tone={rootTheme.tone}
84
+ $tone={tone}
87
85
  $weight={weight}
88
86
  disabled={disabled}
89
87
  ref={ref}
90
88
  />
91
89
  <Presentation
92
90
  $radius={useArrayProp(radius)}
93
- $scheme={rootTheme.scheme}
94
- $tone={rootTheme.tone}
91
+ $tone={tone}
95
92
  data-border={border ? '' : undefined}
96
- data-scheme={rootTheme.scheme}
97
- data-tone={rootTheme.tone}
93
+ data-tone={tone}
98
94
  />
99
95
  </InputRoot>
100
96
  </Root>
@@ -16,7 +16,8 @@ import {
16
16
  textInputRepresentationStyle,
17
17
  textInputRootStyle,
18
18
  } from '../../styles/internal'
19
- import {ThemeFontWeightKey, useRootTheme} from '../../theme'
19
+ import {ThemeColorToneKey, ThemeFontWeightKey} from '../../theme'
20
+ import {useToneContext} from '../../theme/toneContext/useToneContext'
20
21
  import {Radius} from '../../types'
21
22
  import {Box} from '../box'
22
23
  import {Button, ButtonProps} from '../button'
@@ -70,6 +71,7 @@ export interface TextInputProps {
70
71
  suffix?: React.ReactNode
71
72
  type?: TextInputType
72
73
  weight?: ThemeFontWeightKey
74
+ tone?: ThemeColorToneKey
73
75
  }
74
76
 
75
77
  const CLEAR_BUTTON_BOX_STYLE: React.CSSProperties = {zIndex: 2}
@@ -156,19 +158,21 @@ export const TextInput = forwardRef(function TextInput(
156
158
  onClear,
157
159
  padding: paddingProp = 3,
158
160
  prefix,
159
- radius: radiusProp = 1,
161
+ radius: radiusProp = 2,
160
162
  readOnly,
161
163
  space: spaceProp = 3,
162
164
  suffix,
163
165
  customValidity,
164
166
  type = 'text',
165
167
  weight,
168
+ tone: toneProp = 'default',
166
169
  ...restProps
167
170
  } = props
168
171
 
169
172
  const ref = useForwardedRef(forwardedRef)
170
173
 
171
- const rootTheme = useRootTheme()
174
+ const toneContext = useToneContext()
175
+ const tone = toneProp === 'default' ? toneContext.tone : toneProp
172
176
 
173
177
  const fontSize = useArrayProp(fontSizeProp)
174
178
  const padding = useArrayProp(paddingProp)
@@ -221,11 +225,9 @@ export const TextInput = forwardRef(function TextInput(
221
225
  $hasPrefix={$hasPrefix}
222
226
  $hasSuffix={$hasSuffix}
223
227
  $radius={radius}
224
- $scheme={rootTheme.scheme}
225
- $tone={rootTheme.tone}
228
+ $tone={tone}
226
229
  data-border={border ? '' : undefined}
227
- data-scheme={rootTheme.scheme}
228
- data-tone={rootTheme.tone}
230
+ data-tone={tone}
229
231
  >
230
232
  {icon && (
231
233
  <LeftBox padding={padding}>
@@ -253,10 +255,10 @@ export const TextInput = forwardRef(function TextInput(
253
255
  iconRight,
254
256
  padding,
255
257
  radius,
256
- rootTheme,
257
258
  $hasClearButton,
258
259
  $hasPrefix,
259
260
  $hasSuffix,
261
+ tone,
260
262
  ],
261
263
  )
262
264
 
@@ -339,22 +341,20 @@ export const TextInput = forwardRef(function TextInput(
339
341
  )
340
342
 
341
343
  return (
342
- <Root data-ui="TextInput" tone={rootTheme.tone}>
344
+ <Root data-ui="TextInput" tone={tone}>
343
345
  {prefixNode}
344
346
 
345
347
  <InputRoot>
346
348
  <Input
347
349
  data-as="input"
348
- data-scheme={rootTheme.scheme}
349
- data-tone={rootTheme.tone}
350
+ data-tone={tone}
350
351
  {...restProps}
351
352
  $fontSize={fontSize}
352
353
  $iconLeft={$hasIcon}
353
354
  $iconRight={$hasIconRight || $hasClearButton}
354
355
  $padding={padding}
355
- $scheme={rootTheme.scheme}
356
356
  $space={space}
357
- $tone={rootTheme.tone}
357
+ $tone={tone}
358
358
  $weight={weight}
359
359
  disabled={disabled}
360
360
  readOnly={readOnly}
@@ -1,4 +1,13 @@
1
- import {Button, Card, Flex, Text, Tooltip, TooltipDelayGroupProvider, Stack} from '@sanity/ui'
1
+ import {
2
+ Button,
3
+ Card,
4
+ Flex,
5
+ Text,
6
+ Tooltip,
7
+ TooltipDelayGroupProvider,
8
+ Stack,
9
+ cssVars,
10
+ } from '@sanity/ui'
2
11
  import {useBoolean, useSelect, useText, useNumber} from '@sanity/ui-workshop'
3
12
  import {
4
13
  WORKSHOP_PLACEMENT_OPTIONS,
@@ -28,7 +37,11 @@ export default function PropsStory() {
28
37
  >
29
38
  <Stack
30
39
  padding={4}
31
- style={{outline: '1px solid var(--card-border-color)', width: '100%', maxWidth: '640px'}}
40
+ style={{
41
+ outline: `1px solid ${cssVars.default['border-base']}`,
42
+ width: '100%',
43
+ maxWidth: '640px',
44
+ }}
32
45
  space={4}
33
46
  >
34
47
  <Text align="center" size={3}>
@@ -52,7 +65,11 @@ export default function PropsStory() {
52
65
  </Stack>
53
66
  <Stack
54
67
  padding={4}
55
- style={{outline: '1px solid var(--card-border-color)', width: '100%', maxWidth: '640px'}}
68
+ style={{
69
+ outline: `1px solid ${cssVars.default['border-base']}`,
70
+ width: '100%',
71
+ maxWidth: '640px',
72
+ }}
56
73
  space={4}
57
74
  >
58
75
  <Text align="center" size={3}>
@@ -1,5 +1,6 @@
1
1
  import {forwardRef} from 'react'
2
2
  import styled from 'styled-components'
3
+ import {cssVars} from '../../theme'
3
4
 
4
5
  const Root = styled.div`
5
6
  position: absolute;
@@ -63,11 +64,11 @@ const Root = styled.div`
63
64
  `
64
65
 
65
66
  const Border = styled.path`
66
- fill: var(--card-shadow-outline-color);
67
+ fill: ${cssVars.default['base-shadow-outline-color']};
67
68
  `
68
69
 
69
70
  const Shape = styled.path`
70
- fill: var(--card-bg-color);
71
+ fill: ${cssVars.mutable['bg-color']};
71
72
  `
72
73
 
73
74
  interface TooltipArrowProps {}
@@ -1,9 +1,10 @@
1
+ import {cssVars} from '../../theme'
1
2
  import {CSSObject} from '../../types/styled'
2
3
  import {_responsive} from '../helpers'
3
4
  import {ThemeProps} from '../types'
4
5
  import {ResponsiveBorderStyleProps} from './types'
5
6
 
6
- const BORDER_VALUE = '1px solid var(--card-border-color)'
7
+ const BORDER_VALUE = `1px solid ${cssVars.default['border-base']}`
7
8
 
8
9
  export function responsiveBorderStyle(): Array<
9
10
  (props: ResponsiveBorderStyleProps & ThemeProps) => CSSObject[]
@@ -1,43 +1,84 @@
1
- import {ThemeColorBase, ThemeColorGenericState} from '../../theme'
1
+ import {ThemeColorToneKey, cssVars} from '../../theme'
2
+ import {mutableCardVariables} from '../../theme/lib/theme/color/cssVariables/cardVariables'
3
+ import {getToneCssVar} from '../../theme/lib/theme/color/cssVariables/tones'
2
4
  import {CSSObject} from '../../types/styled'
3
5
 
4
6
  /**
5
7
  * @internal
8
+ * Card overrides in disabled states
6
9
  */
7
- export function _colorVarsStyle(
8
- base: ThemeColorBase,
9
- color: ThemeColorGenericState,
10
- checkered = false,
11
- ): CSSObject {
10
+ export function _colorVarStyleDisabled(checkered = false): CSSObject {
12
11
  return {
13
- // Base
14
- // @todo: rename to "--base-"?
15
- '--card-shadow-outline-color': base.shadow.outline,
16
- '--card-shadow-umbra-color': base.shadow.umbra,
17
- '--card-shadow-penumbra-color': base.shadow.penumbra,
18
- '--card-shadow-ambient-color': base.shadow.ambient,
19
- '--card-focus-ring-color': base.focusRing,
20
- '--card-icon-color': color.iconColor,
12
+ [getToneCssVar('default', 'text-link')]: cssVars.default['text-secondary'],
13
+ [getToneCssVar('default', 'text-accent')]: cssVars.default['text-secondary'],
14
+ [getToneCssVar('default', 'text-code')]: cssVars.default['text-secondary'],
15
+ [getToneCssVar('default', 'text-primary')]: cssVars.default['text-secondary'],
21
16
 
22
- // Card
23
- '--card-bg-color': color.bg,
24
- '--card-bg2-color': color.bg2,
25
- '--card-bg-image': checkered
26
- ? `repeating-conic-gradient(${color.bg} 0% 25%, ${color.bg2 || color.bg} 0% 50%)`
17
+ [mutableCardVariables['fg-color']]: cssVars.primary['text-secondary'],
18
+ [mutableCardVariables['muted-fg-color']]: cssVars.primary['text-secondary'],
19
+ [mutableCardVariables['icon-color']]: cssVars.primary['border-base'],
20
+ [mutableCardVariables['accent-color']]: cssVars.primary['base-bg-card'],
21
+ [mutableCardVariables['bg-color']]: cssVars.primary['bg-tint'],
22
+ [mutableCardVariables['bg-image']]: checkered
23
+ ? `repeating-conic-gradient(${cssVars.default['base-bg-card']} 0% 25%, ${cssVars.default['bg-tint']} 0% 50%)`
27
24
  : undefined,
28
- '--card-fg-color': color.fg,
29
- '--card-border-color': color.border,
30
- '--card-muted-fg-color': color.muted?.fg,
31
- '--card-accent-fg-color': color.accent?.fg,
32
- '--card-link-fg-color': color.link?.fg,
33
- '--card-code-bg-color': color.code?.bg,
34
- '--card-code-fg-color': color.code?.fg,
35
- '--card-skeleton-color-from': color.skeleton?.from,
36
- '--card-skeleton-color-to': color.skeleton?.to,
25
+ }
26
+ }
27
+
28
+ /**
29
+ * @internal
30
+ * Card overrides in selected states
31
+ */
32
+ export function _colorVarStyleSelected(): CSSObject {
33
+ return {
34
+ [mutableCardVariables['bg-color']]: cssVars.default['bg-accent'],
35
+ [mutableCardVariables['fg-color']]: cssVars.default['bg-base'],
36
+ [mutableCardVariables['muted-fg-color']]: cssVars.default['base-bg-card'],
37
+ [mutableCardVariables['accent-color']]: cssVars.default['base-bg-card'],
38
+ [mutableCardVariables['icon-color']]: cssVars.primary['bg-base'],
39
+ }
40
+ }
41
+
42
+ /**
43
+ * @internal
44
+ * Card overrides in hover
45
+ */
46
+ export function _colorVarStyleHover(): CSSObject {
47
+ return {
48
+ [mutableCardVariables['bg-color']]: cssVars.default['bg-base-hover'],
49
+ [getToneCssVar('default', 'bg-tint')]: cssVars.default['bg-base-active'],
50
+ }
51
+ }
52
+
53
+ /**
54
+ * @internal
55
+ * Card overrides in active / pressed states
56
+ */
57
+ export function _colorVarStyleActive(): CSSObject {
58
+ return {
59
+ [mutableCardVariables['bg-color']]: cssVars.default['bg-base-active'],
60
+ }
61
+ }
37
62
 
38
- // @todo: deprecate
39
- '--card-link-color': color.link?.fg,
40
- '--card-hairline-soft-color': color.border,
41
- '--card-hairline-hard-color': color.border,
63
+ /**
64
+ * @internal
65
+ * Selectable needs to redefine bg-color and fg-color
66
+ */
67
+ export function _selectableVarStyle(tone: ThemeColorToneKey): CSSObject {
68
+ return {
69
+ [mutableCardVariables['bg-color']]: 'inherit',
70
+ [mutableCardVariables['fg-color']]:
71
+ tone === 'default' ? cssVars.default['text-primary'] : cssVars.default['text-secondary'],
72
+ }
73
+ }
74
+
75
+ /**
76
+ * @internal
77
+ * Selectable overrides in disabled states, same as card but with different bg-color
78
+ */
79
+ export function _selectableVarStyleDisabled(): CSSObject {
80
+ return {
81
+ ..._colorVarStyleDisabled(),
82
+ [mutableCardVariables['bg-color']]: undefined,
42
83
  }
43
84
  }
@@ -1,4 +1,4 @@
1
- import {FocusRing} from '../../theme'
1
+ import {FocusRing, cssVars} from '../../theme'
2
2
 
3
3
  export function focusRingBorderStyle(border: {color: string; width: number}): string {
4
4
  return `inset 0 0 0 ${border.width}px ${border.color}`
@@ -12,13 +12,15 @@ export function focusRingStyle(opts: {
12
12
  const {base, border, focusRing} = opts
13
13
  const focusRingOutsetWidth = focusRing.offset + focusRing.width
14
14
  const focusRingInsetWidth = 0 - focusRing.offset
15
- const bgColor = base ? base.bg : 'var(--card-bg-color)'
15
+ const bgColor = base ? base.bg : cssVars.mutable['bg-color']
16
16
 
17
17
  return [
18
- focusRingInsetWidth > 0 && `inset 0 0 0 ${focusRingInsetWidth}px var(--card-focus-ring-color)`,
18
+ focusRingInsetWidth > 0 &&
19
+ `inset 0 0 0 ${focusRingInsetWidth}px ${cssVars.positive['border-accent']}`,
19
20
  border && focusRingBorderStyle(border),
20
21
  focusRingInsetWidth < 0 && `0 0 0 ${0 - focusRingInsetWidth}px ${bgColor}`,
21
- focusRingOutsetWidth > 0 && `0 0 0 ${focusRingOutsetWidth}px var(--card-focus-ring-color)`,
22
+ focusRingOutsetWidth > 0 &&
23
+ `0 0 0 ${focusRingOutsetWidth}px ${cssVars.positive['border-accent']}`,
22
24
  ]
23
25
  .filter(Boolean)
24
26
  .join(',')