@sanity/ui 0.37.14-next.6 → 0.37.16

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 (54) hide show
  1. package/lib/dts/src/components/autocomplete/autocomplete.styles.d.ts +1 -1
  2. package/lib/dts/src/components/autocomplete/autocomplete.styles.d.ts.map +1 -1
  3. package/lib/dts/src/components/autocomplete/constants.d.ts.map +1 -1
  4. package/lib/dts/src/constants.d.ts +0 -10
  5. package/lib/dts/src/constants.d.ts.map +1 -1
  6. package/lib/dts/src/primitives/popover/{popoverArrow.d.ts → arrow.d.ts} +1 -1
  7. package/lib/dts/src/primitives/popover/arrow.d.ts.map +1 -0
  8. package/lib/dts/src/primitives/popover/modifiers/getPopoverModifiers.d.ts +4 -0
  9. package/lib/dts/src/primitives/popover/modifiers/getPopoverModifiers.d.ts.map +1 -0
  10. package/lib/dts/src/primitives/popover/modifiers/index.d.ts +2 -0
  11. package/lib/dts/src/primitives/popover/modifiers/index.d.ts.map +1 -0
  12. package/lib/dts/src/primitives/popover/modifiers/types.d.ts +18 -0
  13. package/lib/dts/src/primitives/popover/modifiers/types.d.ts.map +1 -0
  14. package/lib/dts/src/primitives/popover/modifiers/usePopoverModifiers.d.ts +4 -0
  15. package/lib/dts/src/primitives/popover/modifiers/usePopoverModifiers.d.ts.map +1 -0
  16. package/lib/dts/src/primitives/popover/popover.d.ts +5 -6
  17. package/lib/dts/src/primitives/popover/popover.d.ts.map +1 -1
  18. package/lib/dts/src/primitives/textArea/textArea.d.ts.map +1 -1
  19. package/lib/dts/src/primitives/textInput/textInput.d.ts.map +1 -1
  20. package/lib/dts/src/primitives/tooltip/tooltip.d.ts +0 -2
  21. package/lib/dts/src/primitives/tooltip/tooltip.d.ts.map +1 -1
  22. package/lib/dts/src/primitives/tooltip/tooltipArrow.d.ts.map +1 -1
  23. package/lib/dts/src/styles/input/textInputStyle.d.ts +3 -1
  24. package/lib/dts/src/styles/input/textInputStyle.d.ts.map +1 -1
  25. package/lib/sanity-ui.js +465 -490
  26. package/lib/sanity-ui.js.map +1 -1
  27. package/lib/sanity-ui.modern.mjs +584 -566
  28. package/lib/sanity-ui.modern.mjs.map +1 -1
  29. package/lib/sanity-ui.module.js +465 -491
  30. package/lib/sanity-ui.module.js.map +1 -1
  31. package/package.json +6 -5
  32. package/src/components/autocomplete/autocomplete.styles.tsx +5 -0
  33. package/src/components/autocomplete/constants.ts +3 -3
  34. package/src/constants.ts +0 -17
  35. package/src/primitives/popover/__workshop__/PlainStory.tsx +0 -1
  36. package/src/primitives/popover/__workshop__/RightAlignedStory.tsx +0 -1
  37. package/src/primitives/popover/__workshop__/TestStory.tsx +0 -1
  38. package/src/primitives/popover/{popoverArrow.tsx → arrow.tsx} +5 -5
  39. package/src/primitives/popover/modifiers/getPopoverModifiers.ts +137 -0
  40. package/src/primitives/popover/modifiers/index.ts +1 -0
  41. package/src/primitives/popover/modifiers/types.ts +18 -0
  42. package/src/primitives/popover/modifiers/usePopoverModifiers.ts +58 -0
  43. package/src/primitives/popover/popover.tsx +196 -229
  44. package/src/primitives/textArea/textArea.tsx +2 -0
  45. package/src/primitives/textInput/__workshop__/tones.tsx +222 -105
  46. package/src/primitives/textInput/textInput.tsx +5 -1
  47. package/src/primitives/tooltip/__workshop__/props.tsx +4 -5
  48. package/src/primitives/tooltip/tooltip.tsx +92 -159
  49. package/src/primitives/tooltip/tooltipArrow.tsx +10 -25
  50. package/src/styles/input/textInputStyle.ts +7 -5
  51. package/lib/dts/src/primitives/popover/popoverArrow.d.ts.map +0 -1
  52. package/lib/dts/src/primitives/popover/popoverCard.d.ts +0 -33
  53. package/lib/dts/src/primitives/popover/popoverCard.d.ts.map +0 -1
  54. package/src/primitives/popover/popoverCard.tsx +0 -160
@@ -1,30 +1,25 @@
1
- import {
2
- Middleware,
3
- arrow,
4
- autoUpdate,
5
- flip,
6
- offset,
7
- shift,
8
- useFloating,
9
- size as sizeMiddleware,
10
- RootBoundary,
11
- } from '@floating-ui/react-dom'
12
1
  import React, {
13
2
  cloneElement,
14
3
  forwardRef,
15
- memo,
16
4
  useCallback,
17
5
  useEffect,
18
6
  useMemo,
19
7
  useRef,
20
8
  useState,
21
9
  } from 'react'
22
- import {useForwardedRef, useArrayProp, useElementSize} from '../../hooks'
10
+ import {usePopper} from 'react-popper'
11
+ import styled, {css} from 'styled-components'
12
+ import {EMPTY_RECORD} from '../../constants'
13
+ import {useArrayProp, useForwardedRef} from '../../hooks'
23
14
  import {ThemeColorSchemeKey, useTheme} from '../../theme'
24
- import {BoxOverflow, CardTone, Placement, PopoverMargins} from '../../types'
25
- import {LayerProps, LayerProvider, Portal, useBoundaryElement} from '../../utils'
15
+ import {CardTone, Placement, PopoverMargins} from '../../types'
16
+ import {Layer, LayerProps, Portal, useBoundaryElement, usePortal} from '../../utils'
17
+ import {Card} from '../card'
18
+ import {ResponsiveWidthStyleProps} from '../container'
19
+ import {responsiveContainerWidthStyle} from '../container/styles'
26
20
  import {ResponsiveRadiusProps, ResponsiveShadowProps, ResponsiveWidthProps} from '../types'
27
- import {PopoverCard} from './popoverCard'
21
+ import {PopoverArrow} from './arrow'
22
+ import {usePopoverModifiers} from './modifiers'
28
23
 
29
24
  /**
30
25
  * @public
@@ -38,7 +33,6 @@ export interface PopoverProps
38
33
  * @beta
39
34
  */
40
35
  __unstable_margins?: PopoverMargins
41
- /** @deprecated Use `fallbackPlacements` instead. */
42
36
  allowedAutoPlacements?: Placement[]
43
37
  arrow?: boolean
44
38
  boundaryElement?: HTMLElement | null
@@ -48,7 +42,6 @@ export interface PopoverProps
48
42
  disabled?: boolean
49
43
  fallbackPlacements?: Placement[]
50
44
  open?: boolean
51
- overflow?: BoxOverflow
52
45
  padding?: number | number[]
53
46
  placement?: Placement
54
47
  portal?: boolean | string
@@ -56,243 +49,217 @@ export interface PopoverProps
56
49
  referenceElement?: HTMLElement | null
57
50
  matchReferenceWidth?: boolean
58
51
  scheme?: ThemeColorSchemeKey
59
- /** @deprecated No longer supported. */
60
52
  tether?: boolean
61
- /** @deprecated No longer supported. */
62
53
  tetherOffset?: number | ((...args: any[]) => number)
63
54
  tone?: CardTone
64
55
  }
65
56
 
66
- function size(scope: {
67
- boundaryElement: HTMLElement | null
68
- constrainSize: boolean
69
- matchReferenceWidth: boolean | undefined
70
- setAvailableWidth: (v: number) => void
71
- setAvailableHeight: (v: number) => void
72
- setReferenceWidth: (v: number) => void
73
- }) {
74
- return sizeMiddleware({
75
- apply(args) {
76
- if (scope.constrainSize) {
77
- scope.setAvailableWidth(args.availableWidth)
78
- scope.setAvailableHeight(args.availableHeight)
79
- }
80
-
81
- if (scope.matchReferenceWidth) {
82
- scope.setReferenceWidth(args.rects.reference.width)
83
- }
84
- },
85
- boundary: scope.boundaryElement || undefined,
86
- })
87
- }
88
-
89
- export const Popover = memo(
90
- forwardRef(function Popover(
91
- props: PopoverProps &
92
- Omit<React.HTMLProps<HTMLDivElement>, 'as' | 'children' | 'content' | 'width'>,
93
- ref: React.ForwardedRef<HTMLDivElement>
94
- ): React.ReactElement {
95
- const theme = useTheme()
96
- const boundaryElementContext = useBoundaryElement()
97
-
98
- const {
99
- __unstable_margins: margins,
100
- allowedAutoPlacements,
101
- arrow: arrowProp = true,
102
- boundaryElement = boundaryElementContext.element,
103
- children: childProp,
104
- constrainSize = false,
105
- content,
106
- disabled,
107
- fallbackPlacements,
108
- matchReferenceWidth: matchReferenceWidthProp,
109
- open,
110
- overflow = props.constrainSize ? 'auto' : undefined,
111
- padding: paddingProp,
112
- placement: placementProp = 'bottom',
113
- portal,
114
- preventOverflow = true,
115
- radius: radiusProp = 3,
116
- referenceElement,
117
- scheme,
118
- shadow: shadowProp = 3,
119
- tether,
120
- tetherOffset,
121
- tone = 'inherit',
122
- width: widthProp = undefined,
123
- zOffset: zOffsetProp = theme.sanity.layer?.popover.zOffset,
124
- ...restProps
125
- } = props
126
- const boundarySize = useElementSize(boundaryElement)?.border
127
- const padding = useArrayProp(paddingProp)
128
- const radius = useArrayProp(radiusProp)
129
- const shadow = useArrayProp(shadowProp)
130
- const width = useArrayProp(widthProp)
131
- const zOffset = useArrayProp(zOffsetProp)
132
- const [availableWidth, setAvailableWidth] = useState<number | undefined>(undefined)
133
- const [availableHeight, setAvailableHeight] = useState<number | undefined>(undefined)
134
- const [referenceWidth, setReferenceWidth] = useState<number | undefined>(undefined)
135
- const forwardedRef = useForwardedRef(ref)
136
- const arrowRef = useRef<HTMLDivElement | null>(null)
137
- const rootBoundary: RootBoundary = 'viewport'
57
+ const Root = styled(Layer)<{$preventOverflow?: boolean}>(
58
+ ({$preventOverflow}) => css`
59
+ pointer-events: none;
60
+ display: flex;
61
+ flex-direction: column;
62
+ max-width: calc(100% - 16px);
138
63
 
139
- const middleware = useMemo(() => {
140
- const ret: Middleware[] = []
64
+ & > * {
65
+ min-height: 0;
66
+ }
141
67
 
142
- // Flip the floating element when leaving the boundary box
143
- if (constrainSize || preventOverflow) {
144
- ret.push(
145
- flip({
146
- boundary: boundaryElement || undefined,
147
- fallbackPlacements,
148
- padding: 8,
149
- rootBoundary,
150
- })
151
- )
68
+ /* Hide the popover when the reference element is out of bounds */
69
+ ${$preventOverflow &&
70
+ css`
71
+ &[data-popper-reference-hidden='true'] {
72
+ display: none;
152
73
  }
74
+ `}
75
+ `
76
+ )
153
77
 
154
- // Track sizes
155
- ret.push(
156
- size({
157
- boundaryElement,
158
- constrainSize,
159
- matchReferenceWidth: matchReferenceWidthProp,
160
- setAvailableHeight,
161
- setAvailableWidth,
162
- setReferenceWidth,
163
- })
164
- )
78
+ const PopoverCard = styled(Card)<
79
+ ResponsiveWidthStyleProps & {
80
+ $constrainSize?: boolean
81
+ $preventOverflow?: boolean
82
+ $width: (number | 'auto')[]
83
+ }
84
+ >(
85
+ ({$constrainSize}) => css`
86
+ flex: 1;
87
+ max-height: ${$constrainSize && '100%'};
88
+ pointer-events: all;
165
89
 
166
- // Define distance between reference and floating element
167
- ret.push(offset({mainAxis: arrowProp ? 4 : 0}))
90
+ && {
91
+ display: flex;
92
+ }
168
93
 
169
- // Shift the popover so its sits with the boundary eleement
170
- if (preventOverflow) {
171
- ret.push(
172
- shift({
173
- boundary: boundaryElement || undefined,
174
- rootBoundary,
175
- padding: 8,
176
- })
177
- )
178
- }
94
+ flex-direction: column;
179
95
 
180
- // Place arrow
181
- if (arrowProp) {
182
- ret.push(arrow({element: arrowRef, padding: 4}))
183
- }
96
+ & > * {
97
+ min-height: 0;
98
+ }
184
99
 
185
- return ret
186
- }, [
187
- arrowProp,
188
- boundaryElement,
189
- constrainSize,
190
- fallbackPlacements,
191
- matchReferenceWidthProp,
192
- preventOverflow,
193
- ])
100
+ ${responsiveContainerWidthStyle}
101
+ `
102
+ )
194
103
 
195
- const {x, y, placement, reference, floating, middlewareData, strategy} = useFloating({
196
- middleware,
197
- placement: placementProp,
198
- whileElementsMounted: autoUpdate,
199
- })
104
+ /**
105
+ * @public
106
+ */
107
+ export const Popover = forwardRef(function Popover(
108
+ props: PopoverProps &
109
+ Omit<React.HTMLProps<HTMLDivElement>, 'as' | 'children' | 'content' | 'width'>,
110
+ ref: React.ForwardedRef<HTMLDivElement>
111
+ ) {
112
+ const boundaryElementContext = useBoundaryElement()
113
+ const theme = useTheme()
114
+ const {
115
+ __unstable_margins: margins,
116
+ allowedAutoPlacements,
117
+ arrow = true,
118
+ boundaryElement: boundaryElementProp = boundaryElementContext.element,
119
+ children: child,
120
+ content,
121
+ constrainSize,
122
+ disabled,
123
+ fallbackPlacements,
124
+ open = false,
125
+ padding,
126
+ placement = 'bottom',
127
+ portal: portalProp = false,
128
+ preventOverflow,
129
+ radius = 3,
130
+ referenceElement: referenceElementProp,
131
+ matchReferenceWidth,
132
+ shadow = 3,
133
+ scheme,
134
+ style = EMPTY_RECORD,
135
+ tether,
136
+ tetherOffset,
137
+ tone = 'inherit',
138
+ width: widthProp = 0,
139
+ zOffset = theme.sanity.layer?.popover.zOffset,
140
+ ...restProps
141
+ } = props
142
+ const forwardedRef = useForwardedRef(ref)
143
+ const portal = usePortal()
144
+ const [referenceElement, setReferenceElement] = useState<HTMLElement | null>(null)
145
+ const [popperElement, setPopperElement] = useState<HTMLElement | null>(null)
146
+ const [arrowElement, setArrowElement] = useState<HTMLElement | null>(null)
147
+ const popperReferenceElement = referenceElementProp || referenceElement
148
+ const width = useArrayProp(matchReferenceWidth ? 'auto' : widthProp)
200
149
 
201
- const arrowX = middlewareData.arrow?.x
202
- const arrowY = middlewareData.arrow?.y
150
+ const modifiers = usePopoverModifiers({
151
+ allowedAutoPlacements,
152
+ arrow,
153
+ arrowElement,
154
+ boundaryElement: boundaryElementProp || portal.boundaryElement,
155
+ constrainSize,
156
+ distance: arrow ? 4 : 0,
157
+ fallbackPlacements,
158
+ margins,
159
+ matchReferenceWidth,
160
+ open,
161
+ preventOverflow,
162
+ skidding: 0,
163
+ tether,
164
+ tetherOffset,
165
+ })
203
166
 
204
- const setArrow = useCallback((arrowEl: HTMLDivElement | null) => {
205
- arrowRef.current = arrowEl
206
- }, [])
167
+ const popper = usePopper(popperReferenceElement, popperElement, {
168
+ placement,
169
+ modifiers,
170
+ })
207
171
 
208
- const setFloating = useCallback(
209
- (node: HTMLDivElement | null) => {
210
- forwardedRef.current = node
211
- floating(node)
212
- },
213
- [floating, forwardedRef]
214
- )
172
+ const {attributes, forceUpdate, styles} = popper
215
173
 
216
- const setReference = useCallback(
217
- (node: HTMLElement | null) => {
218
- reference(node)
174
+ const setRef = useCallback(
175
+ (el: HTMLElement | null) => {
176
+ const childRef = (child as any).ref
219
177
 
220
- const childRef = (childProp as any)?.ref
178
+ setReferenceElement(el)
221
179
 
222
- if (typeof childRef === 'function') {
223
- childRef(node)
224
- } else if (childRef) {
225
- childRef.current = node
226
- }
227
- },
228
- [childProp, reference]
229
- )
180
+ if (typeof childRef === 'function') {
181
+ childRef(el)
182
+ } else if (childRef) {
183
+ childRef.current = el
184
+ }
185
+ },
186
+ [child]
187
+ )
230
188
 
231
- const child = useMemo(() => {
232
- if (!childProp || referenceElement) return null
189
+ const setRootRef = useCallback(
190
+ (el: HTMLDivElement | null) => {
191
+ setPopperElement(el)
192
+ forwardedRef.current = el
193
+ },
194
+ [forwardedRef]
195
+ )
233
196
 
234
- return cloneElement(childProp, {ref: setReference})
235
- }, [childProp, referenceElement, setReference])
197
+ const popoverStyle = useMemo(() => ({...style, ...styles.popper}), [style, styles])
236
198
 
237
- useEffect(() => {
238
- if (referenceElement) reference(referenceElement)
239
- }, [reference, referenceElement])
199
+ const updateTimeoutRef = useRef<NodeJS.Timeout | null>(null)
240
200
 
241
- if (disabled) {
242
- return childProp || <></>
201
+ useEffect(() => {
202
+ if (updateTimeoutRef.current) {
203
+ clearTimeout(updateTimeoutRef.current)
204
+ updateTimeoutRef.current = null
243
205
  }
244
206
 
245
- const popover = (
246
- <LayerProvider zOffset={zOffset}>
247
- <PopoverCard
248
- {...restProps}
249
- __unstable_margins={margins}
250
- arrow={arrowProp}
251
- arrowRef={setArrow}
252
- arrowX={arrowX}
253
- arrowY={arrowY}
254
- availableWidth={constrainSize ? availableWidth : undefined}
255
- availableHeight={constrainSize ? availableHeight : undefined}
256
- boundaryWidth={boundarySize?.width}
257
- overflow={overflow}
258
- padding={padding}
259
- placement={placement}
260
- radius={radius}
261
- ref={setFloating}
262
- referenceWidth={matchReferenceWidthProp ? referenceWidth : undefined}
263
- scheme={scheme}
264
- shadow={shadow}
265
- strategy={strategy}
266
- tone={tone}
267
- x={x}
268
- y={y}
269
- width={width}
270
- >
271
- {content}
272
- </PopoverCard>
273
- </LayerProvider>
274
- )
207
+ updateTimeoutRef.current = setTimeout(() => {
208
+ if (forceUpdate) {
209
+ try {
210
+ forceUpdate()
211
+ } catch (_) {
212
+ // ignore caught error
213
+ }
214
+ }
215
+ }, 0)
216
+ }, [content, forceUpdate, open, popperReferenceElement])
275
217
 
276
- return (
277
- <>
278
- {/* the popover */}
279
- {open && (
280
- <>
281
- {portal ? (
282
- <Portal __unstable_name={typeof portal === 'string' ? portal : undefined}>
283
- {popover}
284
- </Portal>
285
- ) : (
286
- popover
287
- )}
288
- </>
289
- )}
218
+ if (disabled) {
219
+ return child || <></>
220
+ }
290
221
 
291
- {/* the referred element */}
292
- {child}
293
- </>
294
- )
295
- })
296
- )
222
+ const node = (
223
+ <Root
224
+ data-ui="Popover"
225
+ {...restProps}
226
+ $preventOverflow={preventOverflow}
227
+ ref={setRootRef}
228
+ style={popoverStyle}
229
+ zOffset={zOffset}
230
+ {...attributes.popper}
231
+ >
232
+ <PopoverCard
233
+ $constrainSize={constrainSize}
234
+ $width={width}
235
+ data-ui="PopoverCard"
236
+ padding={padding}
237
+ radius={radius}
238
+ scheme={scheme}
239
+ shadow={shadow}
240
+ tone={tone}
241
+ >
242
+ {arrow && <PopoverArrow ref={setArrowElement} style={styles.arrow} />}
243
+ {content}
244
+ </PopoverCard>
245
+ </Root>
246
+ )
247
+
248
+ return (
249
+ <>
250
+ {child && !referenceElementProp ? cloneElement(child, {ref: setRef}) : child || <></>}
251
+
252
+ {open && (
253
+ <>
254
+ {portalProp && (
255
+ <Portal __unstable_name={typeof portalProp === 'string' ? portalProp : undefined}>
256
+ {node}
257
+ </Portal>
258
+ )}
297
259
 
298
- Popover.displayName = 'Popover'
260
+ {!portalProp && node}
261
+ </>
262
+ )}
263
+ </>
264
+ )
265
+ })
@@ -80,6 +80,7 @@ export const TextArea = forwardRef(function TextArea(
80
80
  {...restProps}
81
81
  $fontSize={useArrayProp(fontSize)}
82
82
  $padding={useArrayProp(padding)}
83
+ $scheme={rootTheme.scheme}
83
84
  $space={useArrayProp(0)}
84
85
  $tone={rootTheme.tone}
85
86
  $weight={weight}
@@ -89,6 +90,7 @@ export const TextArea = forwardRef(function TextArea(
89
90
  <Presentation
90
91
  $border={border}
91
92
  $radius={useArrayProp(radius)}
93
+ $scheme={rootTheme.scheme}
92
94
  $tone={rootTheme.tone}
93
95
  data-tone={rootTheme.tone}
94
96
  />