@sanity/ui 1.8.1 → 2.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +40 -14
- package/dist/index.esm.js +377 -134
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +376 -133
- package/dist/index.js.map +1 -1
- package/package.json +34 -16
- package/src/components/autocomplete/autocomplete.tsx +2 -1
- package/src/components/dialog/dialog.tsx +3 -3
- package/src/components/hotkeys/hotkeys.tsx +2 -1
- package/src/components/menu/menuButton.tsx +2 -2
- package/src/components/menu/menuGroup.tsx +2 -2
- package/src/components/tab/tab.tsx +2 -1
- package/src/primitives/avatar/styles.ts +1 -1
- package/src/primitives/button/button.tsx +6 -7
- package/src/primitives/button/styles.ts +20 -3
- package/src/primitives/card/styles.ts +1 -1
- package/src/primitives/checkbox/checkbox.tsx +1 -0
- package/src/primitives/checkbox/styles.ts +47 -17
- package/src/primitives/kbd/kbd.tsx +6 -6
- package/src/primitives/popover/constants.ts +15 -1
- package/src/primitives/popover/popover.tsx +3 -1
- package/src/primitives/popover/popoverCard.tsx +2 -2
- package/src/primitives/radio/radio.tsx +1 -0
- package/src/primitives/radio/styles.ts +17 -4
- package/src/primitives/select/select.tsx +3 -2
- package/src/primitives/select/styles.ts +2 -1
- package/src/primitives/switch/__workshop__/props.tsx +4 -4
- package/src/primitives/switch/styles.ts +19 -12
- package/src/primitives/text/styles.ts +1 -0
- package/src/primitives/textInput/textInput.tsx +2 -1
- package/src/primitives/tooltip/constants.ts +16 -0
- package/src/primitives/tooltip/tooltip.tsx +5 -3
- package/src/primitives/types.ts +3 -2
- package/src/styles/colorVars/colorVarsStyle.ts +2 -0
- package/src/styles/focusRing/index.ts +3 -1
- package/src/styles/input/textInputStyle.ts +2 -1
- package/src/styles/radius/radiusStyle.ts +14 -4
- package/src/styles/radius/types.ts +3 -1
- package/src/theme/lib/theme/avatar.ts +3 -0
- package/src/theme/lib/theme/color/_generic/types.ts +1 -0
- package/src/theme/lib/theme/color/color.test.ts +1 -0
- package/src/theme/lib/theme/color/defaults.ts +8 -0
- package/src/theme/lib/theme/color/input/types.ts +1 -0
- package/src/theme/lib/theme/input.ts +11 -0
- package/src/theme/lib/theme/theme.ts +5 -4
- package/src/theme/studioTheme/color.ts +82 -70
- package/src/theme/studioTheme/fonts.ts +3 -3
- package/src/theme/studioTheme/theme.ts +17 -7
- package/src/theme/studioTheme/tints.ts +152 -0
- package/src/theme/types.ts +8 -0
- package/src/types/index.ts +1 -0
- package/src/types/radius.ts +4 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/ui",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-alpha.1",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"source": "./src/index.ts",
|
|
@@ -46,53 +46,70 @@
|
|
|
46
46
|
"watch": "pkg watch --strict",
|
|
47
47
|
"workshop:build": "node -r esbuild-register -r tsconfig-paths/register scripts/build",
|
|
48
48
|
"workshop:dev": "node -r esbuild-register -r tsconfig-paths/register scripts/dev",
|
|
49
|
-
"workshop:start": "http-server -a localhost -c-0 -p 1337 -s -P http://localhost:1337/index.html? dist"
|
|
49
|
+
"workshop:start": "http-server -a localhost -c-0 -p 1337 -s -P http://localhost:1337/index.html? dist",
|
|
50
|
+
"storybook": "storybook dev -p 6006",
|
|
51
|
+
"build-storybook": "storybook build"
|
|
50
52
|
},
|
|
51
53
|
"dependencies": {
|
|
52
54
|
"@floating-ui/react-dom": "2.0.0",
|
|
53
55
|
"@sanity/color": "^2.2.5",
|
|
54
56
|
"@sanity/icons": "^2.4.1",
|
|
55
57
|
"csstype": "^3.1.2",
|
|
56
|
-
"framer-motion": "^10.16.
|
|
58
|
+
"framer-motion": "^10.16.2",
|
|
57
59
|
"react-refractor": "^2.1.7"
|
|
58
60
|
},
|
|
59
61
|
"devDependencies": {
|
|
60
|
-
"@babel/core": "^7.22.
|
|
61
|
-
"@babel/preset-env": "^7.22.
|
|
62
|
+
"@babel/core": "^7.22.11",
|
|
63
|
+
"@babel/preset-env": "^7.22.14",
|
|
62
64
|
"@babel/preset-react": "^7.22.5",
|
|
63
|
-
"@babel/preset-typescript": "^7.22.
|
|
65
|
+
"@babel/preset-typescript": "^7.22.11",
|
|
64
66
|
"@commitlint/cli": "^17.7.1",
|
|
65
67
|
"@commitlint/config-conventional": "^17.7.0",
|
|
66
68
|
"@juggle/resize-observer": "^3.4.0",
|
|
67
69
|
"@sanity/pkg-utils": "^2.4.8",
|
|
68
|
-
"@sanity/semantic-release-preset": "^4.1.
|
|
70
|
+
"@sanity/semantic-release-preset": "^4.1.4",
|
|
69
71
|
"@sanity/ui-workshop": "^1.2.11",
|
|
72
|
+
"@storybook/addon-a11y": "^7.4.5",
|
|
73
|
+
"@storybook/addon-docs": "^7.4.5",
|
|
74
|
+
"@storybook/addon-essentials": "^7.4.5",
|
|
75
|
+
"@storybook/addon-interactions": "^7.4.5",
|
|
76
|
+
"@storybook/addon-links": "^7.4.5",
|
|
77
|
+
"@storybook/addon-storysource": "^7.4.5",
|
|
78
|
+
"@storybook/addon-themes": "^7.4.5",
|
|
79
|
+
"@storybook/blocks": "^7.4.5",
|
|
80
|
+
"@storybook/jest": "^0.2.2",
|
|
81
|
+
"@storybook/manager-api": "^7.4.5",
|
|
82
|
+
"@storybook/react": "^7.4.5",
|
|
83
|
+
"@storybook/react-vite": "^7.4.5",
|
|
84
|
+
"@storybook/testing-library": "^0.2.1",
|
|
85
|
+
"@storybook/theming": "^7.4.5",
|
|
70
86
|
"@testing-library/dom": "^9.3.1",
|
|
71
87
|
"@testing-library/jest-dom": "^5.17.0",
|
|
72
88
|
"@testing-library/react": "^14.0.0",
|
|
73
89
|
"@types/jest": "^29.5.4",
|
|
74
90
|
"@types/jest-axe": "^3.5.5",
|
|
75
|
-
"@types/node": "^20.5.
|
|
91
|
+
"@types/node": "^20.5.9",
|
|
76
92
|
"@types/react": "^18.2.21",
|
|
77
93
|
"@types/react-dom": "^18.2.7",
|
|
78
94
|
"@types/react-is": "^18.2.1",
|
|
79
95
|
"@types/refractor": "^3.0.2",
|
|
80
96
|
"@types/testing-library__jest-dom": "^5.14.9",
|
|
81
|
-
"@typescript-eslint/eslint-plugin": "^6.
|
|
82
|
-
"@typescript-eslint/parser": "^6.
|
|
97
|
+
"@typescript-eslint/eslint-plugin": "^6.5.0",
|
|
98
|
+
"@typescript-eslint/parser": "^6.5.0",
|
|
83
99
|
"commitizen": "^4.3.0",
|
|
84
|
-
"cypress": "^
|
|
85
|
-
"cypress-real-events": "^1.10.
|
|
100
|
+
"cypress": "^13.1.0",
|
|
101
|
+
"cypress-real-events": "^1.10.1",
|
|
86
102
|
"cz-conventional-changelog": "^3.3.0",
|
|
87
103
|
"esbuild": "^0.19.2",
|
|
88
104
|
"esbuild-register": "^3.4.2",
|
|
89
|
-
"eslint": "^8.
|
|
105
|
+
"eslint": "^8.48.0",
|
|
90
106
|
"eslint-config-prettier": "^9.0.0",
|
|
91
107
|
"eslint-plugin-import": "^2.28.1",
|
|
92
108
|
"eslint-plugin-jsx-a11y": "^6.7.1",
|
|
93
109
|
"eslint-plugin-prettier": "^5.0.0",
|
|
94
110
|
"eslint-plugin-react": "^7.33.2",
|
|
95
111
|
"eslint-plugin-react-hooks": "^4.6.0",
|
|
112
|
+
"eslint-plugin-storybook": "^0.6.14",
|
|
96
113
|
"http-server": "^14.1.1",
|
|
97
114
|
"husky": "^8.0.3",
|
|
98
115
|
"jest": "^29.6.4",
|
|
@@ -101,17 +118,18 @@
|
|
|
101
118
|
"lint-staged": "^14.0.1",
|
|
102
119
|
"module-alias": "^2.2.3",
|
|
103
120
|
"npm-run-all": "^4.1.5",
|
|
104
|
-
"prettier": "^3.0.
|
|
121
|
+
"prettier": "^3.0.3",
|
|
105
122
|
"react": "^18.2.0",
|
|
106
123
|
"react-dom": "^18.2.0",
|
|
107
124
|
"react-is": "^18.2.0",
|
|
108
125
|
"refractor": "^4.8.1",
|
|
109
126
|
"rimraf": "^5.0.1",
|
|
110
|
-
"semantic-release": "^21.1.
|
|
127
|
+
"semantic-release": "^21.1.1",
|
|
111
128
|
"start-server-and-test": "^2.0.0",
|
|
129
|
+
"storybook": "^7.4.5",
|
|
112
130
|
"styled-components": "^6.0.7",
|
|
113
131
|
"tsconfig-paths": "^4.2.0",
|
|
114
|
-
"typescript": "^5.
|
|
132
|
+
"typescript": "^5.2.2"
|
|
115
133
|
},
|
|
116
134
|
"peerDependencies": {
|
|
117
135
|
"react": "^18",
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
Text,
|
|
32
32
|
TextInput,
|
|
33
33
|
} from '../../primitives'
|
|
34
|
+
import {Radius} from '../../types'
|
|
34
35
|
import {AnimatedSpinnerIcon, ListBox, Root} from './autocomplete.styles'
|
|
35
36
|
import {AutocompleteOption} from './autocompleteOption'
|
|
36
37
|
import {autocompleteReducer} from './autocompleteReducer'
|
|
@@ -64,7 +65,7 @@ export interface AutocompleteProps<Option extends BaseAutocompleteOption = BaseA
|
|
|
64
65
|
popover?: Omit<PopoverProps, 'content' | 'onMouseEnter' | 'onMouseLeave' | 'open'> &
|
|
65
66
|
Omit<HTMLProps<HTMLDivElement>, 'as' | 'children' | 'content' | 'ref' | 'width'>
|
|
66
67
|
prefix?: ReactNode
|
|
67
|
-
radius?:
|
|
68
|
+
radius?: Radius | Radius[]
|
|
68
69
|
/** @beta */
|
|
69
70
|
relatedElements?: HTMLElement[]
|
|
70
71
|
renderOption?: (option: Option) => ReactElement
|
|
@@ -12,7 +12,7 @@ import {Box, Button, Card, Container, Flex, Text} from '../../primitives'
|
|
|
12
12
|
import {ResponsivePaddingProps, ResponsiveWidthProps} from '../../primitives/types'
|
|
13
13
|
import {responsivePaddingStyle, ResponsivePaddingStyleProps} from '../../styles/internal'
|
|
14
14
|
import {ThemeColorSchemeKey, useTheme} from '../../theme'
|
|
15
|
-
import {DialogPosition} from '../../types'
|
|
15
|
+
import {DialogPosition, Radius} from '../../types'
|
|
16
16
|
import {Layer, LayerProps, Portal, useBoundaryElement, useLayer, usePortal} from '../../utils'
|
|
17
17
|
import {
|
|
18
18
|
dialogStyle,
|
|
@@ -33,7 +33,7 @@ export interface DialogProps extends ResponsivePaddingProps, ResponsiveWidthProp
|
|
|
33
33
|
* @beta
|
|
34
34
|
*/
|
|
35
35
|
__unstable_hideCloseButton?: boolean
|
|
36
|
-
cardRadius?:
|
|
36
|
+
cardRadius?: Radius | Radius[]
|
|
37
37
|
cardShadow?: number | number[]
|
|
38
38
|
contentRef?: React.ForwardedRef<HTMLDivElement>
|
|
39
39
|
footer?: React.ReactNode
|
|
@@ -66,7 +66,7 @@ interface DialogCardProps extends ResponsiveWidthProps {
|
|
|
66
66
|
onClickOutside?: () => void
|
|
67
67
|
onClose?: () => void
|
|
68
68
|
portal?: string
|
|
69
|
-
radius:
|
|
69
|
+
radius: Radius | Radius[]
|
|
70
70
|
scheme?: ThemeColorSchemeKey
|
|
71
71
|
shadow: number | number[]
|
|
72
72
|
}
|
|
@@ -2,6 +2,7 @@ import {forwardRef} from 'react'
|
|
|
2
2
|
import styled from 'styled-components'
|
|
3
3
|
import {useArrayProp} from '../../hooks'
|
|
4
4
|
import {Inline, KBD} from '../../primitives'
|
|
5
|
+
import {Radius} from '../../types'
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* @public
|
|
@@ -9,7 +10,7 @@ import {Inline, KBD} from '../../primitives'
|
|
|
9
10
|
export interface HotkeysProps {
|
|
10
11
|
fontSize?: number | number[]
|
|
11
12
|
padding?: number | number[]
|
|
12
|
-
radius?:
|
|
13
|
+
radius?: Radius | Radius[]
|
|
13
14
|
space?: number | number[]
|
|
14
15
|
keys?: string[]
|
|
15
16
|
}
|
|
@@ -2,7 +2,7 @@ import {cloneElement, forwardRef, useCallback, useMemo, useState, useEffect, use
|
|
|
2
2
|
import {isElement} from 'react-is'
|
|
3
3
|
import {Popover, PopoverProps} from '../../primitives'
|
|
4
4
|
import {ThemeColorSchemeKey} from '../../theme'
|
|
5
|
-
import {Placement} from '../../types'
|
|
5
|
+
import {Placement, Radius} from '../../types'
|
|
6
6
|
import {MenuProps} from './menu'
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -34,7 +34,7 @@ export interface MenuButtonProps {
|
|
|
34
34
|
/**
|
|
35
35
|
* @deprecated Use `popover={{radius: 2}}` instead.
|
|
36
36
|
*/
|
|
37
|
-
popoverRadius?:
|
|
37
|
+
popoverRadius?: Radius | Radius[]
|
|
38
38
|
/**
|
|
39
39
|
* @beta Do not use in production.
|
|
40
40
|
* @deprecated Use `popover={{portal: true}}` instead.
|
|
@@ -4,7 +4,7 @@ import {isValidElementType} from 'react-is'
|
|
|
4
4
|
import {useArrayProp} from '../../hooks'
|
|
5
5
|
import {Box, Flex, Popover, PopoverProps, Text} from '../../primitives'
|
|
6
6
|
import {Selectable} from '../../primitives/_selectable'
|
|
7
|
-
import {SelectableTone} from '../../types
|
|
7
|
+
import {Radius, SelectableTone} from '../../types'
|
|
8
8
|
import {Menu} from './menu'
|
|
9
9
|
import {useMenu} from './useMenu'
|
|
10
10
|
|
|
@@ -17,7 +17,7 @@ export interface MenuGroupProps {
|
|
|
17
17
|
icon?: React.ElementType | React.ReactNode
|
|
18
18
|
padding?: number | number[]
|
|
19
19
|
popover?: Omit<PopoverProps, 'content' | 'open'>
|
|
20
|
-
radius?:
|
|
20
|
+
radius?: Radius | Radius[]
|
|
21
21
|
space?: number | number[]
|
|
22
22
|
text: React.ReactNode
|
|
23
23
|
tone?: SelectableTone
|
|
@@ -38,7 +38,7 @@ export const Tab = forwardRef(function Tab(
|
|
|
38
38
|
icon,
|
|
39
39
|
id,
|
|
40
40
|
focused,
|
|
41
|
-
fontSize,
|
|
41
|
+
fontSize = 1,
|
|
42
42
|
label,
|
|
43
43
|
onClick,
|
|
44
44
|
onFocus,
|
|
@@ -88,6 +88,7 @@ export const Tab = forwardRef(function Tab(
|
|
|
88
88
|
onBlur={handleBlur}
|
|
89
89
|
onFocus={handleFocus}
|
|
90
90
|
padding={padding}
|
|
91
|
+
radius="full"
|
|
91
92
|
ref={setRef}
|
|
92
93
|
role="tab"
|
|
93
94
|
selected={selected}
|
|
@@ -57,7 +57,7 @@ function avatarArrowStyle(): CSSObject {
|
|
|
57
57
|
|
|
58
58
|
export function avatarRootStyle(props: AvatarRootStyleProps & ThemeProps): CSSObject {
|
|
59
59
|
const {$color, theme} = props
|
|
60
|
-
const {focusRing} = theme.sanity
|
|
60
|
+
const {focusRing} = theme.sanity.avatar
|
|
61
61
|
|
|
62
62
|
return {
|
|
63
63
|
backgroundColor: $color,
|
|
@@ -30,6 +30,7 @@ export interface ButtonProps extends ResponsivePaddingProps, ResponsiveRadiusPro
|
|
|
30
30
|
selected?: boolean
|
|
31
31
|
space?: number | number[]
|
|
32
32
|
textAlign?: ButtonTextAlign
|
|
33
|
+
muted?: boolean
|
|
33
34
|
text?: React.ReactNode
|
|
34
35
|
tone?: ButtonTone
|
|
35
36
|
type?: 'button' | 'reset' | 'submit'
|
|
@@ -64,7 +65,7 @@ export const Button = forwardRef(function Button(
|
|
|
64
65
|
const {
|
|
65
66
|
children,
|
|
66
67
|
disabled,
|
|
67
|
-
fontSize,
|
|
68
|
+
fontSize = 1,
|
|
68
69
|
icon,
|
|
69
70
|
iconRight,
|
|
70
71
|
justify: justifyProp = 'center',
|
|
@@ -84,6 +85,7 @@ export const Button = forwardRef(function Button(
|
|
|
84
85
|
textAlign,
|
|
85
86
|
tone = 'default',
|
|
86
87
|
type = 'button',
|
|
88
|
+
muted = false,
|
|
87
89
|
...restProps
|
|
88
90
|
} = props
|
|
89
91
|
|
|
@@ -135,7 +137,7 @@ export const Button = forwardRef(function Button(
|
|
|
135
137
|
|
|
136
138
|
{(icon || text || iconRight) && (
|
|
137
139
|
<Box as="span" {...boxProps}>
|
|
138
|
-
<Flex as="span" justify={justify}>
|
|
140
|
+
<Flex as="span" justify={justify} gap={space}>
|
|
139
141
|
{icon && (
|
|
140
142
|
<Text size={fontSize}>
|
|
141
143
|
{isValidElement(icon) && icon}
|
|
@@ -144,12 +146,9 @@ export const Button = forwardRef(function Button(
|
|
|
144
146
|
)}
|
|
145
147
|
|
|
146
148
|
{text && (
|
|
147
|
-
<Box
|
|
148
|
-
flex={iconRight ? 1 : undefined}
|
|
149
|
-
marginLeft={icon ? space : undefined}
|
|
150
|
-
marginRight={iconRight ? space : undefined}
|
|
151
|
-
>
|
|
149
|
+
<Box flex={iconRight ? 1 : undefined}>
|
|
152
150
|
<Text
|
|
151
|
+
muted={muted}
|
|
153
152
|
align={textAlign}
|
|
154
153
|
size={fontSize}
|
|
155
154
|
textOverflow="ellipsis"
|
|
@@ -42,6 +42,11 @@ export function buttonBaseStyles(): ReturnType<typeof css> {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
const buttonTheme = {border: {width: 1}}
|
|
45
|
+
const defaultBoxShadow = '0px 2px 0px 0px rgba(112, 128, 155, 0.19);'
|
|
46
|
+
|
|
47
|
+
function combineBoxShadow(...boxShadows: (string | undefined)[]): string {
|
|
48
|
+
return boxShadows.filter(Boolean).join(',')
|
|
49
|
+
}
|
|
45
50
|
|
|
46
51
|
/**
|
|
47
52
|
* @internal
|
|
@@ -50,7 +55,8 @@ export function buttonColorStyles(
|
|
|
50
55
|
props: {$mode: ButtonMode; $tone: ButtonTone} & ThemeProps,
|
|
51
56
|
): CSSObject[] {
|
|
52
57
|
const {$mode, theme} = props
|
|
53
|
-
const {focusRing} = theme.sanity
|
|
58
|
+
const {focusRing} = theme.sanity.button
|
|
59
|
+
const shadow = props.$mode !== 'bleed'
|
|
54
60
|
const base = theme.sanity.color.base
|
|
55
61
|
const mode = theme.sanity.color.button[$mode] || theme.sanity.color.button.default
|
|
56
62
|
const color = mode[props.$tone] || mode.default
|
|
@@ -64,11 +70,22 @@ export function buttonColorStyles(
|
|
|
64
70
|
boxShadow: focusRingBorderStyle(border),
|
|
65
71
|
'&:disabled, &[data-disabled="true"]': _colorVarsStyle(base, color.disabled),
|
|
66
72
|
"&:not([data-disabled='true'])": {
|
|
73
|
+
boxShadow: combineBoxShadow(
|
|
74
|
+
focusRingBorderStyle(border),
|
|
75
|
+
shadow ? defaultBoxShadow : undefined,
|
|
76
|
+
),
|
|
67
77
|
'&:focus': {
|
|
68
|
-
boxShadow: focusRingStyle({
|
|
78
|
+
boxShadow: focusRingStyle({
|
|
79
|
+
base,
|
|
80
|
+
border: {width: 2, color: base.bg},
|
|
81
|
+
focusRing,
|
|
82
|
+
}),
|
|
69
83
|
},
|
|
70
84
|
'&:focus:not(:focus-visible)': {
|
|
71
|
-
boxShadow:
|
|
85
|
+
boxShadow: combineBoxShadow(
|
|
86
|
+
focusRingBorderStyle(border),
|
|
87
|
+
shadow ? defaultBoxShadow : undefined,
|
|
88
|
+
),
|
|
72
89
|
},
|
|
73
90
|
'@media (hover: hover)': {
|
|
74
91
|
'&:hover': _colorVarsStyle(base, color.hovered),
|
|
@@ -47,7 +47,7 @@ export function cardBaseStyle(props: CardStyleProps & ThemeProps): ReturnType<ty
|
|
|
47
47
|
|
|
48
48
|
export function cardColorStyle(props: CardStyleProps & ThemeProps): ReturnType<typeof css> {
|
|
49
49
|
const {$checkered, $focusRing, theme} = props
|
|
50
|
-
const {focusRing} = theme.sanity
|
|
50
|
+
const {focusRing} = theme.sanity.card
|
|
51
51
|
const {base, card, dark} = theme.sanity.color
|
|
52
52
|
const border = {width: 0, color: 'var(--card-border-color)'}
|
|
53
53
|
|
|
@@ -47,6 +47,7 @@ export const Checkbox = forwardRef(function Checkbox(
|
|
|
47
47
|
<Root className={className} data-ui="Checkbox" style={style}>
|
|
48
48
|
<Input
|
|
49
49
|
data-read-only={!disabled && readOnly ? '' : undefined}
|
|
50
|
+
data-error={customValidity ? '' : undefined}
|
|
50
51
|
{...restProps}
|
|
51
52
|
checked={checked}
|
|
52
53
|
disabled={disabled || readOnly}
|
|
@@ -12,7 +12,8 @@ export function checkboxBaseStyles(): ReturnType<typeof css> {
|
|
|
12
12
|
export function inputElementStyles(props: ThemeProps): ReturnType<typeof css> {
|
|
13
13
|
const {theme} = props
|
|
14
14
|
const color = theme.sanity.color.input
|
|
15
|
-
const {
|
|
15
|
+
const {input, radius} = theme.sanity
|
|
16
|
+
const {focusRing} = input.checkbox
|
|
16
17
|
|
|
17
18
|
return css`
|
|
18
19
|
position: absolute;
|
|
@@ -49,27 +50,58 @@ export function inputElementStyles(props: ThemeProps): ReturnType<typeof css> {
|
|
|
49
50
|
|
|
50
51
|
& > path {
|
|
51
52
|
vector-effect: non-scaling-stroke;
|
|
52
|
-
stroke-width: 2 !important;
|
|
53
|
+
stroke-width: 1.2 !important;
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
}
|
|
57
|
+
&:checked + span {
|
|
58
|
+
background: ${color.default.enabled.bg2};
|
|
59
|
+
box-shadow: ${focusRingBorderStyle({
|
|
60
|
+
color: color.default.enabled.bg2,
|
|
61
|
+
width: input.border.width,
|
|
62
|
+
})};
|
|
63
|
+
color: ${color.default.enabled.bg};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* focus */
|
|
67
|
+
&:not(:disabled):focus:focus-visible + span {
|
|
68
|
+
box-shadow: ${focusRingStyle({focusRing})};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* focus when checked - uses a different offset */
|
|
72
|
+
&:not(:disabled):focus:focus-visible&:checked + span {
|
|
73
|
+
box-shadow: ${focusRingStyle({focusRing: {width: 1, offset: 1}})};
|
|
74
|
+
}
|
|
56
75
|
|
|
57
|
-
|
|
76
|
+
&[data-error] + span {
|
|
77
|
+
background-color: ${color.invalid.enabled.border};
|
|
78
|
+
box-shadow: ${focusRingBorderStyle({
|
|
79
|
+
width: input.border.width,
|
|
80
|
+
color: color.invalid.enabled.bg2,
|
|
81
|
+
})};
|
|
82
|
+
color: ${color.default.disabled.fg};
|
|
83
|
+
}
|
|
84
|
+
&[data-error]&:checked + span {
|
|
85
|
+
background-color: ${color.invalid.enabled.bg2};
|
|
86
|
+
color: ${color.default.enabled.bg};
|
|
87
|
+
}
|
|
88
|
+
&[data-error]&:checked&:not(:disabled):focus:focus-visible + span {
|
|
58
89
|
box-shadow: ${focusRingStyle({
|
|
59
|
-
border: {width: input.border.width, color: color.
|
|
60
|
-
focusRing,
|
|
90
|
+
border: {width: input.border.width, color: color.invalid.readOnly.bg2},
|
|
91
|
+
focusRing: {width: 1, offset: 1},
|
|
61
92
|
})};
|
|
62
93
|
}
|
|
63
94
|
|
|
64
|
-
&:
|
|
95
|
+
&:disabled + span {
|
|
96
|
+
background-color: ${color.default.disabled.bg};
|
|
65
97
|
box-shadow: ${focusRingBorderStyle({
|
|
66
|
-
color: color.default.enabled.border,
|
|
67
98
|
width: input.border.width,
|
|
99
|
+
color: color.default.disabled.border,
|
|
68
100
|
})};
|
|
101
|
+
color: ${color.default.disabled.fg};
|
|
69
102
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
opacity: 1;
|
|
103
|
+
&:disabled&:checked + span {
|
|
104
|
+
background-color: ${color.default.disabled.bg2};
|
|
73
105
|
}
|
|
74
106
|
|
|
75
107
|
&[data-read-only] + span {
|
|
@@ -81,15 +113,13 @@ export function inputElementStyles(props: ThemeProps): ReturnType<typeof css> {
|
|
|
81
113
|
color: ${color.default.readOnly.fg};
|
|
82
114
|
}
|
|
83
115
|
|
|
84
|
-
|
|
85
|
-
background-color: ${color.default.
|
|
86
|
-
box-shadow: ${focusRingBorderStyle({
|
|
87
|
-
width: input.border.width,
|
|
88
|
-
color: color.default.disabled.border,
|
|
89
|
-
})};
|
|
90
|
-
color: ${color.default.disabled.fg};
|
|
116
|
+
&[data-read-only]&:checked + span {
|
|
117
|
+
background-color: ${color.default.readOnly.bg2};
|
|
91
118
|
}
|
|
92
119
|
|
|
120
|
+
&:checked + span > svg:first-child {
|
|
121
|
+
opacity: 1;
|
|
122
|
+
}
|
|
93
123
|
&:indeterminate + span > svg:last-child {
|
|
94
124
|
opacity: 1;
|
|
95
125
|
}
|
|
@@ -2,8 +2,9 @@ import {forwardRef} from 'react'
|
|
|
2
2
|
import styled, {css} from 'styled-components'
|
|
3
3
|
import {useArrayProp} from '../../hooks'
|
|
4
4
|
import {responsiveRadiusStyle, ResponsiveRadiusStyleProps} from '../../styles/internal'
|
|
5
|
+
import {Radius} from '../../types'
|
|
5
6
|
import {Box} from '../box'
|
|
6
|
-
import {
|
|
7
|
+
import {Text} from '../text'
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* @public
|
|
@@ -12,14 +13,13 @@ export interface KBDProps {
|
|
|
12
13
|
as?: React.ElementType | keyof JSX.IntrinsicElements
|
|
13
14
|
fontSize?: number | number[]
|
|
14
15
|
padding?: number | number[]
|
|
15
|
-
radius?:
|
|
16
|
+
radius?: Radius | Radius[]
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
function kbdStyle() {
|
|
19
20
|
return css`
|
|
20
|
-
background: var(--card-
|
|
21
|
+
background: var(--card-bg2-color);
|
|
21
22
|
font: inherit;
|
|
22
|
-
box-shadow: inset 0 0 0 1px var(--card-hairline-hard-color);
|
|
23
23
|
|
|
24
24
|
&:not([hidden]) {
|
|
25
25
|
display: inline-block;
|
|
@@ -41,9 +41,9 @@ export const KBD = forwardRef(function KBD(
|
|
|
41
41
|
return (
|
|
42
42
|
<Root data-ui="KBD" {...restProps} $radius={useArrayProp(radius)} ref={ref}>
|
|
43
43
|
<Box as="span" padding={padding}>
|
|
44
|
-
<
|
|
44
|
+
<Text as="span" muted size={fontSize} weight="medium">
|
|
45
45
|
{children}
|
|
46
|
-
</
|
|
46
|
+
</Text>
|
|
47
47
|
</Box>
|
|
48
48
|
</Root>
|
|
49
49
|
)
|
|
@@ -1,7 +1,21 @@
|
|
|
1
|
-
import {PopoverMargins} from '../../types'
|
|
1
|
+
import {Placement, PopoverMargins} from '../../types'
|
|
2
2
|
|
|
3
3
|
export const DEFAULT_POPOVER_DISTANCE = 4
|
|
4
4
|
export const DEFAULT_POPOVER_PADDING = 4
|
|
5
5
|
export const DEFAULT_POPOVER_ARROW_WIDTH = 27
|
|
6
6
|
export const DEFAULT_POPOVER_ARROW_HEIGHT = 11
|
|
7
7
|
export const DEFAULT_POPOVER_MARGINS: PopoverMargins = [0, 0, 0, 0]
|
|
8
|
+
export const DEFAULT_FALLBACK_PLACEMENTS: Record<Placement, Placement[]> = {
|
|
9
|
+
top: ['bottom', 'left', 'right'],
|
|
10
|
+
'top-start': ['bottom-start', 'left-start', 'right-start'],
|
|
11
|
+
'top-end': ['bottom-end', 'left-end', 'right-end'],
|
|
12
|
+
bottom: ['top', 'left', 'right'],
|
|
13
|
+
'bottom-start': ['top-start', 'left-start', 'right-start'],
|
|
14
|
+
'bottom-end': ['top-end', 'left-end', 'right-end'],
|
|
15
|
+
left: ['right', 'top', 'bottom'],
|
|
16
|
+
'left-start': ['right-start', 'top-start', 'bottom-start'],
|
|
17
|
+
'left-end': ['right-end', 'top-end', 'bottom-end'],
|
|
18
|
+
right: ['left', 'top', 'bottom'],
|
|
19
|
+
'right-start': ['left-start', 'top-start', 'bottom-start'],
|
|
20
|
+
'right-end': ['left-end', 'top-end', 'bottom-end'],
|
|
21
|
+
}
|
|
@@ -28,6 +28,7 @@ import {ResponsiveRadiusProps, ResponsiveShadowProps} from '../types'
|
|
|
28
28
|
import {
|
|
29
29
|
DEFAULT_POPOVER_DISTANCE,
|
|
30
30
|
DEFAULT_POPOVER_MARGINS,
|
|
31
|
+
DEFAULT_FALLBACK_PLACEMENTS,
|
|
31
32
|
DEFAULT_POPOVER_PADDING,
|
|
32
33
|
} from './constants'
|
|
33
34
|
import {size} from './floating-ui/size'
|
|
@@ -89,7 +90,8 @@ export const Popover = memo(
|
|
|
89
90
|
constrainSize = false,
|
|
90
91
|
content,
|
|
91
92
|
disabled,
|
|
92
|
-
fallbackPlacements
|
|
93
|
+
fallbackPlacements = props.fallbackPlacements ??
|
|
94
|
+
DEFAULT_FALLBACK_PLACEMENTS[props.placement ?? 'bottom'],
|
|
93
95
|
matchReferenceWidth,
|
|
94
96
|
floatingBoundary = props.boundaryElement ?? boundaryElementContext.element,
|
|
95
97
|
open,
|
|
@@ -3,7 +3,7 @@ import React, {CSSProperties, forwardRef, memo, useMemo} from 'react'
|
|
|
3
3
|
import styled from 'styled-components'
|
|
4
4
|
import {FLOATING_STATIC_SIDES} from '../../constants'
|
|
5
5
|
import {ThemeColorSchemeKey} from '../../theme'
|
|
6
|
-
import {BoxOverflow, CardTone, Placement, PopoverMargins} from '../../types'
|
|
6
|
+
import {BoxOverflow, CardTone, Placement, PopoverMargins, Radius} from '../../types'
|
|
7
7
|
import {useLayer} from '../../utils'
|
|
8
8
|
import {Card} from '../card'
|
|
9
9
|
import {Flex} from '../flex'
|
|
@@ -34,7 +34,7 @@ export const PopoverCard = memo(
|
|
|
34
34
|
overflow?: BoxOverflow
|
|
35
35
|
padding?: number | number[]
|
|
36
36
|
placement?: Placement
|
|
37
|
-
radius?:
|
|
37
|
+
radius?: Radius | Radius[]
|
|
38
38
|
scheme?: ThemeColorSchemeKey
|
|
39
39
|
shadow?: number | number[]
|
|
40
40
|
strategy: Strategy
|
|
@@ -29,6 +29,7 @@ export const Radio = forwardRef(function Radio(
|
|
|
29
29
|
<Root className={className} data-ui="Radio" style={style}>
|
|
30
30
|
<Input
|
|
31
31
|
data-read-only={!disabled && readOnly ? '' : undefined}
|
|
32
|
+
data-error={customValidity ? '' : undefined}
|
|
32
33
|
{...restProps}
|
|
33
34
|
disabled={disabled || readOnly}
|
|
34
35
|
readOnly={readOnly}
|
|
@@ -18,7 +18,8 @@ export function radioBaseStyle(): ReturnType<typeof css> {
|
|
|
18
18
|
|
|
19
19
|
export function inputElementStyle(props: ThemeProps): ReturnType<typeof css> {
|
|
20
20
|
const {theme} = props
|
|
21
|
-
const {
|
|
21
|
+
const {input} = theme.sanity
|
|
22
|
+
const {focusRing} = input.radio
|
|
22
23
|
const color = theme.sanity.color.input
|
|
23
24
|
const dist = (input.radio.size - input.radio.markSize) / 2
|
|
24
25
|
|
|
@@ -58,7 +59,7 @@ export function inputElementStyle(props: ThemeProps): ReturnType<typeof css> {
|
|
|
58
59
|
height: ${rem(input.radio.markSize)};
|
|
59
60
|
width: ${rem(input.radio.markSize)};
|
|
60
61
|
border-radius: ${rem(input.radio.markSize / 2)};
|
|
61
|
-
background: ${color.default.enabled.
|
|
62
|
+
background: ${color.default.enabled.bg2};
|
|
62
63
|
opacity: 0;
|
|
63
64
|
}
|
|
64
65
|
}
|
|
@@ -82,13 +83,25 @@ export function inputElementStyle(props: ThemeProps): ReturnType<typeof css> {
|
|
|
82
83
|
opacity: 1;
|
|
83
84
|
}
|
|
84
85
|
|
|
86
|
+
/* customValidity */
|
|
87
|
+
&[data-error] + span {
|
|
88
|
+
background-color: ${color.invalid.enabled.border};
|
|
89
|
+
box-shadow: ${focusRingBorderStyle({
|
|
90
|
+
width: input.border.width,
|
|
91
|
+
color: color.invalid.enabled.bg2,
|
|
92
|
+
})};
|
|
93
|
+
&::after {
|
|
94
|
+
background: ${color.invalid.enabled.bg2};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
85
98
|
/* read only */
|
|
86
99
|
&[data-read-only] + span {
|
|
87
100
|
box-shadow: 0 0 0 1px ${color.default.readOnly.border};
|
|
88
101
|
background: ${color.default.readOnly.bg};
|
|
89
102
|
|
|
90
103
|
&::after {
|
|
91
|
-
background: ${color.default.readOnly.
|
|
104
|
+
background: ${color.default.readOnly.border};
|
|
92
105
|
}
|
|
93
106
|
}
|
|
94
107
|
|
|
@@ -98,7 +111,7 @@ export function inputElementStyle(props: ThemeProps): ReturnType<typeof css> {
|
|
|
98
111
|
background: ${color.default.disabled.bg};
|
|
99
112
|
|
|
100
113
|
&::after {
|
|
101
|
-
background: ${color.default.disabled.
|
|
114
|
+
background: ${color.default.disabled.border};
|
|
102
115
|
}
|
|
103
116
|
}
|
|
104
117
|
`
|
|
@@ -2,6 +2,7 @@ import {SelectIcon} from '@sanity/icons'
|
|
|
2
2
|
import {forwardRef} from 'react'
|
|
3
3
|
import styled from 'styled-components'
|
|
4
4
|
import {useForwardedRef, useCustomValidity, useArrayProp} from '../../hooks'
|
|
5
|
+
import {Radius} from '../../types'
|
|
5
6
|
import {Box} from '../box'
|
|
6
7
|
import {Text} from '../text'
|
|
7
8
|
import {selectStyle} from './styles'
|
|
@@ -12,7 +13,7 @@ import {selectStyle} from './styles'
|
|
|
12
13
|
export interface SelectProps {
|
|
13
14
|
fontSize?: number | number[]
|
|
14
15
|
padding?: number | number[]
|
|
15
|
-
radius?:
|
|
16
|
+
radius?: Radius | Radius[]
|
|
16
17
|
space?: number | number[]
|
|
17
18
|
customValidity?: string
|
|
18
19
|
}
|
|
@@ -22,7 +23,7 @@ const Root = styled.div(selectStyle.root)
|
|
|
22
23
|
const Input = styled.select<{
|
|
23
24
|
$fontSize: number[]
|
|
24
25
|
$padding: number[]
|
|
25
|
-
$radius:
|
|
26
|
+
$radius: Radius[]
|
|
26
27
|
$space: number[]
|
|
27
28
|
}>(selectStyle.input)
|
|
28
29
|
|
|
@@ -43,7 +43,8 @@ function inputBaseStyle(props: ThemeProps): ReturnType<typeof css> {
|
|
|
43
43
|
|
|
44
44
|
function inputColorStyle(props: ThemeProps) {
|
|
45
45
|
const {theme} = props
|
|
46
|
-
const {
|
|
46
|
+
const {input} = theme.sanity
|
|
47
|
+
const {focusRing} = input.select
|
|
47
48
|
const color = theme.sanity.color.input
|
|
48
49
|
|
|
49
50
|
return css`
|