@sanity/ui 3.0.0-static.11 → 3.0.0-static.13

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 (251) hide show
  1. package/dist/_chunks-cjs/_visual-editing.js +1293 -1215
  2. package/dist/_chunks-cjs/_visual-editing.js.map +1 -1
  3. package/dist/_chunks-cjs/buildCommand.js +28 -10
  4. package/dist/_chunks-cjs/buildCommand.js.map +1 -1
  5. package/dist/_chunks-es/_visual-editing.mjs +1284 -1202
  6. package/dist/_chunks-es/_visual-editing.mjs.map +1 -1
  7. package/dist/_visual-editing.d.mts +528 -358
  8. package/dist/_visual-editing.d.ts +528 -358
  9. package/dist/cli.js +1 -1
  10. package/dist/css.d.mts +143 -73
  11. package/dist/css.d.ts +143 -73
  12. package/dist/css.js +329 -472
  13. package/dist/css.js.map +1 -1
  14. package/dist/css.mjs +330 -473
  15. package/dist/css.mjs.map +1 -1
  16. package/dist/index.d.mts +1362 -869
  17. package/dist/index.d.ts +1362 -869
  18. package/dist/index.js +383 -308
  19. package/dist/index.js.map +1 -1
  20. package/dist/index.mjs +387 -312
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/sanity-palette.css +105 -1
  23. package/dist/sanity-palette.min.css +1 -0
  24. package/dist/sanity-theme.css +4571 -1
  25. package/dist/sanity-theme.min.css +1 -0
  26. package/dist/system.css +22053 -21946
  27. package/dist/system.min.css +1 -0
  28. package/dist/theme.d.mts +51 -106
  29. package/dist/theme.d.ts +51 -106
  30. package/dist/theme.js +9 -9
  31. package/dist/theme.js.map +1 -1
  32. package/dist/theme.mjs +9 -9
  33. package/dist/theme.mjs.map +1 -1
  34. package/package.json +10 -5
  35. package/src/cli/buildCommand.ts +46 -19
  36. package/src/css/_comp.ts +2 -2
  37. package/src/css/{compile/compileStyle.ts → _compileStyle.ts} +7 -7
  38. package/src/css/{system.style.ts → _system.style.ts} +3 -2
  39. package/src/css/aspects/display/display.ts +1 -0
  40. package/src/css/aspects/display/types.ts +2 -3
  41. package/src/css/aspects/flex/types.ts +4 -12
  42. package/src/css/aspects/flexItem/types.ts +1 -3
  43. package/src/css/aspects/font/types.ts +1 -3
  44. package/src/css/aspects/grid/grid.ts +1 -0
  45. package/src/css/aspects/grid/types.ts +5 -9
  46. package/src/css/aspects/gridItem/gridItem.ts +1 -1
  47. package/src/css/aspects/gridItem/types.ts +7 -18
  48. package/src/css/aspects/height/height.ts +3 -4
  49. package/src/css/aspects/inset/inset.ts +1 -0
  50. package/src/css/aspects/margin/margin.ts +1 -0
  51. package/src/css/aspects/margin/types.ts +1 -0
  52. package/src/css/aspects/maxWidth/maxWidth.ts +1 -0
  53. package/src/css/aspects/maxWidth/types.ts +1 -0
  54. package/src/css/aspects/minWidth/minWidth.ts +1 -0
  55. package/src/css/aspects/minWidth/types.ts +2 -0
  56. package/src/css/aspects/overflow/overflow.ts +1 -0
  57. package/src/css/aspects/padding/padding.ts +1 -0
  58. package/src/css/aspects/pointerEvents/pointerEvents.ts +1 -0
  59. package/src/css/aspects/position/position.ts +1 -0
  60. package/src/css/aspects/shadow/shadow.ts +1 -0
  61. package/src/css/aspects/textOverflow/textOverflow.ts +1 -0
  62. package/src/css/aspects/textOverflow/types.ts +1 -0
  63. package/src/css/aspects/width/types.ts +2 -0
  64. package/src/css/aspects/width/width.ts +1 -0
  65. package/src/css/{compile/compilePalette.ts → compilePalette.ts} +14 -10
  66. package/src/css/compileSystem.ts +7 -0
  67. package/src/css/{compile/compileTheme.ts → compileTheme.ts} +1 -0
  68. package/src/css/{compile/compileTheme_v3.ts → compileTheme_v3.ts} +123 -104
  69. package/src/css/components/breadcrumbs/breadcrumbs.ts +1 -0
  70. package/src/css/components/dialog/dialog.ts +7 -0
  71. package/src/css/components/menu/menu.ts +2 -0
  72. package/src/css/components/skeleton/skeleton.ts +4 -0
  73. package/src/css/components/skeleton/types.ts +4 -0
  74. package/src/css/components/toast/toast.ts +5 -0
  75. package/src/css/components/tree/tree.ts +1 -0
  76. package/src/css/composeClassNames.ts +4 -2
  77. package/src/css/constants.ts +2 -0
  78. package/src/css/index.ts +3 -3
  79. package/src/css/primitives/_arrow/_arrow.ts +3 -0
  80. package/src/css/primitives/_input/input.ts +2 -0
  81. package/src/css/primitives/_selectable/_selectable.style.ts +1 -2
  82. package/src/css/primitives/_selectable/selectable.ts +1 -2
  83. package/src/css/primitives/avatar/avatar.style.ts +5 -8
  84. package/src/css/primitives/avatar/avatar.ts +6 -0
  85. package/src/css/primitives/avatar/types.ts +1 -0
  86. package/src/css/primitives/box/types.ts +1 -3
  87. package/src/css/primitives/button/button.ts +4 -21
  88. package/src/css/primitives/button/index.ts +1 -0
  89. package/src/css/primitives/button/types.ts +18 -0
  90. package/src/css/primitives/card/card.style.ts +3 -6
  91. package/src/css/primitives/card/card.ts +2 -2
  92. package/src/css/primitives/card/types.ts +2 -2
  93. package/src/css/primitives/checkbox/checkbox.ts +2 -0
  94. package/src/css/primitives/container/container.ts +1 -0
  95. package/src/css/primitives/container/types.ts +1 -0
  96. package/src/css/primitives/kbd/kbd.ts +1 -0
  97. package/src/css/primitives/label/types.ts +7 -2
  98. package/src/css/primitives/popover/popover.ts +2 -0
  99. package/src/css/primitives/radio/radio.ts +1 -0
  100. package/src/css/primitives/select/select.ts +2 -0
  101. package/src/css/primitives/spinner/spinner.ts +2 -0
  102. package/src/css/primitives/switch/switch.ts +5 -0
  103. package/src/css/primitives/text/types.ts +4 -0
  104. package/src/css/primitives/textArea/textArea.ts +1 -0
  105. package/src/css/primitives/textInput/textInput.ts +1 -0
  106. package/src/css/primitives/tooltip/tooltip.ts +2 -0
  107. package/src/css/scopeClassName.ts +1 -0
  108. package/src/css/types.ts +9 -12
  109. package/src/css/util.ts +5 -0
  110. package/src/css/utils/srOnly/srOnly.ts +3 -1
  111. package/src/css/varNames.ts +131 -141
  112. package/src/css/vars.ts +1 -6
  113. package/src/theme/palette/constants.ts +2 -0
  114. package/src/theme/palette/types.ts +3 -0
  115. package/src/theme/types.ts +2 -6
  116. package/src/theme/v0/focusRing.ts +1 -3
  117. package/src/theme/v0/font.ts +6 -18
  118. package/src/theme/v0/layer.ts +1 -3
  119. package/src/theme/v0/shadow.ts +2 -6
  120. package/src/theme/v2/avatar.ts +1 -3
  121. package/src/theme/v2/color/_system.ts +1 -3
  122. package/src/theme/v2/color/avatar.ts +2 -6
  123. package/src/theme/v2/color/badge.ts +2 -6
  124. package/src/theme/v2/color/button.ts +3 -9
  125. package/src/theme/v2/color/color.ts +3 -9
  126. package/src/theme/v2/color/input.ts +3 -9
  127. package/src/theme/v2/color/kbd.ts +1 -3
  128. package/src/theme/v2/color/selectable.ts +2 -6
  129. package/src/theme/v2/color/state.ts +1 -3
  130. package/src/theme/v2/color/syntax.ts +1 -3
  131. package/src/theme/v2/input.ts +1 -3
  132. package/src/theme/v2/theme.ts +2 -6
  133. package/src/theme/v3/buildTheme_v3.ts +1 -0
  134. package/src/theme/v3/color/color.ts +6 -4
  135. package/src/theme/v3/color/renderColor.ts +4 -1
  136. package/src/theme/v3/defaultTokens.ts +1 -0
  137. package/src/theme/v3/resolveTokens.ts +9 -9
  138. package/src/ui/RootClassNames.tsx +3 -0
  139. package/src/ui/StyleTags.tsx +3 -1
  140. package/src/ui/_compat/theme/themeColorProvider.tsx +2 -6
  141. package/src/ui/_compat/theme/themeProvider.tsx +2 -6
  142. package/src/ui/_compat/theme/types.ts +1 -3
  143. package/src/ui/_compat/theme/useRootTheme.ts +1 -3
  144. package/src/ui/_compat/theme/useTheme.ts +2 -6
  145. package/src/ui/components/autocomplete/__workshop__/constrainedHeight.tsx +2 -2
  146. package/src/ui/components/autocomplete/autocomplete.tsx +86 -114
  147. package/src/ui/components/autocomplete/autocompleteOption.tsx +2 -0
  148. package/src/ui/components/autocomplete/types.ts +3 -8
  149. package/src/ui/components/breadcrumbs/breadcrumbs.tsx +27 -21
  150. package/src/ui/components/dialog/dialog.tsx +89 -291
  151. package/src/ui/components/dialog/dialogCard.tsx +183 -0
  152. package/src/ui/components/dialog/isTargetWithinScope.ts +14 -0
  153. package/src/ui/components/hotkeys/hotkeys.tsx +33 -15
  154. package/src/ui/components/menu/__workshop__/asComponent.tsx +6 -6
  155. package/src/ui/components/menu/menu.tsx +27 -33
  156. package/src/ui/components/menu/menuButton.tsx +10 -14
  157. package/src/ui/components/menu/menuDivider.tsx +25 -13
  158. package/src/ui/components/menu/menuGroup.tsx +34 -26
  159. package/src/ui/components/menu/menuItem.tsx +51 -40
  160. package/src/ui/components/skeleton/codeSkeleton.tsx +53 -0
  161. package/src/ui/components/skeleton/headingSkeleton.tsx +52 -0
  162. package/src/ui/components/skeleton/index.ts +3 -0
  163. package/src/ui/components/skeleton/labelSkeleton.tsx +51 -0
  164. package/src/ui/components/skeleton/skeleton.tsx +39 -16
  165. package/src/ui/components/skeleton/textSkeleton.tsx +31 -110
  166. package/src/ui/components/tab/tab.tsx +23 -19
  167. package/src/ui/components/tab/tabList.tsx +34 -33
  168. package/src/ui/components/tab/tabPanel.tsx +25 -19
  169. package/src/ui/components/toast/toast.tsx +21 -16
  170. package/src/ui/components/toast/toastLayer.tsx +28 -10
  171. package/src/ui/components/toast/toastProvider.tsx +2 -6
  172. package/src/ui/components/toast/types.ts +2 -6
  173. package/src/ui/components/toast/useToast.ts +1 -3
  174. package/src/ui/components/tree/tree.tsx +194 -187
  175. package/src/ui/components/tree/treeGroup.tsx +25 -5
  176. package/src/ui/components/tree/treeItem.tsx +35 -23
  177. package/src/ui/hooks/useClickOutside.ts +2 -6
  178. package/src/ui/hooks/useClickOutsideEvent.ts +3 -9
  179. package/src/ui/primitives/_selectable/selectable.tsx +33 -20
  180. package/src/ui/primitives/avatar/avatar.tsx +28 -31
  181. package/src/ui/primitives/avatar/avatarCounter.tsx +33 -25
  182. package/src/ui/primitives/avatar/avatarStack.tsx +31 -24
  183. package/src/ui/primitives/avatar/types.ts +2 -0
  184. package/src/ui/primitives/badge/__workshop__/props.tsx +1 -9
  185. package/src/ui/primitives/badge/__workshop__/tones.tsx +1 -6
  186. package/src/ui/primitives/badge/badge.tsx +33 -32
  187. package/src/ui/primitives/badge/types.ts +2 -1
  188. package/src/ui/primitives/box/box.tsx +59 -29
  189. package/src/ui/primitives/button/__workshop__/sanityUploadButton.tsx +3 -3
  190. package/src/ui/primitives/button/__workshop__/uploadButton.tsx +2 -1
  191. package/src/ui/primitives/button/button.test.tsx +1 -15
  192. package/src/ui/primitives/button/button.tsx +64 -70
  193. package/src/ui/primitives/card/__workshop__/asComponent.tsx +3 -3
  194. package/src/ui/primitives/card/card.tsx +22 -22
  195. package/src/ui/primitives/card/cardProvider.tsx +2 -0
  196. package/src/ui/primitives/checkbox/checkbox.tsx +26 -15
  197. package/src/ui/primitives/code/code.tsx +24 -22
  198. package/src/ui/primitives/container/container.tsx +26 -15
  199. package/src/ui/primitives/flex/flex.tsx +21 -19
  200. package/src/ui/primitives/grid/grid.tsx +21 -16
  201. package/src/ui/primitives/heading/heading.tsx +42 -19
  202. package/src/ui/primitives/inline/inline.tsx +26 -23
  203. package/src/ui/primitives/kbd/kbd.tsx +25 -23
  204. package/src/ui/primitives/label/label.tsx +41 -26
  205. package/src/ui/primitives/popover/popover.tsx +281 -277
  206. package/src/ui/primitives/popover/popoverCard.tsx +119 -118
  207. package/src/ui/primitives/radio/radio.tsx +30 -14
  208. package/src/ui/primitives/select/select.tsx +24 -16
  209. package/src/ui/primitives/spinner/animatedSpinnerIcon.tsx +4 -2
  210. package/src/ui/primitives/spinner/spinner.tsx +24 -12
  211. package/src/ui/primitives/stack/stack.tsx +27 -18
  212. package/src/ui/primitives/switch/switch.tsx +31 -14
  213. package/src/ui/primitives/text/text.tsx +42 -24
  214. package/src/ui/primitives/textArea/textArea.tsx +33 -18
  215. package/src/ui/primitives/textInput/textInput.tsx +28 -40
  216. package/src/ui/primitives/tooltip/constants.ts +1 -1
  217. package/src/ui/primitives/tooltip/tooltip.tsx +76 -59
  218. package/src/ui/primitives/tooltip/tooltipCard.tsx +89 -82
  219. package/src/ui/primitives/types.ts +1 -3
  220. package/src/ui/types/avatar.ts +3 -6
  221. package/src/ui/types/badge.ts +1 -3
  222. package/src/ui/types/button.ts +1 -3
  223. package/src/ui/types/card.ts +1 -3
  224. package/src/ui/types/dialog.ts +1 -3
  225. package/src/ui/types/props.ts +20 -10
  226. package/src/ui/utils/arrow/arrow.tsx +40 -14
  227. package/src/ui/utils/boundaryElement/boundaryElementProvider.tsx +2 -6
  228. package/src/ui/utils/boundaryElement/types.ts +1 -3
  229. package/src/ui/utils/boundaryElement/useBoundaryElement.ts +1 -3
  230. package/src/ui/utils/elementQuery/elementQuery.tsx +36 -14
  231. package/src/ui/utils/errorBoundary.tsx +2 -0
  232. package/src/ui/utils/index.ts +0 -1
  233. package/src/ui/utils/layer/layer.tsx +23 -93
  234. package/src/ui/utils/layer/layerCard.tsx +92 -0
  235. package/src/ui/utils/layer/layerProvider.tsx +2 -6
  236. package/src/ui/utils/layer/useLayer.ts +1 -3
  237. package/src/ui/utils/portal/portal.ts +2 -6
  238. package/src/ui/utils/portal/portalProvider.tsx +2 -6
  239. package/src/ui/utils/portal/types.ts +1 -3
  240. package/src/ui/utils/portal/usePortal.ts +1 -3
  241. package/src/ui/utils/srOnly/srOnly.tsx +25 -20
  242. package/src/ui/utils/virtualList/virtualList.tsx +36 -24
  243. package/src/css/compile/compileRule.ts +0 -97
  244. package/src/css/compile/compileRules.test.ts +0 -36
  245. package/src/css/compile/compileRules.ts +0 -43
  246. package/src/css/compile/compileSystem.ts +0 -7
  247. package/src/css/compile/types.ts +0 -6
  248. package/src/css/primitives/_selectable/_contants.ts +0 -11
  249. package/src/css/primitives/card/_constants.ts +0 -13
  250. package/src/ui/utils/conditionalWrapper/conditionalWrapper.tsx +0 -23
  251. package/src/ui/utils/conditionalWrapper/index.ts +0 -1
@@ -3,22 +3,19 @@ import {
3
3
  autoUpdate,
4
4
  flip,
5
5
  hide,
6
- Middleware,
6
+ type Middleware,
7
7
  offset,
8
- RootBoundary,
8
+ type RootBoundary,
9
9
  shift,
10
10
  useFloating,
11
11
  } from '@floating-ui/react-dom'
12
12
  import {AnimatePresence} from 'framer-motion'
13
13
  import {
14
14
  cloneElement,
15
- ForwardedRef,
16
- forwardRef,
17
- memo,
18
- MutableRefObject,
19
- ReactElement,
20
- ReactNode,
21
- RefCallback,
15
+ type ForwardedRef,
16
+ type ReactElement,
17
+ type ReactNode,
18
+ type Ref,
22
19
  useCallback,
23
20
  useEffect,
24
21
  useImperativeHandle,
@@ -29,9 +26,9 @@ import {
29
26
  import {Z_OFFSETS} from '../../constants'
30
27
  import {useArrayProp, usePrefersReducedMotion} from '../../hooks'
31
28
  import {origin} from '../../middleware/origin'
32
- import {Placement, PopoverMargins, Props} from '../../types'
33
- import {LayerProps, LayerProvider, Portal, useBoundaryElement, useLayer} from '../../utils'
34
- import {CardProps, CardProvider, useCard} from '../card'
29
+ import type {ComponentType, Placement, PopoverMargins, Props} from '../../types'
30
+ import {type LayerOwnProps, LayerProvider, Portal, useBoundaryElement, useLayer} from '../../utils'
31
+ import {CardProvider, useCard} from '../card'
35
32
  import {
36
33
  DEFAULT_FALLBACK_PLACEMENTS,
37
34
  DEFAULT_POPOVER_DISTANCE,
@@ -40,10 +37,13 @@ import {
40
37
  } from './constants'
41
38
  import {size} from './floating-ui/size'
42
39
  import {PopoverCard} from './popoverCard'
43
- import {PopoverUpdateCallback} from './types'
40
+ import type {PopoverUpdateCallback} from './types'
44
41
 
45
42
  /** @public */
46
- export interface PopoverProps extends CardProps, LayerProps {
43
+ export const DEFAULT_POPOVER_ELEMENT = 'div'
44
+
45
+ /** @public */
46
+ export type PopoverOwnProps = LayerOwnProps & {
47
47
  /** @beta */
48
48
  __unstable_margins?: PopoverMargins
49
49
  /**
@@ -101,12 +101,19 @@ export interface PopoverProps extends CardProps, LayerProps {
101
101
  */
102
102
  referenceElement?: HTMLElement | null
103
103
  /** @beta */
104
- updateRef?:
105
- | MutableRefObject<PopoverUpdateCallback | undefined>
106
- | RefCallback<PopoverUpdateCallback | undefined>
104
+ updateRef?: Ref<PopoverUpdateCallback | undefined>
107
105
  }
108
106
 
109
- const ViewportOverlay = () => {
107
+ /** @public */
108
+ export type PopoverElementType = 'div' | ComponentType
109
+
110
+ /** @public */
111
+ export type PopoverProps<E extends PopoverElementType = PopoverElementType> = Props<
112
+ PopoverOwnProps,
113
+ E
114
+ >
115
+
116
+ function ViewportOverlay() {
110
117
  const {zIndex} = useLayer()
111
118
 
112
119
  return (
@@ -127,289 +134,286 @@ const ViewportOverlay = () => {
127
134
  *
128
135
  * @public
129
136
  */
130
- export const Popover = memo(
131
- forwardRef(function Popover(
132
- props: Props<PopoverProps, 'div'>,
133
- forwardedRef: ForwardedRef<HTMLDivElement>,
134
- ): ReactElement {
135
- const boundaryElementContext = useBoundaryElement()
136
-
137
- const {
138
- __unstable_margins: margins = DEFAULT_POPOVER_MARGINS,
139
- animate: _animate = false,
140
- arrow: arrowProp = false,
141
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
142
- boundaryElement = boundaryElementContext.element,
143
- children: childProp,
144
- constrainSize = false,
145
- content,
146
- disabled,
147
- fallbackPlacements = props.fallbackPlacements ??
148
- DEFAULT_FALLBACK_PLACEMENTS[props.placement ?? 'bottom'],
149
- matchReferenceWidth,
150
- floatingBoundary = props.boundaryElement ?? boundaryElementContext.element,
151
- modal,
152
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
153
- onActivate,
154
- open,
155
- overflow = 'hidden',
156
- padding,
157
- placement: placementProp = 'bottom',
158
- portal,
159
- preventOverflow = true,
160
- radius = 3,
161
- referenceBoundary = props.boundaryElement ?? boundaryElementContext.element,
162
- referenceElement,
163
- scheme,
164
- shadow = 3,
165
- tone = 'inherit',
166
- width: widthProp = 'auto',
167
- zOffset: zOffsetProp = Z_OFFSETS.popover,
168
- updateRef,
169
- ...restProps
170
- } = props
171
-
172
- const card = useCard()
173
-
174
- const prefersReducedMotion = usePrefersReducedMotion()
175
- const animate = prefersReducedMotion ? false : _animate
176
- const zOffset = useArrayProp(zOffsetProp)
177
- const ref = useRef<HTMLDivElement | null>(null)
178
- const arrowRef = useRef<HTMLDivElement | null>(null)
179
- const rootBoundary: RootBoundary = 'viewport'
180
-
181
- useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(
182
- forwardedRef,
183
- () => ref.current,
184
- )
185
-
186
- // Keep track of reference element width (see `size` middleware below)
187
- const referenceWidthRef = useRef<number>(undefined)
188
-
189
- const middleware = useMemo(() => {
190
- const ret: Middleware[] = []
191
-
192
- // Flip the floating element when leaving the boundary box
193
- if (constrainSize || preventOverflow) {
194
- ret.push(
195
- flip({
196
- boundary: floatingBoundary || undefined,
197
- fallbackPlacements,
198
- padding: DEFAULT_POPOVER_PADDING,
199
- rootBoundary,
200
- }),
201
- )
202
- }
203
-
204
- // Define distance between reference and floating element
205
- ret.push(offset({mainAxis: DEFAULT_POPOVER_DISTANCE}))
206
-
207
- // Track sizes
208
- if (constrainSize || matchReferenceWidth) {
209
- ret.push(
210
- size({
211
- apply({availableWidth, availableHeight, elements, referenceWidth}) {
212
- // not fresh, so use refs
213
-
214
- referenceWidthRef.current = referenceWidth
215
-
216
- if (matchReferenceWidth) {
217
- elements.floating.style.width = `${referenceWidth}px`
218
- }
219
-
220
- if (constrainSize) {
221
- elements.floating.style.maxWidth = `${availableWidth}px`
222
- elements.floating.style.maxHeight = `${availableHeight}px`
223
- }
224
- },
225
- boundaryElement: floatingBoundary || undefined,
226
- constrainSize,
227
- margins,
228
- matchReferenceWidth,
229
- padding: DEFAULT_POPOVER_PADDING,
230
- }),
231
- )
232
- }
137
+ export function Popover<E extends PopoverElementType = typeof DEFAULT_POPOVER_ELEMENT>(
138
+ props: PopoverProps<E>,
139
+ ) {
140
+ const boundaryElementContext = useBoundaryElement()
141
+
142
+ const {
143
+ __unstable_margins: margins = DEFAULT_POPOVER_MARGINS,
144
+ animate: _animate = false,
145
+ arrow: arrowProp = false,
146
+ as: as = DEFAULT_POPOVER_ELEMENT,
147
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
148
+ boundaryElement = boundaryElementContext.element,
149
+ children: childProp,
150
+ constrainSize = false,
151
+ content,
152
+ disabled,
153
+ fallbackPlacements = props.fallbackPlacements ??
154
+ DEFAULT_FALLBACK_PLACEMENTS[props.placement ?? 'bottom'],
155
+ matchReferenceWidth,
156
+ floatingBoundary = props.boundaryElement ?? boundaryElementContext.element,
157
+ modal,
158
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
159
+ onActivate,
160
+ open,
161
+ overflow = 'hidden',
162
+ padding,
163
+ placement: placementProp = 'bottom',
164
+ portal,
165
+ preventOverflow = true,
166
+ radius = 3,
167
+ ref: forwardedRef,
168
+ referenceBoundary = props.boundaryElement ?? boundaryElementContext.element,
169
+ referenceElement,
170
+ scheme,
171
+ shadow = 3,
172
+ tone = 'inherit',
173
+ width: widthProp = 'auto',
174
+ zOffset: zOffsetProp = Z_OFFSETS.popover,
175
+ updateRef,
176
+ ...rest
177
+ } = props as PopoverProps<typeof DEFAULT_POPOVER_ELEMENT>
178
+
179
+ const card = useCard()
180
+
181
+ const prefersReducedMotion = usePrefersReducedMotion()
182
+ const animate = prefersReducedMotion ? false : _animate
183
+ const zOffset = useArrayProp(zOffsetProp)
184
+ const ref = useRef<HTMLDivElement | null>(null)
185
+ const arrowRef = useRef<HTMLDivElement | null>(null)
186
+ const rootBoundary: RootBoundary = 'viewport'
187
+
188
+ useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(forwardedRef, () => ref.current)
189
+
190
+ // Keep track of reference element width (see `size` middleware below)
191
+ const referenceWidthRef = useRef<number>(undefined)
192
+
193
+ const middleware = useMemo(() => {
194
+ const ret: Middleware[] = []
195
+
196
+ // Flip the floating element when leaving the boundary box
197
+ if (constrainSize || preventOverflow) {
198
+ ret.push(
199
+ flip({
200
+ boundary: floatingBoundary || undefined,
201
+ fallbackPlacements,
202
+ padding: DEFAULT_POPOVER_PADDING,
203
+ rootBoundary,
204
+ }),
205
+ )
206
+ }
233
207
 
234
- // Shift the popover so its sits within the boundary element
235
- if (preventOverflow) {
236
- ret.push(
237
- shift({
238
- boundary: floatingBoundary || undefined,
239
- rootBoundary,
240
- padding: DEFAULT_POPOVER_PADDING,
241
- }),
242
- )
243
- }
208
+ // Define distance between reference and floating element
209
+ ret.push(offset({mainAxis: DEFAULT_POPOVER_DISTANCE}))
244
210
 
245
- // Place arrow
246
- if (arrowProp) {
247
- ret.push(
248
- arrow({
249
- element: arrowRef,
250
- padding: DEFAULT_POPOVER_PADDING,
251
- }),
252
- )
253
- }
211
+ // Track sizes
212
+ if (constrainSize || matchReferenceWidth) {
213
+ ret.push(
214
+ size({
215
+ apply({availableWidth, availableHeight, elements, referenceWidth}) {
216
+ // not fresh, so use refs
217
+
218
+ referenceWidthRef.current = referenceWidth
219
+
220
+ if (matchReferenceWidth) {
221
+ elements.floating.style.width = `${referenceWidth}px`
222
+ }
223
+
224
+ if (constrainSize) {
225
+ elements.floating.style.maxWidth = `${availableWidth}px`
226
+ elements.floating.style.maxHeight = `${availableHeight}px`
227
+ }
228
+ },
229
+ boundaryElement: floatingBoundary || undefined,
230
+ constrainSize,
231
+ margins,
232
+ matchReferenceWidth,
233
+ padding: DEFAULT_POPOVER_PADDING,
234
+ }),
235
+ )
236
+ }
254
237
 
255
- // Determine the origin to scale from.
256
- // Must be placed after `@sanity/ui/size` and `shift` middleware.
257
- if (animate) {
258
- ret.push(origin)
259
- }
238
+ // Shift the popover so its sits within the boundary element
239
+ if (preventOverflow) {
240
+ ret.push(
241
+ shift({
242
+ boundary: floatingBoundary || undefined,
243
+ rootBoundary,
244
+ padding: DEFAULT_POPOVER_PADDING,
245
+ }),
246
+ )
247
+ }
260
248
 
249
+ // Place arrow
250
+ if (arrowProp) {
261
251
  ret.push(
262
- hide({
263
- boundary: referenceBoundary || undefined,
252
+ arrow({
253
+ element: arrowRef,
264
254
  padding: DEFAULT_POPOVER_PADDING,
265
- strategy: 'referenceHidden',
266
255
  }),
267
256
  )
257
+ }
268
258
 
269
- return ret
270
- }, [
271
- animate,
272
- arrowProp,
273
- constrainSize,
274
- fallbackPlacements,
275
- floatingBoundary,
276
- margins,
277
- matchReferenceWidth,
278
- preventOverflow,
279
- referenceBoundary,
280
- ])
281
-
282
- const {x, y, middlewareData, placement, refs, strategy, update} = useFloating({
283
- middleware,
284
- placement: placementProp,
285
- whileElementsMounted: autoUpdate,
286
- elements: referenceElement
287
- ? {
288
- reference: referenceElement,
289
- }
290
- : undefined,
291
- })
292
-
293
- const referenceHidden = middlewareData.hide?.referenceHidden
294
-
295
- const arrowX = middlewareData.arrow?.x
296
- const arrowY = middlewareData.arrow?.y
297
-
298
- const originX = middlewareData['@sanity/ui/origin']?.originX
299
- const originY = middlewareData['@sanity/ui/origin']?.originY
300
-
301
- const setArrow = useCallback((arrowEl: HTMLDivElement | null) => {
302
- arrowRef.current = arrowEl
303
- }, [])
304
-
305
- const setFloating = useCallback(
306
- (node: HTMLDivElement | null) => {
307
- ref.current = node
308
- refs.setFloating(node)
309
- },
310
- [refs],
259
+ // Determine the origin to scale from.
260
+ // Must be placed after `@sanity/ui/size` and `shift` middleware.
261
+ if (animate) {
262
+ ret.push(origin)
263
+ }
264
+
265
+ ret.push(
266
+ hide({
267
+ boundary: referenceBoundary || undefined,
268
+ padding: DEFAULT_POPOVER_PADDING,
269
+ strategy: 'referenceHidden',
270
+ }),
311
271
  )
312
272
 
313
- const setReference = useCallback(
314
- (node: HTMLElement | null) => {
315
- refs.setReference(node)
273
+ return ret
274
+ }, [
275
+ animate,
276
+ arrowProp,
277
+ constrainSize,
278
+ fallbackPlacements,
279
+ floatingBoundary,
280
+ margins,
281
+ matchReferenceWidth,
282
+ preventOverflow,
283
+ referenceBoundary,
284
+ ])
285
+
286
+ const {x, y, middlewareData, placement, refs, strategy, update} = useFloating({
287
+ middleware,
288
+ placement: placementProp,
289
+ whileElementsMounted: autoUpdate,
290
+ elements: referenceElement
291
+ ? {
292
+ reference: referenceElement,
293
+ }
294
+ : undefined,
295
+ })
316
296
 
317
- const childRef = getElementRef(childProp as any)
297
+ const referenceHidden = middlewareData.hide?.referenceHidden
318
298
 
319
- if (typeof childRef === 'function') {
320
- childRef(node)
321
- } else if (childRef) {
322
- childRef.current = node
323
- }
324
- },
325
- [childProp, refs],
326
- )
299
+ const arrowX = middlewareData.arrow?.x
300
+ const arrowY = middlewareData.arrow?.y
301
+
302
+ const originX = middlewareData['@sanity/ui/origin']?.originX
303
+ const originY = middlewareData['@sanity/ui/origin']?.originY
327
304
 
328
- const child = useMemo(() => {
329
- // If a reference element is defined, we don't need to clone the child
330
- if (referenceElement) return childProp
305
+ const setArrow = useCallback((arrowEl: HTMLDivElement | null) => {
306
+ arrowRef.current = arrowEl
307
+ }, [])
331
308
 
332
- if (!childProp) return null
309
+ const setFloating = useCallback(
310
+ (node: HTMLDivElement | null) => {
311
+ ref.current = node
312
+ refs.setFloating(node)
313
+ },
314
+ [refs],
315
+ )
333
316
 
334
- return cloneElement(childProp, {ref: setReference})
335
- }, [childProp, referenceElement, setReference])
317
+ const setReference = useCallback(
318
+ (node: HTMLElement | null) => {
319
+ refs.setReference(node)
336
320
 
337
- useEffect(() => {
338
- if (updateRef) {
339
- if (typeof updateRef === 'function') {
340
- updateRef(update)
341
- } else if (updateRef) {
342
- updateRef.current = update
343
- }
321
+ const childRef = getElementRef(childProp as any)
322
+
323
+ if (typeof childRef === 'function') {
324
+ childRef(node)
325
+ } else if (childRef) {
326
+ childRef.current = node
344
327
  }
345
- }, [update, updateRef])
328
+ },
329
+ [childProp, refs],
330
+ )
331
+
332
+ const child = useMemo(() => {
333
+ // If a reference element is defined, we don't need to clone the child
334
+ if (referenceElement) return childProp
346
335
 
347
- if (disabled) {
348
- return childProp || <></>
336
+ if (!childProp) return null
337
+
338
+ return cloneElement(childProp, {ref: setReference})
339
+ }, [childProp, referenceElement, setReference])
340
+
341
+ useEffect(() => {
342
+ if (updateRef) {
343
+ if (typeof updateRef === 'function') {
344
+ updateRef(update)
345
+ } else if (updateRef) {
346
+ updateRef.current = update
347
+ }
349
348
  }
349
+ }, [update, updateRef])
350
+
351
+ if (disabled) {
352
+ return childProp || <></>
353
+ }
354
+
355
+ const popover = (
356
+ <LayerProvider zOffset={zOffset}>
357
+ {/* Optional transparent blocking overlay at the top-most z-index layer. Must be positioned
358
+ before the below popover card. */}
359
+ {modal && <ViewportOverlay />}
360
+
361
+ <PopoverCard
362
+ {...rest}
363
+ __unstable_margins={margins}
364
+ animate={animate}
365
+ arrow={arrowProp}
366
+ arrowRef={setArrow}
367
+ arrowX={arrowX}
368
+ arrowY={arrowY}
369
+ as={as}
370
+ hidden={referenceHidden}
371
+ maxWidth={widthProp}
372
+ overflow={overflow}
373
+ padding={padding}
374
+ placement={placement}
375
+ radius={radius}
376
+ ref={setFloating}
377
+ scheme={scheme}
378
+ shadow={shadow}
379
+ originX={originX}
380
+ originY={originY}
381
+ strategy={strategy}
382
+ x={x}
383
+ y={y}
384
+ >
385
+ {content}
386
+ </PopoverCard>
387
+ </LayerProvider>
388
+ )
350
389
 
351
- const popover = (
352
- <LayerProvider zOffset={zOffset}>
353
- {/* Optional transparent blocking overlay at the top-most z-index layer. Must be positioned
354
- before the below popover card. */}
355
- {modal && <ViewportOverlay />}
356
-
357
- <PopoverCard
358
- {...restProps}
359
- __unstable_margins={margins}
360
- animate={animate}
361
- arrow={arrowProp}
362
- arrowRef={setArrow}
363
- arrowX={arrowX}
364
- arrowY={arrowY}
365
- hidden={referenceHidden}
366
- maxWidth={widthProp}
367
- overflow={overflow}
368
- padding={padding}
369
- placement={placement}
370
- radius={radius}
371
- ref={setFloating}
372
- scheme={scheme}
373
- shadow={shadow}
374
- originX={originX}
375
- originY={originY}
376
- strategy={strategy}
377
- x={x}
378
- y={y}
390
+ const children =
391
+ open &&
392
+ (portal ? (
393
+ <Portal __unstable_name={typeof portal === 'string' ? portal : undefined}>
394
+ <CardProvider
395
+ tone={tone === 'inherit' ? (card?.tone ?? 'default') : tone}
396
+ scheme={scheme ?? 'light'}
379
397
  >
380
- {content}
381
- </PopoverCard>
382
- </LayerProvider>
383
- )
398
+ {popover}
399
+ </CardProvider>
400
+ </Portal>
401
+ ) : (
402
+ popover
403
+ ))
384
404
 
385
- const children =
386
- open &&
387
- (portal ? (
388
- <Portal __unstable_name={typeof portal === 'string' ? portal : undefined}>
389
- <CardProvider
390
- tone={tone === 'inherit' ? (card?.tone ?? 'default') : tone}
391
- scheme={scheme ?? 'light'}
392
- >
393
- {popover}
394
- </CardProvider>
395
- </Portal>
396
- ) : (
397
- popover
398
- ))
399
-
400
- return (
401
- <>
402
- {/* the popover */}
403
- {animate ? <AnimatePresence>{children}</AnimatePresence> : children}
404
-
405
- {/* the referred element */}
406
- {child}
407
- </>
408
- )
409
- }),
410
- )
405
+ return (
406
+ <>
407
+ {/* the popover */}
408
+ {animate ? <AnimatePresence>{children}</AnimatePresence> : children}
409
+
410
+ {/* the referred element */}
411
+ {child}
412
+ </>
413
+ )
414
+ }
411
415
 
412
- Popover.displayName = 'Memo(ForwardRef(Popover))'
416
+ Popover.displayName = 'Popover'
413
417
 
414
418
  // Before React 19 accessing `element.props.ref` will throw a warning and suggest using `element.ref`
415
419
  // After React 19 accessing `element.ref` does the opposite.