@sanity/ui 3.3.2 → 3.3.3

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 (423) hide show
  1. package/package.json +6 -11
  2. package/exports/_visual-editing.ts +0 -32
  3. package/exports/index.ts +0 -1
  4. package/exports/theme.ts +0 -1
  5. package/src/core/_compat.ts +0 -294
  6. package/src/core/components/autocomplete/autocomplete.styles.tsx +0 -39
  7. package/src/core/components/autocomplete/autocomplete.tsx +0 -775
  8. package/src/core/components/autocomplete/autocompleteOption.tsx +0 -46
  9. package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
  10. package/src/core/components/autocomplete/constants.ts +0 -28
  11. package/src/core/components/autocomplete/index.ts +0 -2
  12. package/src/core/components/autocomplete/types.ts +0 -108
  13. package/src/core/components/breadcrumbs/breadcrumbs.styles.ts +0 -18
  14. package/src/core/components/breadcrumbs/breadcrumbs.test.tsx +0 -54
  15. package/src/core/components/breadcrumbs/breadcrumbs.tsx +0 -136
  16. package/src/core/components/breadcrumbs/index.ts +0 -1
  17. package/src/core/components/dialog/dialog.tsx +0 -433
  18. package/src/core/components/dialog/dialogContext.ts +0 -20
  19. package/src/core/components/dialog/dialogProvider.tsx +0 -35
  20. package/src/core/components/dialog/index.ts +0 -4
  21. package/src/core/components/dialog/styles.ts +0 -77
  22. package/src/core/components/dialog/useDialog.ts +0 -11
  23. package/src/core/components/hotkeys/hotkeys.test.tsx +0 -47
  24. package/src/core/components/hotkeys/hotkeys.tsx +0 -68
  25. package/src/core/components/hotkeys/index.ts +0 -1
  26. package/src/core/components/index.ts +0 -9
  27. package/src/core/components/menu/helpers.ts +0 -82
  28. package/src/core/components/menu/index.ts +0 -5
  29. package/src/core/components/menu/menu.spacing.test.tsx +0 -68
  30. package/src/core/components/menu/menu.test.tsx +0 -128
  31. package/src/core/components/menu/menu.tsx +0 -180
  32. package/src/core/components/menu/menuButton.tsx +0 -276
  33. package/src/core/components/menu/menuContext.ts +0 -18
  34. package/src/core/components/menu/menuDivider.ts +0 -24
  35. package/src/core/components/menu/menuGroup.spacing.test.tsx +0 -66
  36. package/src/core/components/menu/menuGroup.tsx +0 -237
  37. package/src/core/components/menu/menuItem.spacing.test.tsx +0 -62
  38. package/src/core/components/menu/menuItem.tsx +0 -201
  39. package/src/core/components/menu/useMenu.ts +0 -21
  40. package/src/core/components/menu/useMenuController.ts +0 -233
  41. package/src/core/components/skeleton/index.ts +0 -2
  42. package/src/core/components/skeleton/skeleton.tsx +0 -58
  43. package/src/core/components/skeleton/styles.ts +0 -50
  44. package/src/core/components/skeleton/textSkeleton.tsx +0 -122
  45. package/src/core/components/tab/index.ts +0 -3
  46. package/src/core/components/tab/tab.tsx +0 -102
  47. package/src/core/components/tab/tabList.test.tsx +0 -50
  48. package/src/core/components/tab/tabList.tsx +0 -71
  49. package/src/core/components/tab/tabPanel.tsx +0 -39
  50. package/src/core/components/toast/index.ts +0 -4
  51. package/src/core/components/toast/styles.ts +0 -77
  52. package/src/core/components/toast/toast.test.tsx +0 -106
  53. package/src/core/components/toast/toast.tsx +0 -199
  54. package/src/core/components/toast/toastContext.ts +0 -7
  55. package/src/core/components/toast/toastLayer.tsx +0 -52
  56. package/src/core/components/toast/toastProvider.tsx +0 -113
  57. package/src/core/components/toast/toastState.ts +0 -6
  58. package/src/core/components/toast/types.ts +0 -26
  59. package/src/core/components/toast/useToast.ts +0 -25
  60. package/src/core/components/tree/helpers.ts +0 -105
  61. package/src/core/components/tree/index.ts +0 -4
  62. package/src/core/components/tree/style.ts +0 -105
  63. package/src/core/components/tree/tree.test.tsx +0 -60
  64. package/src/core/components/tree/tree.tsx +0 -242
  65. package/src/core/components/tree/treeContext.ts +0 -10
  66. package/src/core/components/tree/treeGroup.tsx +0 -29
  67. package/src/core/components/tree/treeItem.test.tsx +0 -70
  68. package/src/core/components/tree/treeItem.tsx +0 -225
  69. package/src/core/components/tree/types.ts +0 -25
  70. package/src/core/components/tree/useTree.ts +0 -17
  71. package/src/core/constants.ts +0 -79
  72. package/src/core/helpers/animation.ts +0 -27
  73. package/src/core/helpers/element.ts +0 -55
  74. package/src/core/helpers/focus.ts +0 -100
  75. package/src/core/helpers/index.ts +0 -4
  76. package/src/core/helpers/scroll.ts +0 -15
  77. package/src/core/hooks/index.ts +0 -13
  78. package/src/core/hooks/useArrayProp.ts +0 -17
  79. package/src/core/hooks/useClickOutside.test.tsx +0 -510
  80. package/src/core/hooks/useClickOutside.ts +0 -118
  81. package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -119
  82. package/src/core/hooks/useClickOutsideEvent.ts +0 -73
  83. package/src/core/hooks/useCustomValidity.ts +0 -13
  84. package/src/core/hooks/useDelayed.test.ts +0 -89
  85. package/src/core/hooks/useDelayedState.ts +0 -36
  86. package/src/core/hooks/useElementRect/index.ts +0 -1
  87. package/src/core/hooks/useElementRect/useElementRect.ts +0 -14
  88. package/src/core/hooks/useElementSize.ts +0 -19
  89. package/src/core/hooks/useForwardedRef.ts +0 -20
  90. package/src/core/hooks/useGlobalKeyDown.ts +0 -24
  91. package/src/core/hooks/useIsomorphicEffect.ts +0 -7
  92. package/src/core/hooks/useMatchMedia.ts +0 -28
  93. package/src/core/hooks/useMediaIndex/index.ts +0 -1
  94. package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -37
  95. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -102
  96. package/src/core/hooks/useMounted.ts +0 -15
  97. package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -58
  98. package/src/core/hooks/usePrefersDark.test.tsx +0 -21
  99. package/src/core/hooks/usePrefersDark.ts +0 -16
  100. package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -58
  101. package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -21
  102. package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
  103. package/src/core/index.ts +0 -10
  104. package/src/core/lib/createGlobalScopedContext.ts +0 -37
  105. package/src/core/lib/globalScope.ts +0 -20
  106. package/src/core/lib/isRecord.ts +0 -3
  107. package/src/core/middleware/origin.ts +0 -47
  108. package/src/core/observers/elementSizeObserver.ts +0 -117
  109. package/src/core/observers/index.ts +0 -2
  110. package/src/core/observers/resizeObserver.ts +0 -9
  111. package/src/core/primitives/_selectable/index.ts +0 -1
  112. package/src/core/primitives/_selectable/selectable.tsx +0 -15
  113. package/src/core/primitives/_selectable/style.ts +0 -115
  114. package/src/core/primitives/avatar/avatar.tsx +0 -200
  115. package/src/core/primitives/avatar/avatarCounter.tsx +0 -91
  116. package/src/core/primitives/avatar/avatarStack.tsx +0 -101
  117. package/src/core/primitives/avatar/index.ts +0 -4
  118. package/src/core/primitives/avatar/styles.ts +0 -167
  119. package/src/core/primitives/avatar/types.ts +0 -17
  120. package/src/core/primitives/badge/badge.test.tsx +0 -17
  121. package/src/core/primitives/badge/badge.tsx +0 -72
  122. package/src/core/primitives/badge/index.ts +0 -1
  123. package/src/core/primitives/badge/styles.ts +0 -20
  124. package/src/core/primitives/badge/types.ts +0 -8
  125. package/src/core/primitives/box/box.test.tsx +0 -155
  126. package/src/core/primitives/box/box.tsx +0 -162
  127. package/src/core/primitives/box/index.ts +0 -1
  128. package/src/core/primitives/button/button.test.tsx +0 -86
  129. package/src/core/primitives/button/button.tsx +0 -214
  130. package/src/core/primitives/button/index.ts +0 -1
  131. package/src/core/primitives/button/styles.ts +0 -118
  132. package/src/core/primitives/card/card.tsx +0 -125
  133. package/src/core/primitives/card/index.ts +0 -2
  134. package/src/core/primitives/card/styles.ts +0 -147
  135. package/src/core/primitives/card/types.ts +0 -12
  136. package/src/core/primitives/checkbox/checkbox.tsx +0 -73
  137. package/src/core/primitives/checkbox/index.ts +0 -1
  138. package/src/core/primitives/checkbox/styles.ts +0 -128
  139. package/src/core/primitives/code/code.tsx +0 -56
  140. package/src/core/primitives/code/index.ts +0 -1
  141. package/src/core/primitives/code/refractor.tsx +0 -22
  142. package/src/core/primitives/code/styles.ts +0 -77
  143. package/src/core/primitives/container/container.tsx +0 -55
  144. package/src/core/primitives/container/index.ts +0 -2
  145. package/src/core/primitives/container/styles.ts +0 -23
  146. package/src/core/primitives/container/types.ts +0 -6
  147. package/src/core/primitives/flex/flex.tsx +0 -63
  148. package/src/core/primitives/flex/index.ts +0 -1
  149. package/src/core/primitives/grid/grid.test.tsx +0 -86
  150. package/src/core/primitives/grid/grid.tsx +0 -77
  151. package/src/core/primitives/grid/index.ts +0 -1
  152. package/src/core/primitives/heading/heading.tsx +0 -89
  153. package/src/core/primitives/heading/index.ts +0 -1
  154. package/src/core/primitives/heading/styles.ts +0 -64
  155. package/src/core/primitives/heading/types.ts +0 -7
  156. package/src/core/primitives/index.ts +0 -27
  157. package/src/core/primitives/inline/index.ts +0 -1
  158. package/src/core/primitives/inline/inline.test.tsx +0 -55
  159. package/src/core/primitives/inline/inline.tsx +0 -66
  160. package/src/core/primitives/inline/styles.ts +0 -32
  161. package/src/core/primitives/inline/types.ts +0 -6
  162. package/src/core/primitives/kbd/index.ts +0 -1
  163. package/src/core/primitives/kbd/kbd.tsx +0 -73
  164. package/src/core/primitives/label/index.ts +0 -1
  165. package/src/core/primitives/label/label.tsx +0 -88
  166. package/src/core/primitives/label/styles.ts +0 -45
  167. package/src/core/primitives/popover/constants.ts +0 -22
  168. package/src/core/primitives/popover/floating-ui/size.ts +0 -99
  169. package/src/core/primitives/popover/helpers.ts +0 -31
  170. package/src/core/primitives/popover/index.ts +0 -2
  171. package/src/core/primitives/popover/popover.tsx +0 -512
  172. package/src/core/primitives/popover/popoverCard.tsx +0 -167
  173. package/src/core/primitives/popover/types.ts +0 -6
  174. package/src/core/primitives/radio/index.ts +0 -1
  175. package/src/core/primitives/radio/radio.tsx +0 -51
  176. package/src/core/primitives/radio/styles.ts +0 -117
  177. package/src/core/primitives/select/index.ts +0 -1
  178. package/src/core/primitives/select/select.test.tsx +0 -56
  179. package/src/core/primitives/select/select.tsx +0 -95
  180. package/src/core/primitives/select/styles.ts +0 -166
  181. package/src/core/primitives/spinner/index.ts +0 -1
  182. package/src/core/primitives/spinner/spinner.tsx +0 -46
  183. package/src/core/primitives/stack/index.ts +0 -1
  184. package/src/core/primitives/stack/stack.test.tsx +0 -61
  185. package/src/core/primitives/stack/stack.tsx +0 -59
  186. package/src/core/primitives/stack/styles.ts +0 -33
  187. package/src/core/primitives/switch/index.ts +0 -1
  188. package/src/core/primitives/switch/styles.ts +0 -173
  189. package/src/core/primitives/switch/switch.tsx +0 -68
  190. package/src/core/primitives/text/index.ts +0 -1
  191. package/src/core/primitives/text/styles.ts +0 -74
  192. package/src/core/primitives/text/text.tsx +0 -90
  193. package/src/core/primitives/textArea/index.ts +0 -1
  194. package/src/core/primitives/textArea/textArea.tsx +0 -120
  195. package/src/core/primitives/textInput/index.ts +0 -1
  196. package/src/core/primitives/textInput/textInput.test.tsx +0 -52
  197. package/src/core/primitives/textInput/textInput.tsx +0 -398
  198. package/src/core/primitives/tooltip/constants.ts +0 -23
  199. package/src/core/primitives/tooltip/index.ts +0 -2
  200. package/src/core/primitives/tooltip/tooltip.test.tsx +0 -485
  201. package/src/core/primitives/tooltip/tooltip.tsx +0 -497
  202. package/src/core/primitives/tooltip/tooltipCard.tsx +0 -110
  203. package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
  204. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +0 -11
  205. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -57
  206. package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -12
  207. package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
  208. package/src/core/primitives/types.ts +0 -179
  209. package/src/core/styles/border/borderStyle.ts +0 -56
  210. package/src/core/styles/border/index.ts +0 -2
  211. package/src/core/styles/border/types.ts +0 -10
  212. package/src/core/styles/box/boxStyle.ts +0 -69
  213. package/src/core/styles/box/index.ts +0 -2
  214. package/src/core/styles/box/types.ts +0 -11
  215. package/src/core/styles/card/_cardColorStyle.ts +0 -108
  216. package/src/core/styles/card/index.ts +0 -1
  217. package/src/core/styles/flex/flexItemStyle.ts +0 -27
  218. package/src/core/styles/flex/flexStyle.ts +0 -70
  219. package/src/core/styles/flex/index.ts +0 -3
  220. package/src/core/styles/flex/types.ts +0 -24
  221. package/src/core/styles/focusRing/index.ts +0 -25
  222. package/src/core/styles/font/codeFontStyle.ts +0 -13
  223. package/src/core/styles/font/headingFontStyle.ts +0 -13
  224. package/src/core/styles/font/index.ts +0 -6
  225. package/src/core/styles/font/labelFontStyle.ts +0 -13
  226. package/src/core/styles/font/responsiveFont.ts +0 -100
  227. package/src/core/styles/font/textAlignStyle.ts +0 -19
  228. package/src/core/styles/font/textFontStyle.ts +0 -13
  229. package/src/core/styles/font/types.ts +0 -33
  230. package/src/core/styles/grid/gridItemStyle.ts +0 -82
  231. package/src/core/styles/grid/gridStyle.ts +0 -109
  232. package/src/core/styles/grid/index.ts +0 -3
  233. package/src/core/styles/grid/types.ts +0 -37
  234. package/src/core/styles/helpers.ts +0 -72
  235. package/src/core/styles/index.ts +0 -5
  236. package/src/core/styles/input/index.ts +0 -2
  237. package/src/core/styles/input/responsiveInputPaddingStyle.ts +0 -78
  238. package/src/core/styles/input/textInputStyle.ts +0 -263
  239. package/src/core/styles/internal.ts +0 -12
  240. package/src/core/styles/margin/index.ts +0 -2
  241. package/src/core/styles/margin/marginStyle.ts +0 -22
  242. package/src/core/styles/margin/marginsStyle.test.ts +0 -34
  243. package/src/core/styles/margin/types.ts +0 -9
  244. package/src/core/styles/padding/index.ts +0 -2
  245. package/src/core/styles/padding/paddingStyle.test.ts +0 -34
  246. package/src/core/styles/padding/paddingStyle.ts +0 -22
  247. package/src/core/styles/padding/types.ts +0 -12
  248. package/src/core/styles/radius/index.ts +0 -2
  249. package/src/core/styles/radius/radiusStyle.ts +0 -23
  250. package/src/core/styles/radius/types.ts +0 -8
  251. package/src/core/styles/shadow/index.ts +0 -2
  252. package/src/core/styles/shadow/shadowStyle.ts +0 -29
  253. package/src/core/styles/shadow/types.ts +0 -6
  254. package/src/core/styles/types.ts +0 -8
  255. package/src/core/theme/index.ts +0 -5
  256. package/src/core/theme/theme.test.tsx +0 -77
  257. package/src/core/theme/themeColorProvider.tsx +0 -29
  258. package/src/core/theme/themeContext.ts +0 -10
  259. package/src/core/theme/themeProvider.tsx +0 -62
  260. package/src/core/theme/types.ts +0 -12
  261. package/src/core/theme/useRootTheme.ts +0 -18
  262. package/src/core/theme/useTheme.ts +0 -18
  263. package/src/core/types/avatar.ts +0 -14
  264. package/src/core/types/badge.ts +0 -12
  265. package/src/core/types/box.ts +0 -19
  266. package/src/core/types/button.ts +0 -21
  267. package/src/core/types/card.ts +0 -6
  268. package/src/core/types/component.ts +0 -32
  269. package/src/core/types/dialog.ts +0 -4
  270. package/src/core/types/flex.ts +0 -30
  271. package/src/core/types/grid.ts +0 -14
  272. package/src/core/types/gridItem.ts +0 -29
  273. package/src/core/types/index.ts +0 -15
  274. package/src/core/types/placement.ts +0 -18
  275. package/src/core/types/popover.ts +0 -4
  276. package/src/core/types/radius.ts +0 -4
  277. package/src/core/types/selectable.ts +0 -6
  278. package/src/core/types/text.ts +0 -4
  279. package/src/core/utils/arrow/arrow.tsx +0 -124
  280. package/src/core/utils/arrow/cmds.ts +0 -91
  281. package/src/core/utils/arrow/index.ts +0 -1
  282. package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -105
  283. package/src/core/utils/boundaryElement/boundaryElementContext.ts +0 -7
  284. package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -24
  285. package/src/core/utils/boundaryElement/index.ts +0 -3
  286. package/src/core/utils/boundaryElement/types.ts +0 -7
  287. package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -26
  288. package/src/core/utils/conditionalWrapper/conditionalWrapper.tsx +0 -22
  289. package/src/core/utils/conditionalWrapper/index.ts +0 -1
  290. package/src/core/utils/elementQuery/elementQuery.tsx +0 -53
  291. package/src/core/utils/elementQuery/helpers.ts +0 -27
  292. package/src/core/utils/elementQuery/index.ts +0 -1
  293. package/src/core/utils/errorBoundary.tsx +0 -48
  294. package/src/core/utils/getElementRef.ts +0 -31
  295. package/src/core/utils/index.ts +0 -9
  296. package/src/core/utils/layer/getLayerContext.test.ts +0 -32
  297. package/src/core/utils/layer/getLayerContext.ts +0 -21
  298. package/src/core/utils/layer/index.ts +0 -4
  299. package/src/core/utils/layer/layer.test.tsx +0 -113
  300. package/src/core/utils/layer/layer.tsx +0 -99
  301. package/src/core/utils/layer/layerContext.ts +0 -7
  302. package/src/core/utils/layer/layerProvider.tsx +0 -111
  303. package/src/core/utils/layer/types.ts +0 -9
  304. package/src/core/utils/layer/useLayer.ts +0 -28
  305. package/src/core/utils/portal/index.ts +0 -4
  306. package/src/core/utils/portal/portal.test.tsx +0 -108
  307. package/src/core/utils/portal/portal.ts +0 -32
  308. package/src/core/utils/portal/portalContext.ts +0 -31
  309. package/src/core/utils/portal/portalProvider.tsx +0 -48
  310. package/src/core/utils/portal/types.ts +0 -9
  311. package/src/core/utils/portal/usePortal.ts +0 -25
  312. package/src/core/utils/spanWithTextOverflow.tsx +0 -10
  313. package/src/core/utils/srOnly/index.ts +0 -1
  314. package/src/core/utils/srOnly/srOnly.tsx +0 -36
  315. package/src/core/utils/virtualList/index.ts +0 -1
  316. package/src/core/utils/virtualList/virtualList.tsx +0 -201
  317. package/src/theme/build/_deprecated/color/_selectable/createSelectableTones.ts +0 -86
  318. package/src/theme/build/_deprecated/color/_solid/createSolidTones.ts +0 -58
  319. package/src/theme/build/_deprecated/color/button/createButtonModes.ts +0 -27
  320. package/src/theme/build/_deprecated/color/button/createButtonTones.ts +0 -60
  321. package/src/theme/build/_deprecated/color/card/createCardStates.ts +0 -66
  322. package/src/theme/build/_deprecated/color/color.test.ts +0 -67
  323. package/src/theme/build/_deprecated/color/defaults.ts +0 -391
  324. package/src/theme/build/_deprecated/color/factory.ts +0 -178
  325. package/src/theme/build/_deprecated/color/index.ts +0 -1
  326. package/src/theme/build/_deprecated/color/input/createInputModes.ts +0 -86
  327. package/src/theme/build/_deprecated/color/muted/createMuted.ts +0 -58
  328. package/src/theme/build/_deprecated/color/spot/createSpot.ts +0 -23
  329. package/src/theme/build/buildColorTheme.test.ts +0 -185
  330. package/src/theme/build/buildColorTheme.ts +0 -507
  331. package/src/theme/build/buildTheme.test.ts +0 -89
  332. package/src/theme/build/buildTheme.ts +0 -36
  333. package/src/theme/build/colorToken/colorToken.ts +0 -19
  334. package/src/theme/build/colorToken/compileColorToken.ts +0 -21
  335. package/src/theme/build/colorToken/index.ts +0 -2
  336. package/src/theme/build/colorToken/types.ts +0 -6
  337. package/src/theme/build/index.ts +0 -3
  338. package/src/theme/build/lib/color-fns/blend/index.ts +0 -3
  339. package/src/theme/build/lib/color-fns/blend/mix.ts +0 -21
  340. package/src/theme/build/lib/color-fns/blend/multiply.ts +0 -18
  341. package/src/theme/build/lib/color-fns/blend/screen.ts +0 -18
  342. package/src/theme/build/lib/color-fns/color-fns.test.ts +0 -70
  343. package/src/theme/build/lib/color-fns/contrastRatio.ts +0 -31
  344. package/src/theme/build/lib/color-fns/convert.ts +0 -150
  345. package/src/theme/build/lib/color-fns/index.ts +0 -6
  346. package/src/theme/build/lib/color-fns/parse.ts +0 -60
  347. package/src/theme/build/lib/color-fns/rgba.ts +0 -10
  348. package/src/theme/build/lib/color-fns/types.ts +0 -28
  349. package/src/theme/build/lib/isRecord.ts +0 -3
  350. package/src/theme/build/lib/lazy.ts +0 -30
  351. package/src/theme/build/lib/utils.ts +0 -19
  352. package/src/theme/build/merge.ts +0 -31
  353. package/src/theme/build/mixThemeColor.test.ts +0 -23
  354. package/src/theme/build/mixThemeColor.ts +0 -53
  355. package/src/theme/build/renderColorTheme.ts +0 -538
  356. package/src/theme/build/renderColorValue.ts +0 -83
  357. package/src/theme/build/resolveColorTokens.ts +0 -274
  358. package/src/theme/build/theme.test.ts +0 -29
  359. package/src/theme/config/helpers.ts +0 -60
  360. package/src/theme/config/index.ts +0 -4
  361. package/src/theme/config/system.ts +0 -117
  362. package/src/theme/config/tokens/color/index.ts +0 -1
  363. package/src/theme/config/tokens/color/types.ts +0 -135
  364. package/src/theme/config/tokens/index.ts +0 -4
  365. package/src/theme/config/tokens/parseTokenKey.test.ts +0 -66
  366. package/src/theme/config/tokens/parseTokenKey.ts +0 -67
  367. package/src/theme/config/tokens/parseTokenValue.test.ts +0 -44
  368. package/src/theme/config/tokens/parseTokenValue.ts +0 -134
  369. package/src/theme/config/tokens/types.ts +0 -53
  370. package/src/theme/config/types.ts +0 -46
  371. package/src/theme/defaults/colorPalette.ts +0 -5
  372. package/src/theme/defaults/colorTokens.ts +0 -648
  373. package/src/theme/defaults/config.ts +0 -84
  374. package/src/theme/defaults/fonts.ts +0 -227
  375. package/src/theme/getScopedTheme.ts +0 -103
  376. package/src/theme/index.ts +0 -5
  377. package/src/theme/system/avatar.ts +0 -14
  378. package/src/theme/system/color/_constants.ts +0 -45
  379. package/src/theme/system/color/_helpers.ts +0 -28
  380. package/src/theme/system/color/_system.ts +0 -40
  381. package/src/theme/system/color/avatar.ts +0 -15
  382. package/src/theme/system/color/badge.ts +0 -16
  383. package/src/theme/system/color/button.ts +0 -17
  384. package/src/theme/system/color/color.ts +0 -34
  385. package/src/theme/system/color/index.ts +0 -13
  386. package/src/theme/system/color/input.ts +0 -25
  387. package/src/theme/system/color/kbd.ts +0 -8
  388. package/src/theme/system/color/selectable.ts +0 -12
  389. package/src/theme/system/color/shadow.ts +0 -7
  390. package/src/theme/system/color/state.ts +0 -43
  391. package/src/theme/system/color/syntax.ts +0 -41
  392. package/src/theme/system/css.ts +0 -14
  393. package/src/theme/system/focusRing.ts +0 -7
  394. package/src/theme/system/font.ts +0 -52
  395. package/src/theme/system/index.ts +0 -11
  396. package/src/theme/system/input.ts +0 -33
  397. package/src/theme/system/layer.ts +0 -8
  398. package/src/theme/system/shadow.ts +0 -19
  399. package/src/theme/system/styles.ts +0 -13
  400. package/src/theme/system/theme.ts +0 -142
  401. package/src/theme/system/v0/avatar.ts +0 -10
  402. package/src/theme/system/v0/color/_generic.ts +0 -35
  403. package/src/theme/system/v0/color/_system.ts +0 -18
  404. package/src/theme/system/v0/color/base.ts +0 -21
  405. package/src/theme/system/v0/color/button.ts +0 -56
  406. package/src/theme/system/v0/color/card.ts +0 -25
  407. package/src/theme/system/v0/color/color.ts +0 -51
  408. package/src/theme/system/v0/color/index.ts +0 -11
  409. package/src/theme/system/v0/color/input.ts +0 -40
  410. package/src/theme/system/v0/color/muted.ts +0 -37
  411. package/src/theme/system/v0/color/selectable.ts +0 -42
  412. package/src/theme/system/v0/color/solid.ts +0 -37
  413. package/src/theme/system/v0/color/spot.ts +0 -14
  414. package/src/theme/system/v0/index.ts +0 -3
  415. package/src/theme/system/v0/input.ts +0 -23
  416. package/src/theme/versioning/getTheme_v2.ts +0 -72
  417. package/src/theme/versioning/index.ts +0 -5
  418. package/src/theme/versioning/is_v0.ts +0 -6
  419. package/src/theme/versioning/is_v2.ts +0 -6
  420. package/src/theme/versioning/themeColor_v0_v2.ts +0 -250
  421. package/src/theme/versioning/themeColor_v2_v2_9.ts +0 -50
  422. package/src/theme/versioning/v0_v2.ts +0 -106
  423. package/src/theme/versioning/v2_v0.ts +0 -153
@@ -1,775 +0,0 @@
1
- import {ChevronDownIcon} from '@sanity/icons'
2
- import {
3
- ChangeEvent,
4
- cloneElement,
5
- ElementType,
6
- FocusEvent,
7
- forwardRef,
8
- HTMLProps,
9
- KeyboardEvent,
10
- MouseEvent,
11
- ReactNode,
12
- Ref,
13
- startTransition,
14
- useCallback,
15
- useEffect,
16
- useImperativeHandle,
17
- useMemo,
18
- useReducer,
19
- useRef,
20
- useState,
21
- } from 'react'
22
-
23
- import {EMPTY_ARRAY, EMPTY_RECORD} from '../../constants'
24
- import {_hasFocus, _raf, focusFirstDescendant} from '../../helpers'
25
- import {
26
- Box,
27
- BoxProps,
28
- Button,
29
- Card,
30
- Popover,
31
- PopoverProps,
32
- Stack,
33
- Text,
34
- TextInput,
35
- } from '../../primitives'
36
- import {_getArrayProp} from '../../styles'
37
- import {Radius} from '../../types'
38
- import {AnimatedSpinnerIcon, ListBox, StyledAutocomplete} from './autocomplete.styles'
39
- import {AutocompleteOption} from './autocompleteOption'
40
- import {autocompleteReducer} from './autocompleteReducer'
41
- import {
42
- AUTOCOMPLETE_LISTBOX_IGNORE_KEYS,
43
- AUTOCOMPLETE_POPOVER_FALLBACK_PLACEMENTS,
44
- AUTOCOMPLETE_POPOVER_PLACEMENT,
45
- } from './constants'
46
- import {AutocompleteOpenButtonProps, BaseAutocompleteOption} from './types'
47
-
48
- /**
49
- * @public
50
- */
51
- export interface AutocompleteProps<Option extends BaseAutocompleteOption = BaseAutocompleteOption> {
52
- border?: boolean
53
- customValidity?: string
54
- filterOption?: (query: string, option: Option) => boolean
55
- fontSize?: number | number[]
56
- // oxlint-disable-next-line no-redundant-type-constituents
57
- icon?: ElementType | ReactNode
58
- id: string
59
- /** @beta */
60
- listBox?: BoxProps
61
- loading?: boolean
62
- onChange?: (value: string) => void
63
- onQueryChange?: (query: string | null) => void
64
- onSelect?: (value: string) => void
65
- /** @beta */
66
- openButton?: boolean | AutocompleteOpenButtonProps
67
- /** @beta */
68
- openOnFocus?: boolean
69
- /** The options to render. */
70
- options?: Option[]
71
- padding?: number | number[]
72
- popover?: Omit<PopoverProps, 'content' | 'onMouseEnter' | 'onMouseLeave' | 'open'> &
73
- Omit<HTMLProps<HTMLDivElement>, 'as' | 'children' | 'content' | 'ref' | 'width'>
74
- prefix?: ReactNode
75
- radius?: Radius | Radius[]
76
- /** @beta */
77
- relatedElements?: HTMLElement[]
78
- /** The callback function for rendering each option. */
79
- renderOption?: (option: Option) => React.JSX.Element
80
- /** @beta */
81
- renderPopover?: (
82
- props: {
83
- content: React.JSX.Element | null
84
- hidden: boolean
85
- inputElement: HTMLInputElement | null
86
- onMouseEnter: () => void
87
- onMouseLeave: () => void
88
- },
89
- ref: Ref<HTMLDivElement>,
90
- ) => ReactNode
91
- renderValue?: (value: string, option?: Option) => string
92
- suffix?: ReactNode
93
- /** The current value. */
94
- value?: string
95
- }
96
-
97
- const DEFAULT_RENDER_VALUE = (value: string, option?: BaseAutocompleteOption) =>
98
- option ? option.value : value
99
-
100
- const DEFAULT_FILTER_OPTION = (query: string, option: BaseAutocompleteOption) =>
101
- option.value.toLowerCase().indexOf(query.toLowerCase()) > -1
102
-
103
- const InnerAutocomplete = forwardRef(function InnerAutocomplete<
104
- Option extends BaseAutocompleteOption,
105
- >(
106
- props: AutocompleteProps<Option> &
107
- Omit<
108
- HTMLProps<HTMLInputElement>,
109
- | 'aria-activedescendant'
110
- | 'aria-autocomplete'
111
- | 'aria-expanded'
112
- | 'aria-owns'
113
- | 'as'
114
- | 'autoCapitalize'
115
- | 'autoComplete'
116
- | 'autoCorrect'
117
- | 'id'
118
- | 'inputMode'
119
- | 'onChange'
120
- | 'onSelect'
121
- | 'popover'
122
- | 'prefix'
123
- | 'ref'
124
- | 'role'
125
- | 'spellCheck'
126
- | 'type'
127
- | 'value'
128
- >,
129
- forwardedRef: React.ForwardedRef<HTMLInputElement>,
130
- ) {
131
- const {
132
- border = true,
133
- customValidity,
134
- disabled,
135
- filterOption: filterOptionProp,
136
- fontSize = 2,
137
- icon,
138
- id,
139
- listBox = EMPTY_RECORD,
140
- loading,
141
- onBlur,
142
- onChange,
143
- onFocus,
144
- onQueryChange,
145
- onSelect,
146
- openButton,
147
- openOnFocus,
148
- options: optionsProp,
149
- padding: paddingProp = 3,
150
- popover = EMPTY_RECORD,
151
- prefix,
152
- radius = 2,
153
- readOnly,
154
- relatedElements,
155
- renderOption: renderOptionProp,
156
- renderPopover,
157
- renderValue = DEFAULT_RENDER_VALUE,
158
- suffix,
159
- value: valueProp,
160
- ...restProps
161
- } = props
162
-
163
- const [state, dispatch] = useReducer(autocompleteReducer, {
164
- activeValue: valueProp || null,
165
- focused: false,
166
- listFocused: false,
167
- query: null,
168
- value: valueProp || null,
169
- })
170
-
171
- const {activeValue, focused, listFocused, query, value} = state
172
-
173
- const defaultRenderOption = useCallback(
174
- ({value}: BaseAutocompleteOption) => (
175
- <Card data-as="button" padding={paddingProp} radius={2} tone="inherit">
176
- <Text size={fontSize} textOverflow="ellipsis">
177
- {value}
178
- </Text>
179
- </Card>
180
- ),
181
- [fontSize, paddingProp],
182
- )
183
-
184
- const renderOption =
185
- typeof renderOptionProp === 'function' ? renderOptionProp : defaultRenderOption
186
-
187
- const filterOption =
188
- typeof filterOptionProp === 'function' ? filterOptionProp : DEFAULT_FILTER_OPTION
189
-
190
- // Element refs
191
- const rootElementRef = useRef<HTMLDivElement | null>(null)
192
- const resultsPopoverElementRef = useRef<HTMLDivElement | null>(null)
193
- const inputElementRef = useRef<HTMLInputElement | null>(null)
194
- const listBoxElementRef = useRef<HTMLUListElement | null>(null)
195
- // Element refs that need to be accessed during render
196
- const [inputElement, _setInputElement] = useState<HTMLInputElement | null>(null)
197
- /**
198
- * The startTransition wrapper here is to avoid an issue when on React 18 where this error can happen:
199
- * >Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.
200
- * This doesn't happen on React 19 due to automatic batching of all state updates, the startTransition wrapper here gives a type of batching for 18 users in a way that still works with 19.
201
- * NOTE: The startTransition wrapper is not needed in UI v4, since the baseline there is React 19.
202
- */
203
- const setInputElement = useCallback((node: HTMLInputElement | null) => {
204
- startTransition(() => _setInputElement(node))
205
- }, [])
206
-
207
- // Value refs
208
- const listFocusedRef = useRef(false)
209
- const valueRef = useRef(value)
210
- const valuePropRef = useRef(valueProp)
211
- const popoverMouseWithinRef = useRef(false)
212
-
213
- // Forward inputElement state to inputElementRef
214
- useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(
215
- inputElementRef,
216
- () => inputElement,
217
- [inputElement],
218
- )
219
- // Forward inputElement to parent
220
- useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(
221
- forwardedRef,
222
- () => inputElement,
223
- [inputElement],
224
- )
225
-
226
- const listBoxId = `${id}-listbox`
227
- const options = Array.isArray(optionsProp) ? optionsProp : EMPTY_ARRAY
228
- const padding = _getArrayProp(paddingProp)
229
- const currentOption = useMemo(
230
- () => (value !== null ? options.find((o) => o.value === value) : undefined),
231
- [options, value],
232
- )
233
- const filteredOptions = useMemo(
234
- () => options.filter((option) => (query ? filterOption(query, option) : true)),
235
- [filterOption, options, query],
236
- )
237
- const filteredOptionsLen = filteredOptions.length
238
- const activeItemId = activeValue ? `${id}-option-${activeValue}` : undefined
239
- const expanded = (query !== null && loading) || (focused && query !== null)
240
-
241
- const handleRootBlur = useCallback(
242
- (event: FocusEvent<HTMLInputElement>) => {
243
- setTimeout(() => {
244
- // NOTE: This is a workaround for a bug that may happen in Chrome (clicking the scrollbar
245
- // closes the results in certain situations):
246
- // - Do not handle blur if the mouse is within the popover
247
- if (popoverMouseWithinRef.current) {
248
- return
249
- }
250
-
251
- const elements: HTMLElement[] = (relatedElements || []).concat(
252
- rootElementRef.current ? [rootElementRef.current] : [],
253
- resultsPopoverElementRef.current ? [resultsPopoverElementRef.current] : [],
254
- )
255
-
256
- let focusInside = false
257
-
258
- if (document.activeElement) {
259
- for (const e of elements) {
260
- if (e === document.activeElement || e.contains(document.activeElement)) {
261
- focusInside = true
262
- break
263
- }
264
- }
265
- }
266
-
267
- // oxlint-disable-next-line no-unnecessary-boolean-literal-compare
268
- if (focusInside === false) {
269
- dispatch({type: 'root/blur'})
270
- popoverMouseWithinRef.current = false
271
- if (onQueryChange) onQueryChange(null)
272
- if (onBlur) onBlur(event)
273
- }
274
- }, 0)
275
- },
276
- [onBlur, onQueryChange, relatedElements],
277
- )
278
-
279
- const handleRootFocus = useCallback((event: FocusEvent<HTMLDivElement>) => {
280
- const listBoxElement = listBoxElementRef.current
281
- const focusedElement = event.target instanceof HTMLElement ? event.target : null
282
- const listFocused = listBoxElement?.contains(focusedElement) || false
283
-
284
- if (listFocused !== listFocusedRef.current) {
285
- listFocusedRef.current = listFocused
286
-
287
- dispatch({type: 'root/setListFocused', listFocused})
288
- }
289
- }, [])
290
-
291
- const handleOptionSelect = useCallback(
292
- (v: string) => {
293
- dispatch({type: 'value/change', value: v})
294
-
295
- popoverMouseWithinRef.current = false
296
-
297
- if (onSelect) onSelect(v)
298
-
299
- valueRef.current = v
300
-
301
- if (onChange) onChange(v)
302
- if (onQueryChange) onQueryChange(null)
303
-
304
- inputElementRef.current?.focus()
305
- },
306
- [onChange, onSelect, onQueryChange],
307
- )
308
-
309
- const handleRootKeyDown = useCallback(
310
- (event: KeyboardEvent<HTMLElement>) => {
311
- if (event.key === 'ArrowDown') {
312
- event.preventDefault()
313
-
314
- if (!filteredOptionsLen) return
315
-
316
- const activeOption = filteredOptions.find((o) => o.value === activeValue)
317
- const activeIndex = activeOption ? filteredOptions.indexOf(activeOption) : -1
318
- const nextActiveOption = filteredOptions[(activeIndex + 1) % filteredOptionsLen]
319
-
320
- if (nextActiveOption) {
321
- dispatch({type: 'root/setActiveValue', value: nextActiveOption.value, listFocused: true})
322
- }
323
-
324
- return
325
- }
326
-
327
- if (event.key === 'ArrowUp') {
328
- event.preventDefault()
329
-
330
- if (!filteredOptionsLen) return
331
-
332
- const activeOption = filteredOptions.find((o) => o.value === activeValue)
333
- const activeIndex = activeOption ? filteredOptions.indexOf(activeOption) : -1
334
- const nextActiveOption =
335
- filteredOptions[
336
- activeIndex === -1
337
- ? filteredOptionsLen - 1
338
- : (filteredOptionsLen + activeIndex - 1) % filteredOptionsLen
339
- ]
340
-
341
- if (nextActiveOption) {
342
- dispatch({type: 'root/setActiveValue', value: nextActiveOption.value, listFocused: true})
343
- }
344
-
345
- return
346
- }
347
-
348
- if (event.key === 'Escape') {
349
- dispatch({type: 'root/escape'})
350
- popoverMouseWithinRef.current = false
351
- if (onQueryChange) onQueryChange(null)
352
- inputElementRef.current?.focus()
353
-
354
- return
355
- }
356
-
357
- // oxlint-disable-next-line no-unsafe-type-assertion
358
- const target = event.target as Node
359
- const listEl = listBoxElementRef.current
360
-
361
- if (
362
- (listEl === target || listEl?.contains(target)) &&
363
- !AUTOCOMPLETE_LISTBOX_IGNORE_KEYS.includes(event.key)
364
- ) {
365
- inputElementRef.current?.focus()
366
-
367
- return
368
- }
369
- },
370
- [activeValue, filteredOptions, filteredOptionsLen, onQueryChange],
371
- )
372
-
373
- const handleInputChange = useCallback(
374
- (event: ChangeEvent<HTMLInputElement>) => {
375
- const nextQuery = event.currentTarget.value
376
-
377
- dispatch({type: 'input/change', query: nextQuery})
378
-
379
- if (onQueryChange) onQueryChange(nextQuery)
380
- },
381
- [onQueryChange],
382
- )
383
-
384
- const dispatchOpen = useCallback(() => {
385
- dispatch({
386
- type: 'root/open',
387
- query: value ? renderValue(value, currentOption) : '',
388
- })
389
- }, [currentOption, renderValue, value])
390
-
391
- const handleInputFocus = useCallback(
392
- (event: FocusEvent<HTMLInputElement>) => {
393
- if (!focused) {
394
- dispatch({type: 'input/focus'})
395
-
396
- if (onFocus) onFocus(event)
397
- if (openOnFocus) dispatchOpen()
398
- }
399
- },
400
- [focused, onFocus, openOnFocus, dispatchOpen],
401
- )
402
-
403
- const handlePopoverMouseEnter = useCallback(() => {
404
- popoverMouseWithinRef.current = true
405
- }, [])
406
-
407
- const handlePopoverMouseLeave = useCallback(() => {
408
- popoverMouseWithinRef.current = false
409
- }, [])
410
-
411
- const handleClearButtonClick = useCallback(() => {
412
- dispatch({type: 'root/clear'})
413
- valueRef.current = ''
414
- if (onChange) onChange('')
415
- if (onQueryChange) onQueryChange(null)
416
- inputElementRef.current?.focus()
417
- }, [onChange, onQueryChange])
418
-
419
- const handleClearButtonFocus = useCallback(() => {
420
- dispatch({type: 'input/focus'})
421
- }, [])
422
-
423
- // Change the value when `value` prop changes
424
- useEffect(() => {
425
- // If `valueProp` changed
426
- if (valueProp !== valuePropRef.current) {
427
- valuePropRef.current = valueProp
428
-
429
- if (valueProp !== undefined) {
430
- dispatch({type: 'value/change', value: valueProp})
431
- valueRef.current = valueProp
432
- }
433
-
434
- return
435
- }
436
-
437
- // If `valueProp` is not equal to `value`
438
- if (valueProp !== valueRef.current) {
439
- valueRef.current = valueProp || null
440
-
441
- dispatch({type: 'value/change', value: valueProp || null})
442
- }
443
- }, [valueProp])
444
-
445
- // Reset active item when closing
446
- useEffect(() => {
447
- if (!focused && valueRef.current) {
448
- dispatch({type: 'root/setActiveValue', value: valueRef.current})
449
- }
450
- }, [focused])
451
-
452
- // Focus the selected item
453
- useEffect(() => {
454
- const listElement = listBoxElementRef.current
455
-
456
- if (!listElement) return
457
-
458
- const activeOption = filteredOptions.find((o) => o.value === activeValue)
459
-
460
- if (activeOption) {
461
- const activeIndex = filteredOptions.indexOf(activeOption)
462
- // oxlint-disable-next-line no-unsafe-type-assertion
463
- const activeItemElement = listElement.childNodes[activeIndex] as HTMLLIElement | undefined
464
-
465
- if (activeItemElement) {
466
- if (_hasFocus(activeItemElement)) {
467
- // already focused
468
- return
469
- }
470
-
471
- focusFirstDescendant(activeItemElement)
472
- }
473
- }
474
- }, [activeValue, filteredOptions])
475
-
476
- const clearButton = useMemo(() => {
477
- if (!loading && !disabled && value) {
478
- return {
479
- 'aria-label': 'Clear',
480
- 'onFocus': handleClearButtonFocus,
481
- }
482
- }
483
-
484
- return undefined
485
- }, [disabled, handleClearButtonFocus, loading, value])
486
-
487
- const openButtonBoxPadding = padding.map((v) => {
488
- if (v === 0) return 0
489
- if (v === 1) return 1
490
- if (v === 2) return 1
491
-
492
- return v - 2
493
- })
494
- const openButtonPadding = padding.map((v) => Math.max(v - 1, 0))
495
- const openButtonProps: AutocompleteOpenButtonProps = useMemo(
496
- () => (typeof openButton === 'object' ? openButton : EMPTY_RECORD),
497
- [openButton],
498
- )
499
-
500
- const handleOpenClick = useCallback(
501
- (event: MouseEvent<HTMLButtonElement>) => {
502
- dispatchOpen()
503
-
504
- if (openButtonProps.onClick) openButtonProps.onClick(event)
505
-
506
- _raf(() => inputElementRef.current?.focus())
507
- },
508
- [openButtonProps, dispatchOpen],
509
- )
510
-
511
- const openButtonNode = useMemo(
512
- () =>
513
- !disabled && !readOnly && openButton ? (
514
- <Box aria-hidden={expanded} padding={openButtonBoxPadding}>
515
- <Button
516
- aria-label="Open"
517
- disabled={expanded}
518
- fontSize={fontSize}
519
- icon={ChevronDownIcon}
520
- mode="bleed"
521
- padding={openButtonPadding}
522
- {...openButtonProps}
523
- onClick={handleOpenClick}
524
- />
525
- </Box>
526
- ) : undefined,
527
- [
528
- disabled,
529
- expanded,
530
- fontSize,
531
- handleOpenClick,
532
- openButton,
533
- openButtonBoxPadding,
534
- openButtonPadding,
535
- openButtonProps,
536
- readOnly,
537
- ],
538
- )
539
-
540
- const inputValue = useMemo(() => {
541
- if (query === null) {
542
- if (value !== null) {
543
- return renderValue(value, currentOption)
544
- }
545
-
546
- return ''
547
- }
548
-
549
- return query
550
- }, [currentOption, query, renderValue, value])
551
-
552
- const handleListBoxKeyDown = useCallback(
553
- (event: KeyboardEvent<HTMLDivElement>) => {
554
- // If the focus is currently in the list, move focus to the input element
555
- if (event.key === 'Tab') {
556
- if (listFocused) inputElementRef.current?.focus()
557
- }
558
- },
559
- [listFocused],
560
- )
561
-
562
- const content = useMemo(() => {
563
- if (filteredOptions.length === 0) return null
564
-
565
- return (
566
- <ListBox
567
- data-ui="AutoComplete__results"
568
- onKeyDown={handleListBoxKeyDown}
569
- padding={1}
570
- {...listBox}
571
- tabIndex={-1}
572
- >
573
- <Stack
574
- as="ul"
575
- aria-multiselectable={false}
576
- data-ui="AutoComplete__resultsList"
577
- id={listBoxId}
578
- ref={listBoxElementRef}
579
- // oxlint-disable-next-line prefer-tag-over-role
580
- role="listbox"
581
- // oxlint-disable-next-line no-deprecated
582
- space={1}
583
- >
584
- {filteredOptions.map((option) => {
585
- const active =
586
- activeValue !== null ? option.value === activeValue : currentOption === option
587
-
588
- return (
589
- <AutocompleteOption
590
- id={`${id}-option-${option.value}`}
591
- key={option.value}
592
- onSelect={handleOptionSelect}
593
- selected={active}
594
- value={option.value}
595
- >
596
- {cloneElement(renderOption(option), {
597
- disabled: loading,
598
- selected: active,
599
- tabIndex: listFocused && active ? 0 : -1,
600
- })}
601
- </AutocompleteOption>
602
- )
603
- })}
604
- </Stack>
605
- </ListBox>
606
- )
607
- }, [
608
- activeValue,
609
- currentOption,
610
- filteredOptions,
611
- handleOptionSelect,
612
- handleListBoxKeyDown,
613
- id,
614
- listBox,
615
- listBoxId,
616
- listFocused,
617
- loading,
618
- renderOption,
619
- ])
620
-
621
- const results = useMemo(() => {
622
- if (renderPopover) {
623
- return (
624
- <RenderPopover
625
- content={content}
626
- hidden={!expanded}
627
- inputElement={inputElement}
628
- onMouseEnter={handlePopoverMouseEnter}
629
- onMouseLeave={handlePopoverMouseLeave}
630
- resultsPopoverElementRef={resultsPopoverElementRef}
631
- renderPopover={renderPopover}
632
- />
633
- )
634
- }
635
-
636
- if (filteredOptionsLen === 0) {
637
- return null
638
- }
639
-
640
- return (
641
- <Popover
642
- arrow={false}
643
- constrainSize
644
- content={content}
645
- fallbackPlacements={AUTOCOMPLETE_POPOVER_FALLBACK_PLACEMENTS}
646
- matchReferenceWidth
647
- onMouseEnter={handlePopoverMouseEnter}
648
- onMouseLeave={handlePopoverMouseLeave}
649
- open={expanded}
650
- overflow="auto"
651
- placement={AUTOCOMPLETE_POPOVER_PLACEMENT}
652
- portal
653
- radius={radius}
654
- ref={resultsPopoverElementRef}
655
- referenceElement={inputElement}
656
- {...popover}
657
- />
658
- )
659
- }, [
660
- content,
661
- expanded,
662
- filteredOptionsLen,
663
- handlePopoverMouseEnter,
664
- handlePopoverMouseLeave,
665
- inputElement,
666
- popover,
667
- radius,
668
- renderPopover,
669
- ])
670
-
671
- return (
672
- <StyledAutocomplete
673
- data-ui="Autocomplete"
674
- onBlur={handleRootBlur}
675
- onFocus={handleRootFocus}
676
- onKeyDown={handleRootKeyDown}
677
- ref={rootElementRef}
678
- >
679
- <TextInput
680
- {...restProps}
681
- aria-activedescendant={activeItemId}
682
- aria-autocomplete="list"
683
- aria-expanded={expanded}
684
- aria-owns={listBoxId}
685
- autoCapitalize="off"
686
- autoComplete="off"
687
- autoCorrect="off"
688
- border={border}
689
- clearButton={clearButton}
690
- customValidity={customValidity}
691
- disabled={disabled}
692
- fontSize={fontSize}
693
- icon={icon}
694
- iconRight={loading && AnimatedSpinnerIcon}
695
- id={id}
696
- inputMode="search"
697
- onChange={handleInputChange}
698
- onClear={handleClearButtonClick}
699
- onFocus={handleInputFocus}
700
- padding={padding}
701
- prefix={prefix}
702
- radius={radius}
703
- readOnly={readOnly}
704
- ref={setInputElement}
705
- // oxlint-disable-next-line prefer-tag-over-role, role-has-required-aria-props
706
- role="combobox"
707
- spellCheck={false}
708
- suffix={suffix || openButtonNode}
709
- value={inputValue}
710
- />
711
- {results}
712
- </StyledAutocomplete>
713
- )
714
- })
715
-
716
- function RenderPopover({
717
- renderPopover,
718
- content,
719
- hidden,
720
- inputElement,
721
- onMouseEnter,
722
- onMouseLeave,
723
- resultsPopoverElementRef,
724
- }: {
725
- renderPopover: Exclude<AutocompleteProps['renderPopover'], undefined>
726
- resultsPopoverElementRef: Parameters<Exclude<AutocompleteProps['renderPopover'], undefined>>[1]
727
- } & Parameters<Exclude<AutocompleteProps['renderPopover'], undefined>>[0]) {
728
- return renderPopover(
729
- {
730
- content,
731
- hidden,
732
- inputElement,
733
- onMouseEnter,
734
- onMouseLeave,
735
- },
736
- resultsPopoverElementRef,
737
- )
738
- }
739
-
740
- InnerAutocomplete.displayName = 'ForwardRef(Autocomplete)'
741
-
742
- /**
743
- * The Autocomplete component is typically used for search components.
744
- * It consists of a text input for writing a query, and properties for rendering suggestions.
745
- *
746
- * @public
747
- */
748
- // oxlint-disable-next-line no-unsafe-type-assertion
749
- export const Autocomplete = InnerAutocomplete as <Option extends BaseAutocompleteOption>(
750
- props: AutocompleteProps<Option> &
751
- Omit<
752
- HTMLProps<HTMLInputElement>,
753
- | 'aria-activedescendant'
754
- | 'aria-autocomplete'
755
- | 'aria-expanded'
756
- | 'aria-owns'
757
- | 'as'
758
- | 'autoCapitalize'
759
- | 'autoComplete'
760
- | 'autoCorrect'
761
- | 'id'
762
- | 'inputMode'
763
- | 'onChange'
764
- | 'onSelect'
765
- | 'popover'
766
- | 'prefix'
767
- | 'ref'
768
- | 'role'
769
- | 'spellCheck'
770
- | 'type'
771
- | 'value'
772
- > & {
773
- ref?: Ref<HTMLInputElement>
774
- },
775
- ) => React.JSX.Element