@sanity/ui 3.3.2 → 3.3.4

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 (437) hide show
  1. package/dist/index.d.mts +8 -8
  2. package/dist/index.d.mts.map +1 -1
  3. package/dist/index.d.ts +8 -8
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +16 -16
  6. package/dist/index.mjs +16 -16
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/tabList.js +2 -2
  9. package/dist/tabList.mjs +2 -2
  10. package/dist/tabList.mjs.map +1 -1
  11. package/dist/useTheme.d.mts +3 -3
  12. package/dist/useTheme.d.mts.map +1 -1
  13. package/dist/useTheme.d.ts +3 -3
  14. package/dist/useTheme.d.ts.map +1 -1
  15. package/package.json +8 -13
  16. package/exports/_visual-editing.ts +0 -32
  17. package/exports/index.ts +0 -1
  18. package/exports/theme.ts +0 -1
  19. package/src/core/_compat.ts +0 -294
  20. package/src/core/components/autocomplete/autocomplete.styles.tsx +0 -39
  21. package/src/core/components/autocomplete/autocomplete.tsx +0 -775
  22. package/src/core/components/autocomplete/autocompleteOption.tsx +0 -46
  23. package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
  24. package/src/core/components/autocomplete/constants.ts +0 -28
  25. package/src/core/components/autocomplete/index.ts +0 -2
  26. package/src/core/components/autocomplete/types.ts +0 -108
  27. package/src/core/components/breadcrumbs/breadcrumbs.styles.ts +0 -18
  28. package/src/core/components/breadcrumbs/breadcrumbs.test.tsx +0 -54
  29. package/src/core/components/breadcrumbs/breadcrumbs.tsx +0 -136
  30. package/src/core/components/breadcrumbs/index.ts +0 -1
  31. package/src/core/components/dialog/dialog.tsx +0 -433
  32. package/src/core/components/dialog/dialogContext.ts +0 -20
  33. package/src/core/components/dialog/dialogProvider.tsx +0 -35
  34. package/src/core/components/dialog/index.ts +0 -4
  35. package/src/core/components/dialog/styles.ts +0 -77
  36. package/src/core/components/dialog/useDialog.ts +0 -11
  37. package/src/core/components/hotkeys/hotkeys.test.tsx +0 -47
  38. package/src/core/components/hotkeys/hotkeys.tsx +0 -68
  39. package/src/core/components/hotkeys/index.ts +0 -1
  40. package/src/core/components/index.ts +0 -9
  41. package/src/core/components/menu/helpers.ts +0 -82
  42. package/src/core/components/menu/index.ts +0 -5
  43. package/src/core/components/menu/menu.spacing.test.tsx +0 -68
  44. package/src/core/components/menu/menu.test.tsx +0 -128
  45. package/src/core/components/menu/menu.tsx +0 -180
  46. package/src/core/components/menu/menuButton.tsx +0 -276
  47. package/src/core/components/menu/menuContext.ts +0 -18
  48. package/src/core/components/menu/menuDivider.ts +0 -24
  49. package/src/core/components/menu/menuGroup.spacing.test.tsx +0 -66
  50. package/src/core/components/menu/menuGroup.tsx +0 -237
  51. package/src/core/components/menu/menuItem.spacing.test.tsx +0 -62
  52. package/src/core/components/menu/menuItem.tsx +0 -201
  53. package/src/core/components/menu/useMenu.ts +0 -21
  54. package/src/core/components/menu/useMenuController.ts +0 -233
  55. package/src/core/components/skeleton/index.ts +0 -2
  56. package/src/core/components/skeleton/skeleton.tsx +0 -58
  57. package/src/core/components/skeleton/styles.ts +0 -50
  58. package/src/core/components/skeleton/textSkeleton.tsx +0 -122
  59. package/src/core/components/tab/index.ts +0 -3
  60. package/src/core/components/tab/tab.tsx +0 -102
  61. package/src/core/components/tab/tabList.test.tsx +0 -50
  62. package/src/core/components/tab/tabList.tsx +0 -71
  63. package/src/core/components/tab/tabPanel.tsx +0 -39
  64. package/src/core/components/toast/index.ts +0 -4
  65. package/src/core/components/toast/styles.ts +0 -77
  66. package/src/core/components/toast/toast.test.tsx +0 -106
  67. package/src/core/components/toast/toast.tsx +0 -199
  68. package/src/core/components/toast/toastContext.ts +0 -7
  69. package/src/core/components/toast/toastLayer.tsx +0 -52
  70. package/src/core/components/toast/toastProvider.tsx +0 -113
  71. package/src/core/components/toast/toastState.ts +0 -6
  72. package/src/core/components/toast/types.ts +0 -26
  73. package/src/core/components/toast/useToast.ts +0 -25
  74. package/src/core/components/tree/helpers.ts +0 -105
  75. package/src/core/components/tree/index.ts +0 -4
  76. package/src/core/components/tree/style.ts +0 -105
  77. package/src/core/components/tree/tree.test.tsx +0 -60
  78. package/src/core/components/tree/tree.tsx +0 -242
  79. package/src/core/components/tree/treeContext.ts +0 -10
  80. package/src/core/components/tree/treeGroup.tsx +0 -29
  81. package/src/core/components/tree/treeItem.test.tsx +0 -70
  82. package/src/core/components/tree/treeItem.tsx +0 -225
  83. package/src/core/components/tree/types.ts +0 -25
  84. package/src/core/components/tree/useTree.ts +0 -17
  85. package/src/core/constants.ts +0 -79
  86. package/src/core/helpers/animation.ts +0 -27
  87. package/src/core/helpers/element.ts +0 -55
  88. package/src/core/helpers/focus.ts +0 -100
  89. package/src/core/helpers/index.ts +0 -4
  90. package/src/core/helpers/scroll.ts +0 -15
  91. package/src/core/hooks/index.ts +0 -13
  92. package/src/core/hooks/useArrayProp.ts +0 -17
  93. package/src/core/hooks/useClickOutside.test.tsx +0 -510
  94. package/src/core/hooks/useClickOutside.ts +0 -118
  95. package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -119
  96. package/src/core/hooks/useClickOutsideEvent.ts +0 -73
  97. package/src/core/hooks/useCustomValidity.ts +0 -13
  98. package/src/core/hooks/useDelayed.test.ts +0 -89
  99. package/src/core/hooks/useDelayedState.ts +0 -36
  100. package/src/core/hooks/useElementRect/index.ts +0 -1
  101. package/src/core/hooks/useElementRect/useElementRect.ts +0 -14
  102. package/src/core/hooks/useElementSize.ts +0 -19
  103. package/src/core/hooks/useForwardedRef.ts +0 -20
  104. package/src/core/hooks/useGlobalKeyDown.ts +0 -24
  105. package/src/core/hooks/useIsomorphicEffect.ts +0 -7
  106. package/src/core/hooks/useMatchMedia.ts +0 -28
  107. package/src/core/hooks/useMediaIndex/index.ts +0 -1
  108. package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -37
  109. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -102
  110. package/src/core/hooks/useMounted.ts +0 -15
  111. package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -58
  112. package/src/core/hooks/usePrefersDark.test.tsx +0 -21
  113. package/src/core/hooks/usePrefersDark.ts +0 -16
  114. package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -58
  115. package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -21
  116. package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
  117. package/src/core/index.ts +0 -10
  118. package/src/core/lib/createGlobalScopedContext.ts +0 -37
  119. package/src/core/lib/globalScope.ts +0 -20
  120. package/src/core/lib/isRecord.ts +0 -3
  121. package/src/core/middleware/origin.ts +0 -47
  122. package/src/core/observers/elementSizeObserver.ts +0 -117
  123. package/src/core/observers/index.ts +0 -2
  124. package/src/core/observers/resizeObserver.ts +0 -9
  125. package/src/core/primitives/_selectable/index.ts +0 -1
  126. package/src/core/primitives/_selectable/selectable.tsx +0 -15
  127. package/src/core/primitives/_selectable/style.ts +0 -115
  128. package/src/core/primitives/avatar/avatar.tsx +0 -200
  129. package/src/core/primitives/avatar/avatarCounter.tsx +0 -91
  130. package/src/core/primitives/avatar/avatarStack.tsx +0 -101
  131. package/src/core/primitives/avatar/index.ts +0 -4
  132. package/src/core/primitives/avatar/styles.ts +0 -167
  133. package/src/core/primitives/avatar/types.ts +0 -17
  134. package/src/core/primitives/badge/badge.test.tsx +0 -17
  135. package/src/core/primitives/badge/badge.tsx +0 -72
  136. package/src/core/primitives/badge/index.ts +0 -1
  137. package/src/core/primitives/badge/styles.ts +0 -20
  138. package/src/core/primitives/badge/types.ts +0 -8
  139. package/src/core/primitives/box/box.test.tsx +0 -155
  140. package/src/core/primitives/box/box.tsx +0 -162
  141. package/src/core/primitives/box/index.ts +0 -1
  142. package/src/core/primitives/button/button.test.tsx +0 -86
  143. package/src/core/primitives/button/button.tsx +0 -214
  144. package/src/core/primitives/button/index.ts +0 -1
  145. package/src/core/primitives/button/styles.ts +0 -118
  146. package/src/core/primitives/card/card.tsx +0 -125
  147. package/src/core/primitives/card/index.ts +0 -2
  148. package/src/core/primitives/card/styles.ts +0 -147
  149. package/src/core/primitives/card/types.ts +0 -12
  150. package/src/core/primitives/checkbox/checkbox.tsx +0 -73
  151. package/src/core/primitives/checkbox/index.ts +0 -1
  152. package/src/core/primitives/checkbox/styles.ts +0 -128
  153. package/src/core/primitives/code/code.tsx +0 -56
  154. package/src/core/primitives/code/index.ts +0 -1
  155. package/src/core/primitives/code/refractor.tsx +0 -22
  156. package/src/core/primitives/code/styles.ts +0 -77
  157. package/src/core/primitives/container/container.tsx +0 -55
  158. package/src/core/primitives/container/index.ts +0 -2
  159. package/src/core/primitives/container/styles.ts +0 -23
  160. package/src/core/primitives/container/types.ts +0 -6
  161. package/src/core/primitives/flex/flex.tsx +0 -63
  162. package/src/core/primitives/flex/index.ts +0 -1
  163. package/src/core/primitives/grid/grid.test.tsx +0 -86
  164. package/src/core/primitives/grid/grid.tsx +0 -77
  165. package/src/core/primitives/grid/index.ts +0 -1
  166. package/src/core/primitives/heading/heading.tsx +0 -89
  167. package/src/core/primitives/heading/index.ts +0 -1
  168. package/src/core/primitives/heading/styles.ts +0 -64
  169. package/src/core/primitives/heading/types.ts +0 -7
  170. package/src/core/primitives/index.ts +0 -27
  171. package/src/core/primitives/inline/index.ts +0 -1
  172. package/src/core/primitives/inline/inline.test.tsx +0 -55
  173. package/src/core/primitives/inline/inline.tsx +0 -66
  174. package/src/core/primitives/inline/styles.ts +0 -32
  175. package/src/core/primitives/inline/types.ts +0 -6
  176. package/src/core/primitives/kbd/index.ts +0 -1
  177. package/src/core/primitives/kbd/kbd.tsx +0 -73
  178. package/src/core/primitives/label/index.ts +0 -1
  179. package/src/core/primitives/label/label.tsx +0 -88
  180. package/src/core/primitives/label/styles.ts +0 -45
  181. package/src/core/primitives/popover/constants.ts +0 -22
  182. package/src/core/primitives/popover/floating-ui/size.ts +0 -99
  183. package/src/core/primitives/popover/helpers.ts +0 -31
  184. package/src/core/primitives/popover/index.ts +0 -2
  185. package/src/core/primitives/popover/popover.tsx +0 -512
  186. package/src/core/primitives/popover/popoverCard.tsx +0 -167
  187. package/src/core/primitives/popover/types.ts +0 -6
  188. package/src/core/primitives/radio/index.ts +0 -1
  189. package/src/core/primitives/radio/radio.tsx +0 -51
  190. package/src/core/primitives/radio/styles.ts +0 -117
  191. package/src/core/primitives/select/index.ts +0 -1
  192. package/src/core/primitives/select/select.test.tsx +0 -56
  193. package/src/core/primitives/select/select.tsx +0 -95
  194. package/src/core/primitives/select/styles.ts +0 -166
  195. package/src/core/primitives/spinner/index.ts +0 -1
  196. package/src/core/primitives/spinner/spinner.tsx +0 -46
  197. package/src/core/primitives/stack/index.ts +0 -1
  198. package/src/core/primitives/stack/stack.test.tsx +0 -61
  199. package/src/core/primitives/stack/stack.tsx +0 -59
  200. package/src/core/primitives/stack/styles.ts +0 -33
  201. package/src/core/primitives/switch/index.ts +0 -1
  202. package/src/core/primitives/switch/styles.ts +0 -173
  203. package/src/core/primitives/switch/switch.tsx +0 -68
  204. package/src/core/primitives/text/index.ts +0 -1
  205. package/src/core/primitives/text/styles.ts +0 -74
  206. package/src/core/primitives/text/text.tsx +0 -90
  207. package/src/core/primitives/textArea/index.ts +0 -1
  208. package/src/core/primitives/textArea/textArea.tsx +0 -120
  209. package/src/core/primitives/textInput/index.ts +0 -1
  210. package/src/core/primitives/textInput/textInput.test.tsx +0 -52
  211. package/src/core/primitives/textInput/textInput.tsx +0 -398
  212. package/src/core/primitives/tooltip/constants.ts +0 -23
  213. package/src/core/primitives/tooltip/index.ts +0 -2
  214. package/src/core/primitives/tooltip/tooltip.test.tsx +0 -485
  215. package/src/core/primitives/tooltip/tooltip.tsx +0 -497
  216. package/src/core/primitives/tooltip/tooltipCard.tsx +0 -110
  217. package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
  218. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +0 -11
  219. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -57
  220. package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -12
  221. package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
  222. package/src/core/primitives/types.ts +0 -179
  223. package/src/core/styles/border/borderStyle.ts +0 -56
  224. package/src/core/styles/border/index.ts +0 -2
  225. package/src/core/styles/border/types.ts +0 -10
  226. package/src/core/styles/box/boxStyle.ts +0 -69
  227. package/src/core/styles/box/index.ts +0 -2
  228. package/src/core/styles/box/types.ts +0 -11
  229. package/src/core/styles/card/_cardColorStyle.ts +0 -108
  230. package/src/core/styles/card/index.ts +0 -1
  231. package/src/core/styles/flex/flexItemStyle.ts +0 -27
  232. package/src/core/styles/flex/flexStyle.ts +0 -70
  233. package/src/core/styles/flex/index.ts +0 -3
  234. package/src/core/styles/flex/types.ts +0 -24
  235. package/src/core/styles/focusRing/index.ts +0 -25
  236. package/src/core/styles/font/codeFontStyle.ts +0 -13
  237. package/src/core/styles/font/headingFontStyle.ts +0 -13
  238. package/src/core/styles/font/index.ts +0 -6
  239. package/src/core/styles/font/labelFontStyle.ts +0 -13
  240. package/src/core/styles/font/responsiveFont.ts +0 -100
  241. package/src/core/styles/font/textAlignStyle.ts +0 -19
  242. package/src/core/styles/font/textFontStyle.ts +0 -13
  243. package/src/core/styles/font/types.ts +0 -33
  244. package/src/core/styles/grid/gridItemStyle.ts +0 -82
  245. package/src/core/styles/grid/gridStyle.ts +0 -109
  246. package/src/core/styles/grid/index.ts +0 -3
  247. package/src/core/styles/grid/types.ts +0 -37
  248. package/src/core/styles/helpers.ts +0 -72
  249. package/src/core/styles/index.ts +0 -5
  250. package/src/core/styles/input/index.ts +0 -2
  251. package/src/core/styles/input/responsiveInputPaddingStyle.ts +0 -78
  252. package/src/core/styles/input/textInputStyle.ts +0 -263
  253. package/src/core/styles/internal.ts +0 -12
  254. package/src/core/styles/margin/index.ts +0 -2
  255. package/src/core/styles/margin/marginStyle.ts +0 -22
  256. package/src/core/styles/margin/marginsStyle.test.ts +0 -34
  257. package/src/core/styles/margin/types.ts +0 -9
  258. package/src/core/styles/padding/index.ts +0 -2
  259. package/src/core/styles/padding/paddingStyle.test.ts +0 -34
  260. package/src/core/styles/padding/paddingStyle.ts +0 -22
  261. package/src/core/styles/padding/types.ts +0 -12
  262. package/src/core/styles/radius/index.ts +0 -2
  263. package/src/core/styles/radius/radiusStyle.ts +0 -23
  264. package/src/core/styles/radius/types.ts +0 -8
  265. package/src/core/styles/shadow/index.ts +0 -2
  266. package/src/core/styles/shadow/shadowStyle.ts +0 -29
  267. package/src/core/styles/shadow/types.ts +0 -6
  268. package/src/core/styles/types.ts +0 -8
  269. package/src/core/theme/index.ts +0 -5
  270. package/src/core/theme/theme.test.tsx +0 -77
  271. package/src/core/theme/themeColorProvider.tsx +0 -29
  272. package/src/core/theme/themeContext.ts +0 -10
  273. package/src/core/theme/themeProvider.tsx +0 -62
  274. package/src/core/theme/types.ts +0 -12
  275. package/src/core/theme/useRootTheme.ts +0 -18
  276. package/src/core/theme/useTheme.ts +0 -18
  277. package/src/core/types/avatar.ts +0 -14
  278. package/src/core/types/badge.ts +0 -12
  279. package/src/core/types/box.ts +0 -19
  280. package/src/core/types/button.ts +0 -21
  281. package/src/core/types/card.ts +0 -6
  282. package/src/core/types/component.ts +0 -32
  283. package/src/core/types/dialog.ts +0 -4
  284. package/src/core/types/flex.ts +0 -30
  285. package/src/core/types/grid.ts +0 -14
  286. package/src/core/types/gridItem.ts +0 -29
  287. package/src/core/types/index.ts +0 -15
  288. package/src/core/types/placement.ts +0 -18
  289. package/src/core/types/popover.ts +0 -4
  290. package/src/core/types/radius.ts +0 -4
  291. package/src/core/types/selectable.ts +0 -6
  292. package/src/core/types/text.ts +0 -4
  293. package/src/core/utils/arrow/arrow.tsx +0 -124
  294. package/src/core/utils/arrow/cmds.ts +0 -91
  295. package/src/core/utils/arrow/index.ts +0 -1
  296. package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -105
  297. package/src/core/utils/boundaryElement/boundaryElementContext.ts +0 -7
  298. package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -24
  299. package/src/core/utils/boundaryElement/index.ts +0 -3
  300. package/src/core/utils/boundaryElement/types.ts +0 -7
  301. package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -26
  302. package/src/core/utils/conditionalWrapper/conditionalWrapper.tsx +0 -22
  303. package/src/core/utils/conditionalWrapper/index.ts +0 -1
  304. package/src/core/utils/elementQuery/elementQuery.tsx +0 -53
  305. package/src/core/utils/elementQuery/helpers.ts +0 -27
  306. package/src/core/utils/elementQuery/index.ts +0 -1
  307. package/src/core/utils/errorBoundary.tsx +0 -48
  308. package/src/core/utils/getElementRef.ts +0 -31
  309. package/src/core/utils/index.ts +0 -9
  310. package/src/core/utils/layer/getLayerContext.test.ts +0 -32
  311. package/src/core/utils/layer/getLayerContext.ts +0 -21
  312. package/src/core/utils/layer/index.ts +0 -4
  313. package/src/core/utils/layer/layer.test.tsx +0 -113
  314. package/src/core/utils/layer/layer.tsx +0 -99
  315. package/src/core/utils/layer/layerContext.ts +0 -7
  316. package/src/core/utils/layer/layerProvider.tsx +0 -111
  317. package/src/core/utils/layer/types.ts +0 -9
  318. package/src/core/utils/layer/useLayer.ts +0 -28
  319. package/src/core/utils/portal/index.ts +0 -4
  320. package/src/core/utils/portal/portal.test.tsx +0 -108
  321. package/src/core/utils/portal/portal.ts +0 -32
  322. package/src/core/utils/portal/portalContext.ts +0 -31
  323. package/src/core/utils/portal/portalProvider.tsx +0 -48
  324. package/src/core/utils/portal/types.ts +0 -9
  325. package/src/core/utils/portal/usePortal.ts +0 -25
  326. package/src/core/utils/spanWithTextOverflow.tsx +0 -10
  327. package/src/core/utils/srOnly/index.ts +0 -1
  328. package/src/core/utils/srOnly/srOnly.tsx +0 -36
  329. package/src/core/utils/virtualList/index.ts +0 -1
  330. package/src/core/utils/virtualList/virtualList.tsx +0 -201
  331. package/src/theme/build/_deprecated/color/_selectable/createSelectableTones.ts +0 -86
  332. package/src/theme/build/_deprecated/color/_solid/createSolidTones.ts +0 -58
  333. package/src/theme/build/_deprecated/color/button/createButtonModes.ts +0 -27
  334. package/src/theme/build/_deprecated/color/button/createButtonTones.ts +0 -60
  335. package/src/theme/build/_deprecated/color/card/createCardStates.ts +0 -66
  336. package/src/theme/build/_deprecated/color/color.test.ts +0 -67
  337. package/src/theme/build/_deprecated/color/defaults.ts +0 -391
  338. package/src/theme/build/_deprecated/color/factory.ts +0 -178
  339. package/src/theme/build/_deprecated/color/index.ts +0 -1
  340. package/src/theme/build/_deprecated/color/input/createInputModes.ts +0 -86
  341. package/src/theme/build/_deprecated/color/muted/createMuted.ts +0 -58
  342. package/src/theme/build/_deprecated/color/spot/createSpot.ts +0 -23
  343. package/src/theme/build/buildColorTheme.test.ts +0 -185
  344. package/src/theme/build/buildColorTheme.ts +0 -507
  345. package/src/theme/build/buildTheme.test.ts +0 -89
  346. package/src/theme/build/buildTheme.ts +0 -36
  347. package/src/theme/build/colorToken/colorToken.ts +0 -19
  348. package/src/theme/build/colorToken/compileColorToken.ts +0 -21
  349. package/src/theme/build/colorToken/index.ts +0 -2
  350. package/src/theme/build/colorToken/types.ts +0 -6
  351. package/src/theme/build/index.ts +0 -3
  352. package/src/theme/build/lib/color-fns/blend/index.ts +0 -3
  353. package/src/theme/build/lib/color-fns/blend/mix.ts +0 -21
  354. package/src/theme/build/lib/color-fns/blend/multiply.ts +0 -18
  355. package/src/theme/build/lib/color-fns/blend/screen.ts +0 -18
  356. package/src/theme/build/lib/color-fns/color-fns.test.ts +0 -70
  357. package/src/theme/build/lib/color-fns/contrastRatio.ts +0 -31
  358. package/src/theme/build/lib/color-fns/convert.ts +0 -150
  359. package/src/theme/build/lib/color-fns/index.ts +0 -6
  360. package/src/theme/build/lib/color-fns/parse.ts +0 -60
  361. package/src/theme/build/lib/color-fns/rgba.ts +0 -10
  362. package/src/theme/build/lib/color-fns/types.ts +0 -28
  363. package/src/theme/build/lib/isRecord.ts +0 -3
  364. package/src/theme/build/lib/lazy.ts +0 -30
  365. package/src/theme/build/lib/utils.ts +0 -19
  366. package/src/theme/build/merge.ts +0 -31
  367. package/src/theme/build/mixThemeColor.test.ts +0 -23
  368. package/src/theme/build/mixThemeColor.ts +0 -53
  369. package/src/theme/build/renderColorTheme.ts +0 -538
  370. package/src/theme/build/renderColorValue.ts +0 -83
  371. package/src/theme/build/resolveColorTokens.ts +0 -274
  372. package/src/theme/build/theme.test.ts +0 -29
  373. package/src/theme/config/helpers.ts +0 -60
  374. package/src/theme/config/index.ts +0 -4
  375. package/src/theme/config/system.ts +0 -117
  376. package/src/theme/config/tokens/color/index.ts +0 -1
  377. package/src/theme/config/tokens/color/types.ts +0 -135
  378. package/src/theme/config/tokens/index.ts +0 -4
  379. package/src/theme/config/tokens/parseTokenKey.test.ts +0 -66
  380. package/src/theme/config/tokens/parseTokenKey.ts +0 -67
  381. package/src/theme/config/tokens/parseTokenValue.test.ts +0 -44
  382. package/src/theme/config/tokens/parseTokenValue.ts +0 -134
  383. package/src/theme/config/tokens/types.ts +0 -53
  384. package/src/theme/config/types.ts +0 -46
  385. package/src/theme/defaults/colorPalette.ts +0 -5
  386. package/src/theme/defaults/colorTokens.ts +0 -648
  387. package/src/theme/defaults/config.ts +0 -84
  388. package/src/theme/defaults/fonts.ts +0 -227
  389. package/src/theme/getScopedTheme.ts +0 -103
  390. package/src/theme/index.ts +0 -5
  391. package/src/theme/system/avatar.ts +0 -14
  392. package/src/theme/system/color/_constants.ts +0 -45
  393. package/src/theme/system/color/_helpers.ts +0 -28
  394. package/src/theme/system/color/_system.ts +0 -40
  395. package/src/theme/system/color/avatar.ts +0 -15
  396. package/src/theme/system/color/badge.ts +0 -16
  397. package/src/theme/system/color/button.ts +0 -17
  398. package/src/theme/system/color/color.ts +0 -34
  399. package/src/theme/system/color/index.ts +0 -13
  400. package/src/theme/system/color/input.ts +0 -25
  401. package/src/theme/system/color/kbd.ts +0 -8
  402. package/src/theme/system/color/selectable.ts +0 -12
  403. package/src/theme/system/color/shadow.ts +0 -7
  404. package/src/theme/system/color/state.ts +0 -43
  405. package/src/theme/system/color/syntax.ts +0 -41
  406. package/src/theme/system/css.ts +0 -14
  407. package/src/theme/system/focusRing.ts +0 -7
  408. package/src/theme/system/font.ts +0 -52
  409. package/src/theme/system/index.ts +0 -11
  410. package/src/theme/system/input.ts +0 -33
  411. package/src/theme/system/layer.ts +0 -8
  412. package/src/theme/system/shadow.ts +0 -19
  413. package/src/theme/system/styles.ts +0 -13
  414. package/src/theme/system/theme.ts +0 -142
  415. package/src/theme/system/v0/avatar.ts +0 -10
  416. package/src/theme/system/v0/color/_generic.ts +0 -35
  417. package/src/theme/system/v0/color/_system.ts +0 -18
  418. package/src/theme/system/v0/color/base.ts +0 -21
  419. package/src/theme/system/v0/color/button.ts +0 -56
  420. package/src/theme/system/v0/color/card.ts +0 -25
  421. package/src/theme/system/v0/color/color.ts +0 -51
  422. package/src/theme/system/v0/color/index.ts +0 -11
  423. package/src/theme/system/v0/color/input.ts +0 -40
  424. package/src/theme/system/v0/color/muted.ts +0 -37
  425. package/src/theme/system/v0/color/selectable.ts +0 -42
  426. package/src/theme/system/v0/color/solid.ts +0 -37
  427. package/src/theme/system/v0/color/spot.ts +0 -14
  428. package/src/theme/system/v0/index.ts +0 -3
  429. package/src/theme/system/v0/input.ts +0 -23
  430. package/src/theme/versioning/getTheme_v2.ts +0 -72
  431. package/src/theme/versioning/index.ts +0 -5
  432. package/src/theme/versioning/is_v0.ts +0 -6
  433. package/src/theme/versioning/is_v2.ts +0 -6
  434. package/src/theme/versioning/themeColor_v0_v2.ts +0 -250
  435. package/src/theme/versioning/themeColor_v2_v2_9.ts +0 -50
  436. package/src/theme/versioning/v0_v2.ts +0 -106
  437. 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