@sanity/ui 2.3.7-canary.0 → 2.4.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 (67) hide show
  1. package/dist/_chunks-cjs/getTheme_v2.js +319 -0
  2. package/dist/_chunks-cjs/getTheme_v2.js.map +1 -0
  3. package/dist/_chunks-es/getTheme_v2.mjs +320 -0
  4. package/dist/_chunks-es/getTheme_v2.mjs.map +1 -0
  5. package/dist/_legacy/getTheme_v2.esm.js +320 -0
  6. package/dist/_legacy/getTheme_v2.esm.js.map +1 -0
  7. package/dist/index.d.mts +2 -13
  8. package/dist/index.d.ts +2 -13
  9. package/dist/index.esm.js +2301 -2237
  10. package/dist/index.esm.js.map +1 -1
  11. package/dist/index.js +2304 -2241
  12. package/dist/index.js.map +1 -1
  13. package/dist/index.mjs +2301 -2237
  14. package/dist/index.mjs.map +1 -1
  15. package/dist/theme.esm.js +4 -315
  16. package/dist/theme.esm.js.map +1 -1
  17. package/dist/theme.js +36 -349
  18. package/dist/theme.js.map +1 -1
  19. package/dist/theme.mjs +4 -315
  20. package/dist/theme.mjs.map +1 -1
  21. package/package.json +35 -31
  22. package/src/core/components/autocomplete/autocomplete.tsx +34 -31
  23. package/src/core/components/breadcrumbs/breadcrumbs.tsx +2 -3
  24. package/src/core/components/dialog/dialog.tsx +12 -23
  25. package/src/core/components/hotkeys/hotkeys.tsx +3 -3
  26. package/src/core/components/menu/menu.tsx +1 -5
  27. package/src/core/components/menu/menuButton.tsx +32 -17
  28. package/src/core/components/menu/menuGroup.tsx +5 -7
  29. package/src/core/components/menu/menuItem.tsx +6 -10
  30. package/src/core/components/skeleton/skeleton.tsx +11 -5
  31. package/src/core/components/skeleton/textSkeleton.tsx +7 -6
  32. package/src/core/components/toast/styles.ts +61 -0
  33. package/src/core/components/toast/toast.tsx +11 -16
  34. package/src/core/components/toast/toastProvider.tsx +25 -26
  35. package/src/core/components/tree/treeItem.tsx +44 -31
  36. package/src/core/hooks/useArrayProp.ts +10 -11
  37. package/src/core/primitives/avatar/avatar.tsx +15 -11
  38. package/src/core/primitives/avatar/avatarCounter.tsx +17 -11
  39. package/src/core/primitives/avatar/avatarStack.tsx +7 -3
  40. package/src/core/primitives/badge/badge.tsx +4 -7
  41. package/src/core/primitives/box/box.tsx +27 -53
  42. package/src/core/primitives/button/button.tsx +12 -11
  43. package/src/core/primitives/card/card.tsx +9 -17
  44. package/src/core/primitives/code/code.tsx +3 -4
  45. package/src/core/primitives/container/container.tsx +11 -4
  46. package/src/core/primitives/flex/flex.tsx +7 -13
  47. package/src/core/primitives/grid/grid.tsx +10 -19
  48. package/src/core/primitives/heading/heading.tsx +4 -7
  49. package/src/core/primitives/inline/inline.tsx +2 -3
  50. package/src/core/primitives/kbd/kbd.tsx +3 -4
  51. package/src/core/primitives/label/label.tsx +4 -7
  52. package/src/core/primitives/popover/popover.tsx +49 -49
  53. package/src/core/primitives/select/select.tsx +6 -12
  54. package/src/core/primitives/stack/stack.tsx +3 -4
  55. package/src/core/primitives/text/text.tsx +4 -7
  56. package/src/core/primitives/textArea/textArea.tsx +6 -12
  57. package/src/core/primitives/textInput/textInput.tsx +5 -6
  58. package/src/core/primitives/tooltip/tooltip.tsx +7 -14
  59. package/src/core/theme/themeProvider.tsx +6 -4
  60. package/src/core/utils/elementQuery/elementQuery.tsx +3 -4
  61. package/src/core/utils/layer/getLayerContext.test.ts +4 -0
  62. package/src/core/utils/layer/layer.test.tsx +2 -0
  63. package/src/core/utils/layer/layerProvider.tsx +43 -35
  64. package/src/core/utils/layer/types.ts +1 -0
  65. package/dist/index.compiled.mjs +0 -7488
  66. package/dist/index.compiled.mjs.map +0 -1
  67. package/src/core/components/tree/treeItem.styles.ts +0 -21
@@ -24,10 +24,9 @@ import {
24
24
  useImperativeHandle,
25
25
  } from 'react'
26
26
  import {styled} from 'styled-components'
27
- import {usePrefersReducedMotion} from '../../hooks'
27
+ import {useArrayProp, usePrefersReducedMotion} from '../../hooks'
28
28
  import {useDelayedState} from '../../hooks/useDelayedState'
29
29
  import {origin} from '../../middleware/origin'
30
- import {_getArrayProp} from '../../styles'
31
30
  import {useTheme_v2} from '../../theme'
32
31
  import type {Placement} from '../../types'
33
32
  import {
@@ -105,31 +104,25 @@ export const Tooltip = forwardRef(function Tooltip(
105
104
  const {
106
105
  animate: _animate = false,
107
106
  arrow: arrowProp = false,
108
- boundaryElement: _boundaryElement,
107
+ boundaryElement = boundaryElementContext?.element,
109
108
  children: childProp,
110
109
  content,
111
110
  disabled,
112
- fallbackPlacements: _fallbackPlacements,
111
+ fallbackPlacements: fallbackPlacementsProp = props.fallbackPlacements ??
112
+ DEFAULT_FALLBACK_PLACEMENTS[props.placement ?? 'bottom'],
113
113
  padding = 2,
114
114
  placement: placementProp = 'bottom',
115
115
  portal: portalProp,
116
116
  radius = 2,
117
117
  scheme,
118
118
  shadow = 2,
119
- zOffset: _zOffset,
119
+ zOffset = layer.tooltip.zOffset,
120
120
  delay,
121
121
  ...restProps
122
122
  } = props
123
- const zOffset = _zOffset ?? layer.tooltip.zOffset
124
- const fallbackPlacementsProp =
125
- _fallbackPlacements ?? DEFAULT_FALLBACK_PLACEMENTS[props.placement ?? 'bottom']
126
- const boundaryElement = _boundaryElement ?? boundaryElementContext?.element
127
123
  const prefersReducedMotion = usePrefersReducedMotion()
128
124
  const animate = prefersReducedMotion ? false : _animate
129
- const fallbackPlacements = useMemo(
130
- () => _getArrayProp(fallbackPlacementsProp),
131
- [fallbackPlacementsProp],
132
- )
125
+ const fallbackPlacements = useArrayProp(fallbackPlacementsProp)
133
126
  const ref = useRef<HTMLDivElement | null>(null)
134
127
  const [referenceElement, setReferenceElement] = useState<HTMLElement | null>(null)
135
128
  const arrowRef = useRef<HTMLDivElement | null>(null)
@@ -298,7 +291,7 @@ export const Tooltip = forwardRef(function Tooltip(
298
291
  useEffect(() => {
299
292
  if (!showTooltip) return
300
293
 
301
- const handleWindowMouseMove = (event: MouseEvent) => {
294
+ function handleWindowMouseMove(event: MouseEvent) {
302
295
  if (!referenceElement) return
303
296
 
304
297
  const isHoveringReference =
@@ -24,11 +24,13 @@ export interface ThemeProviderProps {
24
24
  * @public
25
25
  */
26
26
  export function ThemeProvider(props: ThemeProviderProps): React.ReactElement {
27
- const {children} = props
28
27
  const parentTheme = useContext(ThemeContext)
29
- const scheme = props.scheme ?? (parentTheme?.scheme || 'light')
30
- const rootTheme = props.theme ?? (parentTheme?.theme || null)
31
- const tone = props.tone ?? (parentTheme?.tone || 'default')
28
+ const {
29
+ children,
30
+ scheme = parentTheme?.scheme || 'light',
31
+ theme: rootTheme = parentTheme?.theme || null,
32
+ tone = parentTheme?.tone || 'default',
33
+ } = props
32
34
 
33
35
  const themeContext: ThemeContextValue | null = useMemo(() => {
34
36
  if (!rootTheme) return null
@@ -21,16 +21,15 @@ export const ElementQuery = forwardRef(function ElementQuery(
21
21
  forwardedRef: React.ForwardedRef<HTMLDivElement>,
22
22
  ) {
23
23
  const theme = useTheme_v2()
24
- const {children, media: _media, ...restProps} = props
25
- const media = _media ?? theme.media
24
+ const {children, media = theme.media, ...restProps} = props
26
25
 
27
26
  const ref = useRef<HTMLDivElement | null>(null)
28
27
  const [element, setElement] = useState<HTMLDivElement | null>(null)
29
28
  const elementSize = useElementSize(element)
30
29
  const width = useMemo(() => elementSize?.border.width ?? window.innerWidth, [elementSize])
31
30
 
32
- const max = findMaxBreakpoints(media, width)
33
- const min = findMinBreakpoints(media, width)
31
+ const max = useMemo(() => findMaxBreakpoints(media, width), [media, width])
32
+ const min = useMemo(() => findMinBreakpoints(media, width), [media, width])
34
33
 
35
34
  useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(forwardedRef, () => ref.current)
36
35
 
@@ -8,6 +8,9 @@ describe('getLayerContext', () => {
8
8
  version: 0.0,
9
9
  isTopLayer: true,
10
10
  level: 0,
11
+ registerChild: () => () => {
12
+ //
13
+ },
11
14
  size: 0,
12
15
  zIndex: 0,
13
16
  }
@@ -18,6 +21,7 @@ describe('getLayerContext', () => {
18
21
  version: 0.0,
19
22
  isTopLayer: true,
20
23
  level: 0,
24
+ registerChild: expect.any(Function),
21
25
  size: 0,
22
26
  zIndex: 0,
23
27
  })
@@ -24,6 +24,7 @@ describe('utils/layer', () => {
24
24
  version: 0.0,
25
25
  isTopLayer: true,
26
26
  level: 0,
27
+ registerChild: () => () => undefined,
27
28
  size: 0,
28
29
  zIndex: 0,
29
30
  }
@@ -39,6 +40,7 @@ describe('utils/layer', () => {
39
40
 
40
41
  expect(log.mock.calls[0][0].version).toBe(0.0)
41
42
  expect(log.mock.calls[0][0].isTopLayer).toBe(true)
43
+ expect(typeof log.mock.calls[0][0].registerChild).toBe('function')
42
44
  expect(log.mock.calls[0][0].size).toBe(0)
43
45
  expect(log.mock.calls[0][0].zIndex).toBe(0)
44
46
  })
@@ -1,8 +1,8 @@
1
- import {createContext, useCallback, useContext, useEffect, useMemo, useState} from 'react'
2
- import {useMediaIndex} from '../../hooks'
3
- import {_getArrayProp} from '../../styles'
1
+ import {useCallback, useContext, useEffect, useMemo, useState} from 'react'
2
+ import {useMediaIndex, useArrayProp} from '../../hooks'
4
3
  import {getLayerContext} from './getLayerContext'
5
4
  import {LayerContext} from './layerContext'
5
+ import {LayerContextValue} from './types'
6
6
 
7
7
  /**
8
8
  * @public
@@ -20,15 +20,15 @@ export function LayerProvider(props: LayerProviderProps): React.ReactElement {
20
20
 
21
21
  // Get parent context values
22
22
  const parentContextValue = useContext(LayerContext)
23
- const parentRegisterChild = useContext(LayerContextRegisterChild)
24
23
  const parent = parentContextValue && getLayerContext(parentContextValue)
24
+ const parentRegisterChild = parent?.registerChild
25
25
  const parentLevel = parent?.level ?? 0
26
26
 
27
27
  // Get level
28
28
  const level = parentLevel + 1
29
29
 
30
30
  // Get z-index offset
31
- const zOffset = useMemo(() => _getArrayProp(zOffsetProp), [zOffsetProp])
31
+ const zOffset = useArrayProp(zOffsetProp)
32
32
 
33
33
  // Get responsive z-index value
34
34
  const maxMediaIndex = zOffset.length - 1
@@ -36,36 +36,51 @@ export function LayerProvider(props: LayerProviderProps): React.ReactElement {
36
36
  const zIndex = parent ? parent.zIndex + zOffset[mediaIndex] : zOffset[mediaIndex]
37
37
 
38
38
  // A state value that is used to keep track of the number of child layers on each level
39
- const [childLayers, setChildLayers] = useState<Record<number, number>>({})
40
- // A memo value that is used to keep track of the number of child levels
41
- const size = useMemo(() => Object.keys(childLayers).length, [childLayers])
39
+ const [, setChildLayers] = useState<Record<number, number>>({})
40
+
41
+ // A state value that is used to keep track of the number of child levels
42
+ const [size, setSize] = useState(0)
42
43
 
43
44
  const isTopLayer = size === 0
44
45
 
45
46
  const registerChild = useCallback(
46
- (childLevel: number) => {
47
+ (childLevel?: number) => {
47
48
  // Register child layers to the parent layer
48
49
  const parentDispose = parentRegisterChild?.(childLevel)
49
50
 
50
- setChildLayers((state) => {
51
- const prevLen = state[childLevel] ?? 0
52
- const nextState = {...state, [childLevel]: prevLen + 1}
53
-
54
- return nextState
55
- })
56
-
57
- return () => {
51
+ if (childLevel !== undefined) {
58
52
  setChildLayers((state) => {
59
- const nextState = {...state}
53
+ const prevLen = state[childLevel] ?? 0
54
+ const nextState = {...state, [childLevel]: prevLen + 1}
60
55
 
61
- if (nextState[childLevel] === 1) {
62
- delete nextState[childLevel]
63
- } else {
64
- nextState[childLevel] -= 1
65
- }
56
+ setSize(Object.keys(nextState).length)
66
57
 
67
58
  return nextState
68
59
  })
60
+ } else {
61
+ // Legacy behavior: if no child level is provided, increment the size by 1
62
+ setSize((v) => v + 1)
63
+ }
64
+
65
+ return () => {
66
+ if (childLevel !== undefined) {
67
+ setChildLayers((state) => {
68
+ const nextState = {...state}
69
+
70
+ if (nextState[childLevel] === 1) {
71
+ delete nextState[childLevel]
72
+
73
+ setSize(Object.keys(nextState).length)
74
+ } else {
75
+ nextState[childLevel] -= 1
76
+ }
77
+
78
+ return nextState
79
+ })
80
+ } else {
81
+ // Legacy behavior: if no child level is provided, decrement the size by 1
82
+ setSize((v) => v - 1)
83
+ }
69
84
 
70
85
  parentDispose?.()
71
86
  }
@@ -76,24 +91,17 @@ export function LayerProvider(props: LayerProviderProps): React.ReactElement {
76
91
  // Register this layer on mount
77
92
  useEffect(() => parentRegisterChild?.(level), [level, parentRegisterChild])
78
93
 
79
- const value = useMemo(
94
+ const value: LayerContextValue = useMemo(
80
95
  () => ({
81
- version: 0.0 as const,
96
+ version: 0.0,
82
97
  isTopLayer,
83
98
  level,
99
+ registerChild,
84
100
  size,
85
101
  zIndex,
86
102
  }),
87
- [isTopLayer, level, size, zIndex],
103
+ [isTopLayer, level, registerChild, size, zIndex],
88
104
  )
89
105
 
90
- return (
91
- <LayerContext.Provider value={value}>
92
- <LayerContextRegisterChild.Provider value={registerChild}>
93
- {children}
94
- </LayerContextRegisterChild.Provider>
95
- </LayerContext.Provider>
96
- )
106
+ return <LayerContext.Provider value={value}>{children}</LayerContext.Provider>
97
107
  }
98
-
99
- const LayerContextRegisterChild = createContext<((childLevel: number) => () => void) | null>(null)
@@ -3,6 +3,7 @@ export interface LayerContextValue {
3
3
  version: 0.0
4
4
  isTopLayer: boolean
5
5
  level?: number
6
+ registerChild: (childLevel?: number) => () => void
6
7
  size: number
7
8
  zIndex: number
8
9
  }