@sanity/ui 0.37.21 → 0.38.0

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 (210) hide show
  1. package/lib/dts/src/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
  2. package/lib/dts/src/components/dialog/dialog.d.ts.map +1 -1
  3. package/lib/dts/src/components/dialog/styles.d.ts +1 -1
  4. package/lib/dts/src/components/dialog/styles.d.ts.map +1 -1
  5. package/lib/dts/src/components/hotkeys/hotkeys.d.ts.map +1 -1
  6. package/lib/dts/src/components/menu/menuGroup.d.ts.map +1 -1
  7. package/lib/dts/src/components/skeleton/skeleton.d.ts.map +1 -1
  8. package/lib/dts/src/hooks/index.d.ts +2 -1
  9. package/lib/dts/src/hooks/index.d.ts.map +1 -1
  10. package/lib/dts/src/hooks/useArrayProp.d.ts +7 -0
  11. package/lib/dts/src/hooks/useArrayProp.d.ts.map +1 -0
  12. package/lib/dts/src/hooks/useElementRect/useElementRect.d.ts +1 -1
  13. package/lib/dts/src/hooks/useElementRect/useElementRect.d.ts.map +1 -1
  14. package/lib/dts/src/hooks/useElementSize.d.ts +7 -0
  15. package/lib/dts/src/hooks/useElementSize.d.ts.map +1 -0
  16. package/lib/dts/src/index.d.ts +1 -0
  17. package/lib/dts/src/index.d.ts.map +1 -1
  18. package/lib/dts/src/observers/elementSizeObserver.d.ts +37 -0
  19. package/lib/dts/src/observers/elementSizeObserver.d.ts.map +1 -0
  20. package/lib/dts/src/observers/index.d.ts +3 -0
  21. package/lib/dts/src/observers/index.d.ts.map +1 -0
  22. package/lib/dts/src/observers/resizeObserver.d.ts +5 -0
  23. package/lib/dts/src/observers/resizeObserver.d.ts.map +1 -0
  24. package/lib/dts/src/primitives/_selectable/selectable.d.ts +1 -2
  25. package/lib/dts/src/primitives/_selectable/selectable.d.ts.map +1 -1
  26. package/lib/dts/src/primitives/avatar/avatar.d.ts.map +1 -1
  27. package/lib/dts/src/primitives/avatar/avatarCounter.d.ts.map +1 -1
  28. package/lib/dts/src/primitives/avatar/avatarStack.d.ts.map +1 -1
  29. package/lib/dts/src/primitives/avatar/styles.d.ts.map +1 -1
  30. package/lib/dts/src/primitives/badge/badge.d.ts.map +1 -1
  31. package/lib/dts/src/primitives/box/box.d.ts.map +1 -1
  32. package/lib/dts/src/primitives/button/button.d.ts.map +1 -1
  33. package/lib/dts/src/primitives/card/card.d.ts.map +1 -1
  34. package/lib/dts/src/primitives/code/code.d.ts.map +1 -1
  35. package/lib/dts/src/primitives/container/container.d.ts.map +1 -1
  36. package/lib/dts/src/primitives/container/styles.d.ts.map +1 -1
  37. package/lib/dts/src/primitives/container/types.d.ts +1 -1
  38. package/lib/dts/src/primitives/container/types.d.ts.map +1 -1
  39. package/lib/dts/src/primitives/flex/flex.d.ts.map +1 -1
  40. package/lib/dts/src/primitives/grid/grid.d.ts.map +1 -1
  41. package/lib/dts/src/primitives/heading/heading.d.ts.map +1 -1
  42. package/lib/dts/src/primitives/inline/inline.d.ts.map +1 -1
  43. package/lib/dts/src/primitives/inline/styles.d.ts.map +1 -1
  44. package/lib/dts/src/primitives/inline/types.d.ts +1 -1
  45. package/lib/dts/src/primitives/inline/types.d.ts.map +1 -1
  46. package/lib/dts/src/primitives/kbd/kbd.d.ts.map +1 -1
  47. package/lib/dts/src/primitives/label/label.d.ts.map +1 -1
  48. package/lib/dts/src/primitives/popover/popover.d.ts.map +1 -1
  49. package/lib/dts/src/primitives/select/styles.d.ts +5 -1
  50. package/lib/dts/src/primitives/select/styles.d.ts.map +1 -1
  51. package/lib/dts/src/primitives/stack/stack.d.ts.map +1 -1
  52. package/lib/dts/src/primitives/stack/styles.d.ts +1 -1
  53. package/lib/dts/src/primitives/stack/styles.d.ts.map +1 -1
  54. package/lib/dts/src/primitives/text/text.d.ts.map +1 -1
  55. package/lib/dts/src/primitives/textArea/textArea.d.ts.map +1 -1
  56. package/lib/dts/src/primitives/textInput/textInput.d.ts.map +1 -1
  57. package/lib/dts/src/primitives/tooltip/tooltip.d.ts.map +1 -1
  58. package/lib/dts/src/primitives/types.d.ts +1 -1
  59. package/lib/dts/src/primitives/types.d.ts.map +1 -1
  60. package/lib/dts/src/styles/border/types.d.ts +5 -5
  61. package/lib/dts/src/styles/border/types.d.ts.map +1 -1
  62. package/lib/dts/src/styles/box/types.d.ts +4 -4
  63. package/lib/dts/src/styles/box/types.d.ts.map +1 -1
  64. package/lib/dts/src/styles/flex/flexItemStyle.d.ts.map +1 -1
  65. package/lib/dts/src/styles/flex/types.d.ts +6 -6
  66. package/lib/dts/src/styles/flex/types.d.ts.map +1 -1
  67. package/lib/dts/src/styles/font/responsiveFont.d.ts.map +1 -1
  68. package/lib/dts/src/styles/font/types.d.ts +3 -3
  69. package/lib/dts/src/styles/font/types.d.ts.map +1 -1
  70. package/lib/dts/src/styles/grid/types.d.ts +14 -14
  71. package/lib/dts/src/styles/grid/types.d.ts.map +1 -1
  72. package/lib/dts/src/styles/helpers.d.ts +4 -4
  73. package/lib/dts/src/styles/helpers.d.ts.map +1 -1
  74. package/lib/dts/src/styles/input/responsiveInputPaddingStyle.d.ts +12 -12
  75. package/lib/dts/src/styles/input/responsiveInputPaddingStyle.d.ts.map +1 -1
  76. package/lib/dts/src/styles/input/textInputStyle.d.ts +7 -2
  77. package/lib/dts/src/styles/input/textInputStyle.d.ts.map +1 -1
  78. package/lib/dts/src/styles/margin/types.d.ts +7 -7
  79. package/lib/dts/src/styles/margin/types.d.ts.map +1 -1
  80. package/lib/dts/src/styles/padding/types.d.ts +7 -7
  81. package/lib/dts/src/styles/padding/types.d.ts.map +1 -1
  82. package/lib/dts/src/styles/radius/types.d.ts +1 -1
  83. package/lib/dts/src/styles/radius/types.d.ts.map +1 -1
  84. package/lib/dts/src/styles/shadow/shadowStyle.d.ts.map +1 -1
  85. package/lib/dts/src/styles/shadow/types.d.ts +1 -1
  86. package/lib/dts/src/styles/shadow/types.d.ts.map +1 -1
  87. package/lib/dts/src/theme/studioTheme/color.d.ts.map +1 -1
  88. package/lib/dts/src/utils/elementQuery/elementQuery.d.ts.map +1 -1
  89. package/lib/dts/src/utils/index.d.ts +0 -1
  90. package/lib/dts/src/utils/index.d.ts.map +1 -1
  91. package/lib/dts/src/utils/virtualList/virtualList.d.ts.map +1 -1
  92. package/lib/sanity-ui.js +734 -573
  93. package/lib/sanity-ui.js.map +1 -1
  94. package/lib/sanity-ui.modern.js +763 -592
  95. package/lib/sanity-ui.modern.js.map +1 -1
  96. package/lib/sanity-ui.module.js +728 -569
  97. package/lib/sanity-ui.module.js.map +1 -1
  98. package/package.json +11 -11
  99. package/src/__workshop__/color/overview.tsx +9 -11
  100. package/src/components/autocomplete/__workshop__/async.tsx +14 -12
  101. package/src/components/autocomplete/__workshop__/constrainedHeight.tsx +36 -0
  102. package/src/components/autocomplete/autocomplete.tsx +2 -2
  103. package/src/components/breadcrumbs/breadcrumbs.tsx +3 -2
  104. package/src/components/dialog/dialog.tsx +17 -9
  105. package/src/components/dialog/styles.ts +4 -4
  106. package/src/components/hotkeys/hotkeys.tsx +3 -1
  107. package/src/components/menu/__workshop__/constrainedInBoundary.tsx +11 -14
  108. package/src/components/menu/__workshop__/groups.tsx +1 -1
  109. package/src/components/menu/menuGroup.tsx +3 -2
  110. package/src/components/menu/menuItem.tsx +3 -3
  111. package/src/components/skeleton/skeleton.tsx +10 -1
  112. package/src/components/skeleton/textSkeleton.tsx +7 -7
  113. package/src/hooks/index.ts +2 -1
  114. package/src/hooks/useArrayProp.ts +23 -0
  115. package/src/hooks/useElementRect/useElementRect.ts +4 -16
  116. package/src/hooks/useElementSize.ts +18 -0
  117. package/src/index.ts +1 -0
  118. package/src/observers/elementSizeObserver.ts +116 -0
  119. package/src/observers/index.ts +2 -0
  120. package/src/{utils → observers}/resizeObserver.ts +1 -3
  121. package/src/primitives/_selectable/selectable.tsx +5 -4
  122. package/src/primitives/avatar/avatar.tsx +7 -5
  123. package/src/primitives/avatar/avatarCounter.tsx +12 -11
  124. package/src/primitives/avatar/avatarStack.tsx +15 -10
  125. package/src/primitives/avatar/styles.ts +2 -2
  126. package/src/primitives/badge/badge.tsx +3 -2
  127. package/src/primitives/box/box.tsx +26 -25
  128. package/src/primitives/button/button.tsx +22 -10
  129. package/src/primitives/card/card.tsx +8 -7
  130. package/src/primitives/checkbox/__workshop__/example.tsx +4 -2
  131. package/src/primitives/checkbox/__workshop__/props.tsx +4 -2
  132. package/src/primitives/checkbox/__workshop__/readOnly.tsx +4 -2
  133. package/src/primitives/code/__workshop__/props.tsx +1 -1
  134. package/src/primitives/code/code.tsx +2 -1
  135. package/src/primitives/container/container.tsx +10 -1
  136. package/src/primitives/container/styles.ts +2 -2
  137. package/src/primitives/container/types.ts +1 -1
  138. package/src/primitives/flex/flex.tsx +6 -5
  139. package/src/primitives/grid/__workshop__/responsive.tsx +13 -12
  140. package/src/primitives/grid/grid.tsx +9 -8
  141. package/src/primitives/heading/__workshop__/opticalAlignment.tsx +19 -7
  142. package/src/primitives/heading/heading.tsx +3 -2
  143. package/src/primitives/inline/inline.tsx +12 -6
  144. package/src/primitives/inline/styles.ts +2 -2
  145. package/src/primitives/inline/types.ts +1 -1
  146. package/src/primitives/kbd/kbd.tsx +2 -1
  147. package/src/primitives/label/label.tsx +4 -3
  148. package/src/primitives/popover/__workshop__/{margins.tsx → MarginsStory.tsx} +1 -1
  149. package/src/primitives/popover/__workshop__/{matchReferenceWidth.tsx → MatchReferenceWidthStory.tsx} +0 -0
  150. package/src/primitives/popover/__workshop__/{plain.tsx → PlainStory.tsx} +12 -14
  151. package/src/primitives/popover/__workshop__/{recursive.tsx → RecursiveStory.tsx} +4 -1
  152. package/src/primitives/popover/__workshop__/RightAlignedStory.tsx +60 -0
  153. package/src/primitives/popover/__workshop__/TestStory.tsx +79 -0
  154. package/src/primitives/popover/__workshop__/index.ts +10 -5
  155. package/src/primitives/popover/popover.tsx +29 -10
  156. package/src/primitives/select/select.tsx +9 -9
  157. package/src/primitives/select/styles.ts +10 -4
  158. package/src/primitives/stack/stack.tsx +2 -1
  159. package/src/primitives/stack/styles.ts +3 -3
  160. package/src/primitives/text/__workshop__/opticalAlignment.tsx +15 -5
  161. package/src/primitives/text/text.tsx +3 -2
  162. package/src/primitives/textArea/__workshop__/plain.tsx +23 -18
  163. package/src/primitives/textArea/textArea.tsx +21 -5
  164. package/src/primitives/textInput/__workshop__/clearButton.tsx +14 -8
  165. package/src/primitives/textInput/__workshop__/index.ts +2 -2
  166. package/src/primitives/textInput/__workshop__/plain.tsx +39 -32
  167. package/src/primitives/textInput/__workshop__/tones.tsx +234 -95
  168. package/src/primitives/textInput/__workshop__/typed.tsx +8 -2
  169. package/src/primitives/textInput/textInput.tsx +47 -12
  170. package/src/primitives/tooltip/__workshop__/props.tsx +7 -2
  171. package/src/primitives/tooltip/tooltip.tsx +19 -9
  172. package/src/primitives/types.ts +1 -1
  173. package/src/styles/border/borderStyle.ts +6 -6
  174. package/src/styles/border/types.ts +5 -5
  175. package/src/styles/box/boxStyle.ts +5 -5
  176. package/src/styles/box/types.ts +4 -4
  177. package/src/styles/flex/flexItemStyle.ts +5 -4
  178. package/src/styles/flex/flexStyle.ts +6 -6
  179. package/src/styles/flex/types.ts +6 -6
  180. package/src/styles/font/responsiveFont.ts +2 -4
  181. package/src/styles/font/textAlignStyle.ts +2 -2
  182. package/src/styles/font/types.ts +4 -3
  183. package/src/styles/grid/gridItemStyle.ts +7 -7
  184. package/src/styles/grid/gridStyle.ts +9 -9
  185. package/src/styles/grid/types.ts +14 -14
  186. package/src/styles/helpers.ts +9 -9
  187. package/src/styles/input/responsiveInputPaddingStyle.ts +24 -27
  188. package/src/styles/input/textInputStyle.ts +92 -80
  189. package/src/styles/margin/marginStyle.ts +8 -8
  190. package/src/styles/margin/marginsStyle.test.ts +1 -1
  191. package/src/styles/margin/types.ts +7 -7
  192. package/src/styles/padding/paddingStyle.test.ts +1 -1
  193. package/src/styles/padding/paddingStyle.ts +8 -8
  194. package/src/styles/padding/types.ts +7 -7
  195. package/src/styles/radius/radiusStyle.ts +2 -2
  196. package/src/styles/radius/types.ts +1 -1
  197. package/src/styles/shadow/shadowStyle.ts +2 -5
  198. package/src/styles/shadow/types.ts +1 -1
  199. package/src/theme/studioTheme/color.ts +15 -14
  200. package/src/theme/studioTheme/fonts.ts +4 -4
  201. package/src/utils/elementQuery/elementQuery.tsx +5 -18
  202. package/src/utils/index.ts +0 -1
  203. package/src/utils/layer/layerProvider.tsx +2 -2
  204. package/src/utils/virtualList/virtualList.tsx +3 -1
  205. package/lib/dts/src/hooks/useResponsiveProp.d.ts +0 -6
  206. package/lib/dts/src/hooks/useResponsiveProp.d.ts.map +0 -1
  207. package/lib/dts/src/utils/resizeObserver.d.ts +0 -6
  208. package/lib/dts/src/utils/resizeObserver.d.ts.map +0 -1
  209. package/src/hooks/useResponsiveProp.ts +0 -10
  210. package/src/primitives/popover/__workshop__/rightAligned.tsx +0 -57
@@ -1,14 +1,17 @@
1
1
  import {css, CSSObject, FlattenSimpleInterpolation} from 'styled-components'
2
- import {ThemeFontWeightKey} from '../../theme'
2
+ import {ThemeColorSchemeKey, ThemeFontWeightKey} from '../../theme'
3
+ import {CardTone} from '../../types'
3
4
  import {focusRingBorderStyle, focusRingStyle} from '../focusRing'
4
- import {getResponsiveProp, rem, responsive} from '../helpers'
5
+ import {rem, _responsive} from '../helpers'
5
6
  import {ThemeProps} from '../types'
6
7
 
7
8
  /**
8
9
  * @internal
9
10
  */
10
11
  export interface TextInputInputStyleProps {
11
- $fontSize?: number | number[]
12
+ $fontSize: number[]
13
+ $scheme: ThemeColorSchemeKey
14
+ $tone: CardTone
12
15
  $weight?: ThemeFontWeightKey
13
16
  }
14
17
 
@@ -19,6 +22,8 @@ export interface TextInputRepresentationStyleProps {
19
22
  $border?: boolean
20
23
  $hasPrefix?: boolean
21
24
  $hasSuffix?: boolean
25
+ $scheme: ThemeColorSchemeKey
26
+ $tone: CardTone
22
27
  }
23
28
 
24
29
  const ROOT_STYLE = css`
@@ -36,14 +41,11 @@ export function textInputRootStyle(): FlattenSimpleInterpolation {
36
41
  export function textInputBaseStyle(
37
42
  props: TextInputInputStyleProps & ThemeProps
38
43
  ): FlattenSimpleInterpolation {
39
- const {theme, $weight} = props
44
+ const {theme, $scheme, $tone, $weight} = props
40
45
  const font = theme.sanity.fonts.text
41
46
  const color = theme.sanity.color.input
42
47
 
43
48
  return css`
44
- --input-fg-color: ${color.default.enabled.fg};
45
- --input-placeholder-color: ${color.default.enabled.placeholder};
46
-
47
49
  appearance: none;
48
50
  background: none;
49
51
  border: 0;
@@ -57,7 +59,6 @@ export function textInputBaseStyle(
57
59
  position: relative;
58
60
  z-index: 1;
59
61
  display: block;
60
- color: var(--input-fg-color);
61
62
 
62
63
  /* NOTE: This is a hack to disable Chrome’s autofill styles */
63
64
  &:-webkit-autofill,
@@ -69,37 +70,44 @@ export function textInputBaseStyle(
69
70
  transition-delay: 86400s /* 24h */;
70
71
  }
71
72
 
72
- &::placeholder {
73
- color: var(--input-placeholder-color);
74
- }
75
-
76
73
  /* &:is(textarea) */
77
74
  &[data-as='textarea'] {
78
75
  resize: none;
79
76
  }
80
77
 
81
- /* enabled */
82
- &:not(:invalid):not(:disabled):not(:read-only) {
78
+ color: var(--input-fg-color);
79
+
80
+ &::placeholder {
81
+ color: var(--input-placeholder-color);
82
+ }
83
+
84
+ &[data-scheme='${$scheme}'][data-tone='${$tone}'] {
83
85
  --input-fg-color: ${color.default.enabled.fg};
84
86
  --input-placeholder-color: ${color.default.enabled.placeholder};
85
- }
86
87
 
87
- /* disabled */
88
- &:not(:invalid):disabled {
89
- --input-fg-color: ${color.default.disabled.fg};
90
- --input-placeholder-color: ${color.default.disabled.placeholder};
91
- }
88
+ /* enabled */
89
+ &:not(:invalid):not(:disabled):not(:read-only) {
90
+ --input-fg-color: ${color.default.enabled.fg};
91
+ --input-placeholder-color: ${color.default.enabled.placeholder};
92
+ }
92
93
 
93
- /* invalid */
94
- &:invalid {
95
- --input-fg-color: ${color.invalid.enabled.fg};
96
- --input-placeholder-color: ${color.invalid.enabled.placeholder};
97
- }
94
+ /* disabled */
95
+ &:not(:invalid):disabled {
96
+ --input-fg-color: ${color.default.disabled.fg};
97
+ --input-placeholder-color: ${color.default.disabled.placeholder};
98
+ }
98
99
 
99
- /* readOnly */
100
- &:read-only {
101
- --input-fg-color: ${color.default.readOnly.fg};
102
- --input-placeholder-color: ${color.default.readOnly.placeholder};
100
+ /* invalid */
101
+ &:invalid {
102
+ --input-fg-color: ${color.invalid.enabled.fg};
103
+ --input-placeholder-color: ${color.invalid.enabled.placeholder};
104
+ }
105
+
106
+ /* readOnly */
107
+ &:read-only {
108
+ --input-fg-color: ${color.default.readOnly.fg};
109
+ --input-placeholder-color: ${color.default.readOnly.placeholder};
110
+ }
103
111
  }
104
112
  `
105
113
  }
@@ -108,7 +116,7 @@ export function textInputFontSizeStyle(props: TextInputInputStyleProps & ThemePr
108
116
  const {theme} = props
109
117
  const {fonts, media} = theme.sanity
110
118
 
111
- return responsive(media, getResponsiveProp(props.$fontSize, [2]), (sizeIndex) => {
119
+ return _responsive(media, props.$fontSize, (sizeIndex) => {
112
120
  const size = fonts.text.sizes[sizeIndex] || fonts.text.sizes[2]
113
121
 
114
122
  return {
@@ -121,13 +129,11 @@ export function textInputFontSizeStyle(props: TextInputInputStyleProps & ThemePr
121
129
  export function textInputRepresentationStyle(
122
130
  props: TextInputRepresentationStyleProps & ThemeProps
123
131
  ): FlattenSimpleInterpolation {
124
- const {$border, $hasPrefix, $hasSuffix, theme} = props
132
+ const {$border, $hasPrefix, $hasSuffix, $scheme, $tone, theme} = props
125
133
  const {focusRing, input} = theme.sanity
126
134
  const color = theme.sanity.color.input
127
135
 
128
136
  return css`
129
- --card-bg-color: ${color.default.enabled.bg};
130
- --card-fg-color: ${color.default.enabled.fg};
131
137
  --input-box-shadow: none;
132
138
 
133
139
  position: absolute;
@@ -138,6 +144,7 @@ export function textInputRepresentationStyle(
138
144
  display: block;
139
145
  pointer-events: none;
140
146
  z-index: 0;
147
+
141
148
  background-color: var(--card-bg-color);
142
149
  box-shadow: var(--input-box-shadow);
143
150
 
@@ -146,65 +153,70 @@ export function textInputRepresentationStyle(
146
153
  border-top-right-radius: ${$hasSuffix ? 0 : undefined};
147
154
  border-bottom-right-radius: ${$hasSuffix ? 0 : undefined};
148
155
 
149
- /* enabled */
150
- *:not(:disabled) + && {
151
- --input-box-shadow: ${$border
152
- ? focusRingBorderStyle({color: color.default.enabled.border, width: input.border.width})
153
- : undefined};
154
- }
156
+ &[data-scheme='${$scheme}'][data-tone='${$tone}'] {
157
+ --card-bg-color: ${color.default.enabled.bg};
158
+ --card-fg-color: ${color.default.enabled.fg};
155
159
 
156
- /* invalid */
157
- *:not(:disabled):invalid + && {
158
- --card-bg-color: ${color.invalid.enabled.bg};
159
- --card-fg-color: ${color.invalid.enabled.fg};
160
- --input-box-shadow: ${$border
161
- ? focusRingBorderStyle({color: color.invalid.enabled.border, width: input.border.width})
162
- : 'none'};
163
- }
164
-
165
- /* focused */
166
- *:not(:disabled):focus + && {
167
- --input-box-shadow: ${focusRingStyle({
168
- border: $border
169
- ? {color: color.default.enabled.border, width: input.border.width}
170
- : undefined,
171
- focusRing,
172
- })};
173
- }
160
+ /* enabled */
161
+ *:not(:disabled) + & {
162
+ --input-box-shadow: ${$border
163
+ ? focusRingBorderStyle({color: color.default.enabled.border, width: input.border.width})
164
+ : undefined};
165
+ }
174
166
 
175
- /* disabled */
176
- *:disabled + && {
177
- --card-bg-color: ${color.default.disabled.bg};
178
- --card-fg-color: ${color.default.disabled.fg};
179
- --input-box-shadow: ${$border
180
- ? focusRingBorderStyle({
181
- color: color.default.disabled.border,
182
- width: input.border.width,
183
- })
184
- : 'none'};
185
- }
167
+ /* invalid */
168
+ *:not(:disabled):invalid + & {
169
+ --card-bg-color: ${color.invalid.enabled.bg};
170
+ --card-fg-color: ${color.invalid.enabled.fg};
171
+ --input-box-shadow: ${$border
172
+ ? focusRingBorderStyle({color: color.invalid.enabled.border, width: input.border.width})
173
+ : 'none'};
174
+ }
186
175
 
187
- /* hovered */
188
- @media (hover: hover) {
189
- *:not(:disabled):not(:read-only):not(:invalid):hover + && {
190
- --card-bg-color: ${color.default.hovered.bg};
191
- --card-fg-color: ${color.default.hovered.fg};
176
+ /* focused */
177
+ *:not(:disabled):focus + & {
178
+ --input-box-shadow: ${focusRingStyle({
179
+ border: $border
180
+ ? {color: color.default.enabled.border, width: input.border.width}
181
+ : undefined,
182
+ focusRing,
183
+ })};
192
184
  }
193
185
 
194
- *:not(:disabled):not(:read-only):not(:invalid):not(:focus):hover + && {
186
+ /* disabled */
187
+ *:disabled + & {
188
+ --card-bg-color: ${color.default.disabled.bg} !important;
189
+ --card-fg-color: ${color.default.disabled.fg} !important;
195
190
  --input-box-shadow: ${$border
196
191
  ? focusRingBorderStyle({
197
- color: color.default.hovered.border,
192
+ color: color.default.disabled.border,
198
193
  width: input.border.width,
199
194
  })
200
195
  : 'none'};
201
196
  }
202
- }
203
197
 
204
- /* readOnly */
205
- *:read-only + && {
206
- --card-bg-color: ${color.default.readOnly.bg};
207
- --card-fg-color: ${color.default.readOnly.fg};
198
+ /* readOnly */
199
+ *:read-only + & {
200
+ --card-bg-color: ${color.default.readOnly.bg} !important;
201
+ --card-fg-color: ${color.default.readOnly.fg} !important;
202
+ }
203
+
204
+ /* hovered */
205
+ @media (hover: hover) {
206
+ *:not(:disabled):not(:read-only):not(:invalid):hover + & {
207
+ --card-bg-color: ${color.default.hovered.bg};
208
+ --card-fg-color: ${color.default.hovered.fg};
209
+ }
210
+
211
+ *:not(:disabled):not(:read-only):not(:invalid):not(:focus):hover + & {
212
+ --input-box-shadow: ${$border
213
+ ? focusRingBorderStyle({
214
+ color: color.default.hovered.border,
215
+ width: input.border.width,
216
+ })
217
+ : 'none'};
218
+ }
219
+ }
208
220
  }
209
221
  `
210
222
  }
@@ -1,5 +1,5 @@
1
1
  import {CSSObject} from 'styled-components'
2
- import {getResponsiveProp, getResponsiveSpace} from '../helpers'
2
+ import {_getResponsiveSpace} from '../helpers'
3
3
  import {ThemeProps} from '../types'
4
4
  import {ResponsiveMarginStyleProps} from './types'
5
5
 
@@ -9,12 +9,12 @@ export function responsiveMarginStyle(
9
9
  const {theme} = props
10
10
 
11
11
  return [
12
- getResponsiveSpace(theme, ['margin'], getResponsiveProp(props.$margin)),
13
- getResponsiveSpace(theme, ['marginLeft', 'marginRight'], getResponsiveProp(props.$marginX)),
14
- getResponsiveSpace(theme, ['marginTop', 'marginBottom'], getResponsiveProp(props.$marginY)),
15
- getResponsiveSpace(theme, ['marginTop'], getResponsiveProp(props.$marginTop)),
16
- getResponsiveSpace(theme, ['marginRight'], getResponsiveProp(props.$marginRight)),
17
- getResponsiveSpace(theme, ['marginBottom'], getResponsiveProp(props.$marginBottom)),
18
- getResponsiveSpace(theme, ['marginLeft'], getResponsiveProp(props.$marginLeft)),
12
+ _getResponsiveSpace(theme, ['margin'], props.$margin),
13
+ _getResponsiveSpace(theme, ['marginLeft', 'marginRight'], props.$marginX),
14
+ _getResponsiveSpace(theme, ['marginTop', 'marginBottom'], props.$marginY),
15
+ _getResponsiveSpace(theme, ['marginTop'], props.$marginTop),
16
+ _getResponsiveSpace(theme, ['marginRight'], props.$marginRight),
17
+ _getResponsiveSpace(theme, ['marginBottom'], props.$marginBottom),
18
+ _getResponsiveSpace(theme, ['marginLeft'], props.$marginLeft),
19
19
  ].filter(Boolean) as CSSObject[][]
20
20
  }
@@ -6,7 +6,7 @@ const theme: Theme = {sanity: {...restTheme, color: color.light.default}}
6
6
 
7
7
  describe('styles/margin', () => {
8
8
  it('should 1', () => {
9
- const styles = responsiveMarginStyle({$margin: 0, theme})
9
+ const styles = responsiveMarginStyle({$margin: [0], theme})
10
10
 
11
11
  expect(styles).toEqual([[{margin: 0}]])
12
12
  })
@@ -1,9 +1,9 @@
1
1
  export interface ResponsiveMarginStyleProps {
2
- $margin?: number | number[]
3
- $marginX?: number | number[]
4
- $marginY?: number | number[]
5
- $marginTop?: number | number[]
6
- $marginRight?: number | number[]
7
- $marginBottom?: number | number[]
8
- $marginLeft?: number | number[]
2
+ $margin?: number[]
3
+ $marginX?: number[]
4
+ $marginY?: number[]
5
+ $marginTop?: number[]
6
+ $marginRight?: number[]
7
+ $marginBottom?: number[]
8
+ $marginLeft?: number[]
9
9
  }
@@ -6,7 +6,7 @@ const theme: Theme = {sanity: {...restTheme, color: color.light.default}}
6
6
 
7
7
  describe('styles/padding', () => {
8
8
  it('should 1', () => {
9
- const styles = responsivePaddingStyle({$padding: 0, theme})
9
+ const styles = responsivePaddingStyle({$padding: [0], theme})
10
10
 
11
11
  expect(styles).toEqual([[{padding: 0}]])
12
12
  })
@@ -1,5 +1,5 @@
1
1
  import {CSSObject} from 'styled-components'
2
- import {getResponsiveProp, getResponsiveSpace} from '../helpers'
2
+ import {_getResponsiveSpace} from '../helpers'
3
3
  import {ThemeProps} from '../types'
4
4
  import {ResponsivePaddingStyleProps} from './types'
5
5
 
@@ -9,12 +9,12 @@ export function responsivePaddingStyle(
9
9
  const {theme} = props
10
10
 
11
11
  return [
12
- getResponsiveSpace(theme, ['padding'], getResponsiveProp(props.$padding)),
13
- getResponsiveSpace(theme, ['paddingLeft', 'paddingRight'], getResponsiveProp(props.$paddingX)),
14
- getResponsiveSpace(theme, ['paddingTop', 'paddingBottom'], getResponsiveProp(props.$paddingY)),
15
- getResponsiveSpace(theme, ['paddingTop'], getResponsiveProp(props.$paddingTop)),
16
- getResponsiveSpace(theme, ['paddingRight'], getResponsiveProp(props.$paddingRight)),
17
- getResponsiveSpace(theme, ['paddingBottom'], getResponsiveProp(props.$paddingBottom)),
18
- getResponsiveSpace(theme, ['paddingLeft'], getResponsiveProp(props.$paddingLeft)),
12
+ _getResponsiveSpace(theme, ['padding'], props.$padding),
13
+ _getResponsiveSpace(theme, ['paddingLeft', 'paddingRight'], props.$paddingX),
14
+ _getResponsiveSpace(theme, ['paddingTop', 'paddingBottom'], props.$paddingY),
15
+ _getResponsiveSpace(theme, ['paddingTop'], props.$paddingTop),
16
+ _getResponsiveSpace(theme, ['paddingRight'], props.$paddingRight),
17
+ _getResponsiveSpace(theme, ['paddingBottom'], props.$paddingBottom),
18
+ _getResponsiveSpace(theme, ['paddingLeft'], props.$paddingLeft),
19
19
  ].filter(Boolean) as CSSObject[][]
20
20
  }
@@ -2,11 +2,11 @@
2
2
  * @internal
3
3
  */
4
4
  export interface ResponsivePaddingStyleProps {
5
- $padding?: number | number[]
6
- $paddingX?: number | number[]
7
- $paddingY?: number | number[]
8
- $paddingTop?: number | number[]
9
- $paddingRight?: number | number[]
10
- $paddingBottom?: number | number[]
11
- $paddingLeft?: number | number[]
5
+ $padding?: number[]
6
+ $paddingX?: number[]
7
+ $paddingY?: number[]
8
+ $paddingTop?: number[]
9
+ $paddingRight?: number[]
10
+ $paddingBottom?: number[]
11
+ $paddingLeft?: number[]
12
12
  }
@@ -1,5 +1,5 @@
1
1
  import {CSSObject} from 'styled-components'
2
- import {getResponsiveProp, rem, responsive} from '../helpers'
2
+ import {rem, _responsive} from '../helpers'
3
3
  import {ThemeProps} from '../types'
4
4
  import {ResponsiveRadiusStyleProps} from './types'
5
5
 
@@ -7,7 +7,7 @@ export function responsiveRadiusStyle(props: ResponsiveRadiusStyleProps & ThemeP
7
7
  const {theme} = props
8
8
  const {media, radius} = theme.sanity
9
9
 
10
- return responsive(media, getResponsiveProp(props.$radius), (radiusIndex) => ({
10
+ return _responsive(media, props.$radius, (radiusIndex) => ({
11
11
  borderRadius: rem(radius[radiusIndex]),
12
12
  }))
13
13
  }
@@ -2,5 +2,5 @@
2
2
  * @internal
3
3
  */
4
4
  export interface ResponsiveRadiusStyleProps {
5
- $radius?: number | number[]
5
+ $radius: number[]
6
6
  }
@@ -1,8 +1,7 @@
1
1
  import {CSSObject} from 'styled-components'
2
- import {getResponsiveProp} from '..'
3
2
  import {EMPTY_RECORD} from '../../constants'
4
3
  import {BoxShadow, ThemeShadow} from '../../theme'
5
- import {rem, responsive} from '../helpers'
4
+ import {rem, _responsive} from '../helpers'
6
5
  import {ThemeProps} from '../types'
7
6
  import {ResponsiveShadowStyleProps} from './types'
8
7
 
@@ -25,7 +24,5 @@ export function responsiveShadowStyle(props: ResponsiveShadowStyleProps & ThemeP
25
24
  const {theme} = props
26
25
  const {media, shadows} = theme.sanity
27
26
 
28
- return responsive(media, getResponsiveProp(props.$shadow), (shadow) =>
29
- shadowStyle(shadows[shadow])
30
- )
27
+ return _responsive(media, props.$shadow, (shadow) => shadowStyle(shadows[shadow]))
31
28
  }
@@ -2,5 +2,5 @@
2
2
  * @internal
3
3
  */
4
4
  export interface ResponsiveShadowStyleProps {
5
- $shadow?: number | number[]
5
+ $shadow: number[]
6
6
  }
@@ -17,18 +17,19 @@ const NEUTRAL_TONES = ['default', 'transparent']
17
17
  export const color = createColorTheme({
18
18
  base: ({dark, name}) => {
19
19
  if (name === 'default') {
20
- const skeletonFrom = dark ? hues.gray[900].hex : hues.gray[100].hex
20
+ const tints = hues.gray
21
+ const skeletonFrom = dark ? tints[900].hex : tints[100].hex
21
22
 
22
23
  return {
23
24
  fg: dark ? white.hex : black.hex,
24
25
  bg: dark ? black.hex : white.hex,
25
- border: hues.gray[dark ? 800 : 200].hex,
26
+ border: tints[dark ? 800 : 200].hex,
26
27
  focusRing: hues.blue[dark ? 500 : 500].hex,
27
28
  shadow: {
28
- outline: rgba(hues.gray[500].hex, 0.4),
29
- umbra: rgba(dark ? black.hex : hues.gray[500].hex, 0.2),
30
- penumbra: rgba(dark ? black.hex : hues.gray[500].hex, 0.14),
31
- ambient: rgba(dark ? black.hex : hues.gray[500].hex, 0.12),
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),
32
33
  },
33
34
  skeleton: {
34
35
  from: skeletonFrom,
@@ -47,10 +48,10 @@ export const color = createColorTheme({
47
48
  border: tints[dark ? 800 : 300].hex,
48
49
  focusRing: hues.blue[500].hex,
49
50
  shadow: {
50
- outline: rgba(tints[500].hex, dark ? 0.2 : 0.4),
51
- umbra: rgba(dark ? black.hex : tints[500].hex, 0.2),
52
- penumbra: rgba(dark ? black.hex : tints[500].hex, 0.14),
53
- ambient: rgba(dark ? black.hex : tints[500].hex, 0.12),
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),
54
55
  },
55
56
  skeleton: {
56
57
  from: skeletonFrom,
@@ -68,10 +69,10 @@ export const color = createColorTheme({
68
69
  border: tints[dark ? 800 : 200].hex,
69
70
  focusRing: tints[500].hex,
70
71
  shadow: {
71
- outline: rgba(tints[500].hex, dark ? 0.2 : 0.4),
72
- umbra: rgba(dark ? black.hex : tints[500].hex, 0.2),
73
- penumbra: rgba(dark ? black.hex : tints[500].hex, 0.14),
74
- ambient: rgba(dark ? black.hex : tints[500].hex, 0.12),
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),
75
76
  },
76
77
  skeleton: {
77
78
  from: skeletonFrom,
@@ -95,16 +95,16 @@ export const fonts: ThemeFonts = {
95
95
  letterSpacing: 0,
96
96
  },
97
97
  {
98
- ascenderHeight: 9,
99
- descenderHeight: 7,
98
+ ascenderHeight: 8,
99
+ descenderHeight: 8,
100
100
  fontSize: 33,
101
101
  iconSize: 49,
102
102
  lineHeight: 39,
103
103
  letterSpacing: 0,
104
104
  },
105
105
  {
106
- ascenderHeight: 10,
107
- descenderHeight: 8,
106
+ ascenderHeight: 9,
107
+ descenderHeight: 9,
108
108
  fontSize: 38,
109
109
  iconSize: 53,
110
110
  lineHeight: 45,
@@ -1,7 +1,6 @@
1
- import React, {forwardRef, useCallback, useEffect, useMemo, useState} from 'react'
2
- import {useForwardedRef} from '../../hooks'
1
+ import React, {forwardRef, useCallback, useMemo, useState} from 'react'
2
+ import {useElementSize, useForwardedRef} from '../../hooks'
3
3
  import {useTheme} from '../../theme'
4
- import {ResizeObserver} from '../resizeObserver'
5
4
  import {findMaxBreakpoints, findMinBreakpoints} from './helpers'
6
5
 
7
6
  /**
@@ -23,23 +22,11 @@ export const ElementQuery = forwardRef(function ElementQuery(
23
22
  ) {
24
23
  const theme = useTheme()
25
24
  const {children, media = theme.sanity.media, ...restProps} = props
26
- const [width, setWidth] = useState(() => window.innerWidth)
25
+
27
26
  const forwardedRef = useForwardedRef(ref)
28
27
  const [element, setElement] = useState<HTMLDivElement | null>(null)
29
-
30
- useEffect(() => {
31
- if (!element) return
32
-
33
- const handleResizeEntries: ResizeObserverCallback = (entries) => {
34
- setWidth(entries[0].contentRect.width)
35
- }
36
-
37
- const ro = new ResizeObserver(handleResizeEntries)
38
-
39
- ro.observe(element)
40
-
41
- return () => ro.disconnect()
42
- }, [element])
28
+ const elementSize = useElementSize(element)
29
+ const width = useMemo(() => elementSize?.border.width ?? window.innerWidth, [elementSize])
43
30
 
44
31
  const max = useMemo(() => findMaxBreakpoints(media, width), [media, width])
45
32
  const min = useMemo(() => findMinBreakpoints(media, width), [media, width])
@@ -3,6 +3,5 @@ export * from './elementQuery'
3
3
  export * from './errorBoundary'
4
4
  export * from './layer'
5
5
  export * from './portal'
6
- export * from './resizeObserver'
7
6
  export * from './srOnly'
8
7
  export * from './virtualList'
@@ -1,5 +1,5 @@
1
1
  import React, {useCallback, useContext, useEffect, useMemo, useState} from 'react'
2
- import {useMediaIndex, useResponsiveProp} from '../../hooks'
2
+ import {useMediaIndex, useArrayProp} from '../../hooks'
3
3
  import {LayerContext} from './layerContext'
4
4
  import {LayerContextValue} from './types'
5
5
 
@@ -17,7 +17,7 @@ export interface LayerProviderProps {
17
17
  export function LayerProvider(props: LayerProviderProps): React.ReactElement {
18
18
  const {children, zOffset: zOffsetProp = 0} = props
19
19
  const parent = useContext(LayerContext)
20
- const zOffset = useResponsiveProp(zOffsetProp)
20
+ const zOffset = useArrayProp(zOffsetProp)
21
21
  const maxMediaIndex = zOffset.length - 1
22
22
  const mediaIndex = Math.min(useMediaIndex(), maxMediaIndex)
23
23
  const zIndex = parent ? parent.zIndex + zOffset[mediaIndex] : zOffset[mediaIndex]
@@ -2,6 +2,7 @@ import React, {forwardRef, useEffect, useMemo, useRef, useState} from 'react'
2
2
  import styled from 'styled-components'
3
3
  import {_isScrollable} from '../../helpers'
4
4
  import {useForwardedRef} from '../../hooks'
5
+ import {_ResizeObserver} from '../../observers'
5
6
  import {StackProps} from '../../primitives'
6
7
  import {useTheme} from '../../theme'
7
8
 
@@ -86,7 +87,7 @@ export const VirtualList = forwardRef(function VirtualList(
86
87
 
87
88
  scrollEl.addEventListener('scroll', handleScroll, {passive: true})
88
89
 
89
- const ro = new ResizeObserver((entries) => {
90
+ const ro = new _ResizeObserver((entries) => {
90
91
  setScrollHeight(entries[0].contentRect.height)
91
92
  })
92
93
 
@@ -96,6 +97,7 @@ export const VirtualList = forwardRef(function VirtualList(
96
97
 
97
98
  return () => {
98
99
  scrollEl.removeEventListener('scroll', handleScroll)
100
+
99
101
  ro.unobserve(scrollEl)
100
102
  ro.disconnect()
101
103
  }
@@ -1,6 +0,0 @@
1
- /**
2
- * This API might change. DO NOT USE IN PRODUCTION.
3
- * @beta
4
- */
5
- export declare function useResponsiveProp<T = number>(val: T | T[] | undefined, defaultVal?: T[]): T[];
6
- //# sourceMappingURL=useResponsiveProp.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useResponsiveProp.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useResponsiveProp.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAE7F"}
@@ -1,6 +0,0 @@
1
- /**
2
- * @internal
3
- */
4
- declare const RO: typeof ResizeObserver;
5
- export { RO as ResizeObserver };
6
- //# sourceMappingURL=resizeObserver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resizeObserver.d.ts","sourceRoot":"","sources":["../../../../src/utils/resizeObserver.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,QAAA,MAAM,EAAE,EAAE,OAAO,cAGW,CAAA;AAE5B,OAAO,EAAC,EAAE,IAAI,cAAc,EAAC,CAAA"}
@@ -1,10 +0,0 @@
1
- import {useMemo} from 'react'
2
- import {getResponsiveProp} from '../styles'
3
-
4
- /**
5
- * This API might change. DO NOT USE IN PRODUCTION.
6
- * @beta
7
- */
8
- export function useResponsiveProp<T = number>(val: T | T[] | undefined, defaultVal?: T[]): T[] {
9
- return useMemo(() => getResponsiveProp(val, defaultVal), [defaultVal, val])
10
- }