@cube-dev/ui-kit 0.0.0-canary-8dfe8a6 → 0.0.0-canary-143cd5a

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 (503) hide show
  1. package/es/_internal/hooks/index.js +1 -1
  2. package/es/_internal/hooks/use-chained-callback.js +1 -1
  3. package/es/_internal/hooks/use-debounced-value.js +1 -1
  4. package/es/_internal/hooks/use-deprecation-warning.js +1 -1
  5. package/es/_internal/hooks/use-effect-once.js +1 -1
  6. package/es/_internal/hooks/use-event.js +1 -1
  7. package/es/_internal/hooks/use-is-first-render.js +1 -1
  8. package/es/_internal/hooks/use-sync-ref.js +1 -1
  9. package/es/_internal/hooks/use-timer/index.js +1 -1
  10. package/es/_internal/hooks/use-timer/timer.js +1 -1
  11. package/es/_internal/hooks/use-timer/use-timer.js +1 -1
  12. package/es/_internal/hooks/use-update-effect.js +1 -1
  13. package/es/_internal/hooks/use-warn.js +1 -1
  14. package/es/_internal/index.js +1 -1
  15. package/es/components/Block.js +1 -1
  16. package/es/components/GlobalStyles.js +1 -1
  17. package/es/components/GridProvider.js +1 -1
  18. package/es/components/HiddenInput.js +1 -1
  19. package/es/components/Item.js +1 -1
  20. package/es/components/OpenTrasition.js +1 -1
  21. package/es/components/Root.js +1 -1
  22. package/es/components/actions/Action/Action.js +1 -1
  23. package/es/components/actions/Button/Button.js +1 -1
  24. package/es/components/actions/Button/index.js +1 -1
  25. package/es/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  26. package/es/components/actions/CommandMenu/CommandMenu.js +1 -1
  27. package/es/components/actions/CommandMenu/index.js +1 -1
  28. package/es/components/actions/CommandMenu/styled.js +1 -1
  29. package/es/components/actions/ItemAction/ItemAction.js +1 -1
  30. package/es/components/actions/ItemAction/index.js +1 -1
  31. package/es/components/actions/ItemButton/ItemButton.js +1 -1
  32. package/es/components/actions/ItemButton/index.js +1 -1
  33. package/es/components/actions/Link/Link.js +1 -1
  34. package/es/components/actions/Menu/Menu.js +1 -1
  35. package/es/components/actions/Menu/MenuItem.js +1 -1
  36. package/es/components/actions/Menu/MenuSection.js +1 -1
  37. package/es/components/actions/Menu/MenuTrigger.js +1 -1
  38. package/es/components/actions/Menu/SubMenuTrigger.js +1 -1
  39. package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  40. package/es/components/actions/Menu/context.js +1 -1
  41. package/es/components/actions/Menu/index.js +1 -1
  42. package/es/components/actions/Menu/styled.js +1 -1
  43. package/es/components/actions/index.js +1 -1
  44. package/es/components/actions/use-action.js +1 -1
  45. package/es/components/actions/use-anchored-menu.js +1 -1
  46. package/es/components/actions/use-context-menu.js +1 -1
  47. package/es/components/content/ActiveZone/ActiveZone.js +1 -1
  48. package/es/components/content/Alert/Alert.js +1 -1
  49. package/es/components/content/Alert/index.js +1 -1
  50. package/es/components/content/Alert/types.js +1 -1
  51. package/es/components/content/Alert/use-alert.js +1 -1
  52. package/es/components/content/Avatar/Avatar.js +1 -1
  53. package/es/components/content/Badge/Badge.js +1 -1
  54. package/es/components/content/Card/Card.js +1 -1
  55. package/es/components/content/Content.js +1 -1
  56. package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  57. package/es/components/content/CopyPasteBlock/index.js +1 -1
  58. package/es/components/content/CopySnippet/CopySnippet.js +1 -1
  59. package/es/components/content/CopySnippet/index.js +1 -1
  60. package/es/components/content/Divider.js +1 -1
  61. package/es/components/content/Footer.js +1 -1
  62. package/es/components/content/Header.js +1 -1
  63. package/es/components/content/HotKeys/HotKeys.js +1 -1
  64. package/es/components/content/HotKeys/index.js +1 -1
  65. package/es/components/content/ItemBase/ItemBase.js +1 -1
  66. package/es/components/content/ItemBase/index.js +1 -1
  67. package/es/components/content/List/SectionHeading.js +1 -1
  68. package/es/components/content/List/index.js +1 -1
  69. package/es/components/content/Paragraph.js +1 -1
  70. package/es/components/content/Placeholder/Placeholder.js +1 -1
  71. package/es/components/content/PrismCode/PrismCode.js +1 -1
  72. package/es/components/content/PrismCode/prismSetup.js +1 -1
  73. package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  74. package/es/components/content/Result/Result.js +1 -1
  75. package/es/components/content/Skeleton/Skeleton.js +1 -1
  76. package/es/components/content/Tag/Tag.js +1 -1
  77. package/es/components/content/Text.js +1 -1
  78. package/es/components/content/Title.js +1 -1
  79. package/es/components/fields/Checkbox/Checkbox.js +1 -1
  80. package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
  81. package/es/components/fields/Checkbox/context.js +1 -1
  82. package/es/components/fields/Checkbox/index.js +1 -1
  83. package/es/components/fields/ComboBox/ComboBox.js +548 -145
  84. package/es/components/fields/ComboBox/index.js +2 -2
  85. package/es/components/fields/DatePicker/DateInput.js +1 -1
  86. package/es/components/fields/DatePicker/DateInputBase.js +1 -1
  87. package/es/components/fields/DatePicker/DatePicker.js +1 -1
  88. package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
  89. package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
  90. package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
  91. package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
  92. package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
  93. package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  94. package/es/components/fields/DatePicker/TimeInput.js +1 -1
  95. package/es/components/fields/DatePicker/index.js +1 -1
  96. package/es/components/fields/DatePicker/intl.js +1 -1
  97. package/es/components/fields/DatePicker/parseDate.js +1 -1
  98. package/es/components/fields/DatePicker/props.js +1 -1
  99. package/es/components/fields/DatePicker/types.js +1 -1
  100. package/es/components/fields/DatePicker/utils.js +1 -1
  101. package/es/components/fields/FileInput/FileInput.js +1 -1
  102. package/es/components/fields/FilterListBox/FilterListBox.js +1 -1
  103. package/es/components/fields/FilterListBox/index.js +1 -1
  104. package/es/components/fields/FilterPicker/FilterPicker.js +1 -1
  105. package/es/components/fields/FilterPicker/index.js +1 -1
  106. package/es/components/fields/Input/Input.js +1 -1
  107. package/es/components/fields/Input/index.js +1 -1
  108. package/es/components/fields/LegacyComboBox/LegacyComboBox.js +290 -0
  109. package/es/components/fields/LegacyComboBox/index.js +10 -0
  110. package/es/components/fields/ListBox/ListBox.js +22 -4
  111. package/es/components/fields/ListBox/index.js +1 -1
  112. package/es/components/fields/NumberInput/NumberInput.js +1 -1
  113. package/es/components/fields/NumberInput/StepButton.js +1 -1
  114. package/es/components/fields/PasswordInput/PasswordInput.js +1 -1
  115. package/es/components/fields/RadioGroup/Radio.js +1 -1
  116. package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
  117. package/es/components/fields/RadioGroup/context.js +1 -1
  118. package/es/components/fields/RadioGroup/index.js +1 -1
  119. package/es/components/fields/SearchInput/SearchInput.js +1 -1
  120. package/es/components/fields/SearchInput/index.js +1 -1
  121. package/es/components/fields/Select/Select.js +1 -1
  122. package/es/components/fields/Select/index.js +1 -1
  123. package/es/components/fields/Slider/Gradation.js +1 -1
  124. package/es/components/fields/Slider/Header.js +1 -1
  125. package/es/components/fields/Slider/RangeSlider.js +1 -1
  126. package/es/components/fields/Slider/Slider.js +1 -1
  127. package/es/components/fields/Slider/SliderBase.js +1 -1
  128. package/es/components/fields/Slider/SliderInput.js +1 -1
  129. package/es/components/fields/Slider/SliderThumb.js +1 -1
  130. package/es/components/fields/Slider/SliderTrack.js +1 -1
  131. package/es/components/fields/Slider/elements.js +1 -1
  132. package/es/components/fields/Slider/index.js +1 -1
  133. package/es/components/fields/Slider/types.js +1 -1
  134. package/es/components/fields/Switch/Switch.js +1 -1
  135. package/es/components/fields/Switch/index.js +1 -1
  136. package/es/components/fields/TextArea/TextArea.js +1 -1
  137. package/es/components/fields/TextArea/index.js +1 -1
  138. package/es/components/fields/TextInput/TextInput.js +1 -1
  139. package/es/components/fields/TextInput/TextInputBase.js +1 -1
  140. package/es/components/fields/TextInput/index.js +1 -1
  141. package/es/components/fields/TextInputMapper/TextInputMapper.js +3 -3
  142. package/es/components/fields/TextInputMapper/index.js +1 -1
  143. package/es/components/fields/index.js +2 -1
  144. package/es/components/form/FieldWrapper/FieldWrapper.js +1 -1
  145. package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  146. package/es/components/form/FieldWrapper/index.js +1 -1
  147. package/es/components/form/FieldWrapper/types.js +1 -1
  148. package/es/components/form/Form/Field.js +1 -1
  149. package/es/components/form/Form/Form.js +1 -1
  150. package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
  151. package/es/components/form/Form/ResetButton/index.js +1 -1
  152. package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  153. package/es/components/form/Form/SubmitButton/index.js +1 -1
  154. package/es/components/form/Form/SubmitError.js +1 -1
  155. package/es/components/form/Form/index.js +1 -1
  156. package/es/components/form/Form/types.js +1 -1
  157. package/es/components/form/Form/use-field/index.js +1 -1
  158. package/es/components/form/Form/use-field/types.js +1 -1
  159. package/es/components/form/Form/use-field/use-field-props.js +1 -1
  160. package/es/components/form/Form/use-field/use-field.js +1 -1
  161. package/es/components/form/Form/use-form.js +1 -1
  162. package/es/components/form/Form/validation.js +1 -1
  163. package/es/components/form/Label.js +1 -1
  164. package/es/components/form/index.js +1 -1
  165. package/es/components/form/wrapper.js +1 -1
  166. package/es/components/layout/Flex.js +1 -1
  167. package/es/components/layout/Flow.js +1 -1
  168. package/es/components/layout/Grid.js +1 -1
  169. package/es/components/layout/Panel.js +1 -1
  170. package/es/components/layout/Prefix.js +1 -1
  171. package/es/components/layout/ResizablePanel.js +1 -1
  172. package/es/components/layout/Space.js +1 -1
  173. package/es/components/layout/Suffix.js +1 -1
  174. package/es/components/navigation/LegacyTabs/LegacyTabs.js +1 -1
  175. package/es/components/organisms/FileTabs/FileTabs.js +1 -1
  176. package/es/components/organisms/StatsCard/StatsCard.js +1 -1
  177. package/es/components/other/Base64Upload/Base64Upload.js +1 -1
  178. package/es/components/other/Calendar/Calendar.js +1 -1
  179. package/es/components/other/Calendar/CalendarCell.js +1 -1
  180. package/es/components/other/Calendar/CalendarGrid.js +1 -1
  181. package/es/components/other/Calendar/RangeCalendar.js +1 -1
  182. package/es/components/other/CloudLogo/CloudLogo.js +1 -1
  183. package/es/components/overlays/AlertDialog/AlertDialog.js +1 -1
  184. package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  185. package/es/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  186. package/es/components/overlays/AlertDialog/index.js +1 -1
  187. package/es/components/overlays/AlertDialog/types.js +1 -1
  188. package/es/components/overlays/Dialog/Dialog.js +1 -1
  189. package/es/components/overlays/Dialog/DialogContainer.js +1 -1
  190. package/es/components/overlays/Dialog/DialogForm.js +1 -1
  191. package/es/components/overlays/Dialog/DialogTrigger.js +1 -1
  192. package/es/components/overlays/Dialog/context.js +1 -1
  193. package/es/components/overlays/Dialog/index.js +1 -1
  194. package/es/components/overlays/Dialog/use-dialog-container.js +1 -1
  195. package/es/components/overlays/Modal/Modal.js +1 -1
  196. package/es/components/overlays/Modal/OpenTransition.js +1 -1
  197. package/es/components/overlays/Modal/Overlay.js +1 -1
  198. package/es/components/overlays/Modal/Popover.js +1 -1
  199. package/es/components/overlays/Modal/Tray.js +1 -1
  200. package/es/components/overlays/Modal/Underlay.js +1 -1
  201. package/es/components/overlays/Modal/index.js +1 -1
  202. package/es/components/overlays/Modal/types.js +1 -1
  203. package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +1 -1
  204. package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +1 -1
  205. package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +1 -1
  206. package/es/components/overlays/NewNotifications/Bar/index.js +1 -1
  207. package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogContext.js +1 -1
  208. package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +1 -1
  209. package/es/components/overlays/NewNotifications/Dialog/index.js +1 -1
  210. package/es/components/overlays/NewNotifications/Notification.js +1 -1
  211. package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +1 -1
  212. package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +1 -1
  213. package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +1 -1
  214. package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +1 -1
  215. package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +1 -1
  216. package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +1 -1
  217. package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
  218. package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +1 -1
  219. package/es/components/overlays/NewNotifications/NotificationView/index.js +1 -1
  220. package/es/components/overlays/NewNotifications/NotificationView/types.js +1 -1
  221. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +1 -1
  222. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +1 -1
  223. package/es/components/overlays/NewNotifications/NotificationsContext/index.js +1 -1
  224. package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +1 -1
  225. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +1 -1
  226. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +1 -1
  227. package/es/components/overlays/NewNotifications/NotificationsList/index.js +1 -1
  228. package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
  229. package/es/components/overlays/NewNotifications/hooks/index.js +1 -1
  230. package/es/components/overlays/NewNotifications/hooks/types.js +1 -1
  231. package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +1 -1
  232. package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +1 -1
  233. package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
  234. package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +1 -1
  235. package/es/components/overlays/NewNotifications/index.js +1 -1
  236. package/es/components/overlays/NewNotifications/types.js +1 -1
  237. package/es/components/overlays/Notification/Notification.js +1 -1
  238. package/es/components/overlays/OverlayWrapper.js +1 -1
  239. package/es/components/overlays/Toasts/Toast.js +1 -1
  240. package/es/components/overlays/Toasts/index.js +1 -1
  241. package/es/components/overlays/Toasts/types.js +1 -1
  242. package/es/components/overlays/Toasts/use-toasts-api.js +1 -1
  243. package/es/components/overlays/Tooltip/Tooltip.js +1 -1
  244. package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
  245. package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  246. package/es/components/overlays/Tooltip/context.js +1 -1
  247. package/es/components/overlays/Tooltip/index.js +1 -1
  248. package/es/components/portal/Portal.js +1 -1
  249. package/es/components/portal/PortalProvider.js +1 -1
  250. package/es/components/portal/index.js +1 -1
  251. package/es/components/portal/types.js +1 -1
  252. package/es/components/portal/usePortal.js +1 -1
  253. package/es/components/shared/InvalidIcon.js +1 -1
  254. package/es/components/shared/ValidIcon.js +1 -1
  255. package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  256. package/es/components/status/LoadingAnimation/index.js +1 -1
  257. package/es/components/status/Spin/Cube.js +1 -1
  258. package/es/components/status/Spin/InternalSpinner.js +1 -1
  259. package/es/components/status/Spin/Spin.js +1 -1
  260. package/es/components/status/Spin/SpinsContainer.js +1 -1
  261. package/es/components/status/Spin/index.js +1 -1
  262. package/es/components/status/Spin/types.js +1 -1
  263. package/es/components/status/index.js +1 -1
  264. package/es/data/item-themes.js +1 -1
  265. package/es/data/themes.js +1 -1
  266. package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
  267. package/es/icons/AdjustmentsIcon.js +1 -1
  268. package/es/icons/AiIcon.js +1 -1
  269. package/es/icons/AreaChartIcon.js +1 -1
  270. package/es/icons/BackwardIcon.js +1 -1
  271. package/es/icons/BarChartIcon.js +1 -1
  272. package/es/icons/BellFilledIcon.js +1 -1
  273. package/es/icons/BellIcon.js +1 -1
  274. package/es/icons/BooleanIcon.js +1 -1
  275. package/es/icons/CalendarEditIcon.js +1 -1
  276. package/es/icons/CalendarIcon.js +1 -1
  277. package/es/icons/CaretDownIcon.js +1 -1
  278. package/es/icons/CaretUpIcon.js +1 -1
  279. package/es/icons/ChartAreaStackedIcon.js +1 -1
  280. package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
  281. package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  282. package/es/icons/ChartBarGroupedIcon.js +1 -1
  283. package/es/icons/ChartBarHorizontalIcon.js +1 -1
  284. package/es/icons/ChartBarLineIcon.js +1 -1
  285. package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
  286. package/es/icons/ChartBarStackedIcon.js +1 -1
  287. package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  288. package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
  289. package/es/icons/ChartBoxPlot2Icon.js +1 -1
  290. package/es/icons/ChartBoxPlotIcon.js +1 -1
  291. package/es/icons/ChartBubbleIcon.js +1 -1
  292. package/es/icons/ChartDonut2Icon.js +1 -1
  293. package/es/icons/ChartFunnelIcon.js +1 -1
  294. package/es/icons/ChartHeatmapIcon.js +1 -1
  295. package/es/icons/ChartKPIIcon.js +1 -1
  296. package/es/icons/ChartPie2Icon.js +1 -1
  297. package/es/icons/ChartScatterIcon.js +1 -1
  298. package/es/icons/CheckCircleFilledIcon.js +1 -1
  299. package/es/icons/CheckCircleIcon.js +1 -1
  300. package/es/icons/CheckIcon.js +1 -1
  301. package/es/icons/CircleFilledIcon.js +1 -1
  302. package/es/icons/ClearIcon.js +1 -1
  303. package/es/icons/CloseCircleFilledIcon.js +1 -1
  304. package/es/icons/CloseCircleIcon.js +1 -1
  305. package/es/icons/CloseIcon.js +1 -1
  306. package/es/icons/CodeIcon.js +1 -1
  307. package/es/icons/CopyIcon.js +1 -1
  308. package/es/icons/CountIcon.js +1 -1
  309. package/es/icons/CubeIcon.js +1 -1
  310. package/es/icons/CurrencyDollarIcon.js +1 -1
  311. package/es/icons/DangerIcon.js +1 -1
  312. package/es/icons/DashboardIcon.js +1 -1
  313. package/es/icons/DatabaseIcon.js +1 -1
  314. package/es/icons/DecimalDecreaseIcon.js +1 -1
  315. package/es/icons/DecimalIncreaseIcon.js +1 -1
  316. package/es/icons/DirectionIcon.js +1 -1
  317. package/es/icons/DonutIcon.js +1 -1
  318. package/es/icons/DownIcon.js +1 -1
  319. package/es/icons/EditIcon.js +1 -1
  320. package/es/icons/ExclamationCircleFilledIcon.js +1 -1
  321. package/es/icons/ExclamationCircleIcon.js +1 -1
  322. package/es/icons/ExclamationIcon.js +1 -1
  323. package/es/icons/EyeIcon.js +1 -1
  324. package/es/icons/EyeInvisibleIcon.js +1 -1
  325. package/es/icons/FilterIcon.js +1 -1
  326. package/es/icons/FolderFilledIcon.js +1 -1
  327. package/es/icons/FolderIcon.js +1 -1
  328. package/es/icons/FolderOpenFilledIcon.js +1 -1
  329. package/es/icons/FolderOpenIcon.js +1 -1
  330. package/es/icons/ForwardIcon.js +1 -1
  331. package/es/icons/HierarchyIcon.js +1 -1
  332. package/es/icons/Icon.js +1 -1
  333. package/es/icons/InfoCircleIcon.js +1 -1
  334. package/es/icons/InfoIcon.js +1 -1
  335. package/es/icons/KeyIcon.js +1 -1
  336. package/es/icons/LeftIcon.js +1 -1
  337. package/es/icons/LineChartIcon.js +1 -1
  338. package/es/icons/LoadingIcon.js +1 -1
  339. package/es/icons/LockFilledIcon.js +1 -1
  340. package/es/icons/LockIcon.js +1 -1
  341. package/es/icons/MoreIcon.js +1 -1
  342. package/es/icons/NotAllowedIcon.js +1 -1
  343. package/es/icons/Number123Icon.js +1 -1
  344. package/es/icons/NumberIcon.js +1 -1
  345. package/es/icons/PauseCircleFilledIcon.js +1 -1
  346. package/es/icons/PauseCircleIcon.js +1 -1
  347. package/es/icons/PauseIcon.js +1 -1
  348. package/es/icons/PercentageIcon.js +1 -1
  349. package/es/icons/PieChartIcon.js +1 -1
  350. package/es/icons/PlayCircleIcon.js +1 -1
  351. package/es/icons/PlayIcon.js +1 -1
  352. package/es/icons/PlusIcon.js +1 -1
  353. package/es/icons/ReloadIcon.js +1 -1
  354. package/es/icons/ReportIcon.js +1 -1
  355. package/es/icons/ReturnIcon.js +1 -1
  356. package/es/icons/RightIcon.js +1 -1
  357. package/es/icons/SchemeIcon.js +1 -1
  358. package/es/icons/SearchIcon.js +1 -1
  359. package/es/icons/SettingsIcon.js +1 -1
  360. package/es/icons/ShieldFilledIcon.js +1 -1
  361. package/es/icons/ShieldIcon.js +1 -1
  362. package/es/icons/SlashIcon.js +1 -1
  363. package/es/icons/SparklesIcon.js +1 -1
  364. package/es/icons/SqlIcon.js +1 -1
  365. package/es/icons/StatsIcon.js +1 -1
  366. package/es/icons/StopIcon.js +1 -1
  367. package/es/icons/StringIcon.js +1 -1
  368. package/es/icons/SwitchIcon.js +1 -1
  369. package/es/icons/TableIcon.js +1 -1
  370. package/es/icons/ThumbsDownIcon.js +1 -1
  371. package/es/icons/ThumbsUpIcon.js +1 -1
  372. package/es/icons/ThunderboltCrossedIcon.js +1 -1
  373. package/es/icons/ThunderboltFilledIcon.js +1 -1
  374. package/es/icons/ThunderboltIcon.js +1 -1
  375. package/es/icons/TimeIcon.js +1 -1
  376. package/es/icons/UnlockIcon.js +1 -1
  377. package/es/icons/UpIcon.js +1 -1
  378. package/es/icons/UserGroupIcon.js +1 -1
  379. package/es/icons/UserIcon.js +1 -1
  380. package/es/icons/UserLockIcon.js +1 -1
  381. package/es/icons/ViewIcon.js +1 -1
  382. package/es/icons/WarningFilledIcon.js +1 -1
  383. package/es/icons/WarningIcon.js +1 -1
  384. package/es/icons/add-new-icon.js +1 -1
  385. package/es/icons/index.js +1 -1
  386. package/es/icons/wrap-icon.js +1 -1
  387. package/es/index.js +1 -1
  388. package/es/provider.js +1 -1
  389. package/es/providers/TrackingProvider.js +1 -1
  390. package/es/providers/navigation.types.js +1 -1
  391. package/es/providers/navigationAdapter.default.js +1 -1
  392. package/es/services/notification.js +1 -1
  393. package/es/shared/form.js +1 -1
  394. package/es/shared/index.js +1 -1
  395. package/es/stories/Form.legacy-stories.js +1 -1
  396. package/es/stories/FormFieldArgs.js +1 -1
  397. package/es/stories/Layout.stories.js +1 -1
  398. package/es/stories/Tasty.stories.js +1 -1
  399. package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
  400. package/es/stories/components/DialogFormApp.js +1 -1
  401. package/es/stories/components/StyledButton.js +1 -1
  402. package/es/stories/lists/baseProps.js +1 -1
  403. package/es/tasty/debug.js +1 -1
  404. package/es/tasty/index.js +1 -1
  405. package/es/tasty/injector/index.js +1 -1
  406. package/es/tasty/injector/injector.js +1 -1
  407. package/es/tasty/injector/sheet-manager.js +1 -1
  408. package/es/tasty/injector/types.js +1 -1
  409. package/es/tasty/parser/classify.js +1 -1
  410. package/es/tasty/parser/const.js +1 -1
  411. package/es/tasty/parser/lru.js +1 -1
  412. package/es/tasty/parser/parser.js +1 -1
  413. package/es/tasty/parser/tokenizer.js +1 -1
  414. package/es/tasty/parser/types.js +1 -1
  415. package/es/tasty/providers/BreakpointsProvider.js +1 -1
  416. package/es/tasty/styles/align.js +1 -1
  417. package/es/tasty/styles/border.js +1 -1
  418. package/es/tasty/styles/boxShadow.combinator.js +1 -1
  419. package/es/tasty/styles/color.js +1 -1
  420. package/es/tasty/styles/createStyle.js +1 -1
  421. package/es/tasty/styles/dimension.js +1 -1
  422. package/es/tasty/styles/display.js +1 -1
  423. package/es/tasty/styles/fade.js +1 -1
  424. package/es/tasty/styles/fill.js +1 -1
  425. package/es/tasty/styles/flow.js +1 -1
  426. package/es/tasty/styles/font.js +1 -1
  427. package/es/tasty/styles/fontStyle.js +1 -1
  428. package/es/tasty/styles/gap.js +1 -1
  429. package/es/tasty/styles/groupRadius.js +1 -1
  430. package/es/tasty/styles/height.js +1 -1
  431. package/es/tasty/styles/index.js +1 -1
  432. package/es/tasty/styles/inset.js +1 -1
  433. package/es/tasty/styles/justify.js +1 -1
  434. package/es/tasty/styles/list.js +1 -1
  435. package/es/tasty/styles/margin.js +1 -1
  436. package/es/tasty/styles/outline.js +1 -1
  437. package/es/tasty/styles/padding.js +1 -1
  438. package/es/tasty/styles/place.js +1 -1
  439. package/es/tasty/styles/predefined.js +1 -1
  440. package/es/tasty/styles/preset.js +1 -1
  441. package/es/tasty/styles/radius.js +1 -1
  442. package/es/tasty/styles/reset.js +1 -1
  443. package/es/tasty/styles/scrollbar.js +1 -1
  444. package/es/tasty/styles/shadow.js +1 -1
  445. package/es/tasty/styles/styledScrollbar.js +1 -1
  446. package/es/tasty/styles/transition.js +1 -1
  447. package/es/tasty/styles/types.js +1 -1
  448. package/es/tasty/styles/width.js +1 -1
  449. package/es/tasty/tasty.js +1 -1
  450. package/es/tasty/types.js +1 -1
  451. package/es/tasty/utils/cache-wrapper.js +1 -1
  452. package/es/tasty/utils/case-converter.js +1 -1
  453. package/es/tasty/utils/colors.js +1 -1
  454. package/es/tasty/utils/dotize.js +1 -1
  455. package/es/tasty/utils/filterBaseProps.js +1 -1
  456. package/es/tasty/utils/getDisplayName.js +1 -1
  457. package/es/tasty/utils/getModCombinations.js +1 -1
  458. package/es/tasty/utils/isDevEnv.js +1 -1
  459. package/es/tasty/utils/mergeStyles.js +1 -1
  460. package/es/tasty/utils/modAttrs.js +1 -1
  461. package/es/tasty/utils/renderStyles.js +1 -1
  462. package/es/tasty/utils/responsive.js +1 -1
  463. package/es/tasty/utils/string.js +1 -1
  464. package/es/tasty/utils/styles.js +1 -1
  465. package/es/tasty/utils/warnings.js +1 -1
  466. package/es/tokens.js +1 -1
  467. package/es/type-checks.js +1 -1
  468. package/es/utils/ResizeSensor.js +1 -1
  469. package/es/utils/modules.js +1 -1
  470. package/es/utils/promise.js +1 -1
  471. package/es/utils/random.js +1 -1
  472. package/es/utils/range.js +1 -1
  473. package/es/utils/react/Slots.js +1 -1
  474. package/es/utils/react/chain.js +1 -1
  475. package/es/utils/react/forwardRefWithGenerics.js +1 -1
  476. package/es/utils/react/index.js +1 -1
  477. package/es/utils/react/interactions.js +1 -1
  478. package/es/utils/react/isTextOnly.js +1 -1
  479. package/es/utils/react/mapProps.js +1 -1
  480. package/es/utils/react/mergeProps.js +1 -1
  481. package/es/utils/react/nullableValue.js +1 -1
  482. package/es/utils/react/sharedStore.js +1 -1
  483. package/es/utils/react/useCombinedRefs.js +1 -1
  484. package/es/utils/react/useControlledFocusVisible.js +1 -1
  485. package/es/utils/react/useEventBus.js +1 -1
  486. package/es/utils/react/useId.js +1 -1
  487. package/es/utils/react/useIsDarwin.js +1 -1
  488. package/es/utils/react/useKeySymbols.js +1 -1
  489. package/es/utils/react/useLayoutEffect.js +1 -1
  490. package/es/utils/react/useQaProps.js +1 -1
  491. package/es/utils/react/useViewportSize.js +1 -1
  492. package/es/utils/react/wrapNodeIfPlain.js +1 -1
  493. package/es/utils/transitions.js +1 -1
  494. package/es/utils/tree.js +1 -1
  495. package/es/utils/warnings.js +1 -1
  496. package/es/version.js +2 -2
  497. package/package.json +1 -1
  498. package/types/components/fields/ComboBox/ComboBox.d.ts +93 -30
  499. package/types/components/fields/ComboBox/index.d.ts +2 -1
  500. package/types/components/fields/LegacyComboBox/LegacyComboBox.d.ts +49 -0
  501. package/types/components/fields/LegacyComboBox/index.d.ts +1 -0
  502. package/types/components/fields/ListBox/ListBox.d.ts +5 -0
  503. package/types/components/fields/index.d.ts +1 -0
@@ -1,15 +1,15 @@
1
1
  /**
2
2
  * @license MIT
3
3
  * author: Cube Dev Team
4
- * @cube-dev/ui-kit v0.0.0-canary-8dfe8a6
4
+ * @cube-dev/ui-kit v0.0.0-canary-143cd5a
5
5
  * Released under the MIT license.
6
6
  */
7
7
 
8
8
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
9
- import { cloneElement, forwardRef, useEffect, useMemo, } from 'react';
10
- import { useButton, useComboBox, useFilter, useHover, useOverlayPosition, } from 'react-aria';
11
- import { Section as BaseSection, useComboBoxState } from 'react-stately';
12
- import { useEvent } from '../../../_internal/index';
9
+ import React, { Children, cloneElement, forwardRef, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
10
+ import { useFilter, useKeyboard, useOverlay, useOverlayPosition, } from 'react-aria';
11
+ import { Section as BaseSection, Item } from 'react-stately';
12
+ import { useEvent } from '../../../_internal';
13
13
  import { CloseIcon, DownIcon, LoadingIcon } from '../../../icons';
14
14
  import { useProviderProps } from '../../../provider';
15
15
  import { BASE_STYLES, COLOR_STYLES, extractStyles, OUTER_STYLES, tasty, } from '../../../tasty';
@@ -19,12 +19,11 @@ import { useFocus } from '../../../utils/react/interactions';
19
19
  import { useEventBus } from '../../../utils/react/useEventBus';
20
20
  import { ItemAction } from '../../actions';
21
21
  import { useFieldProps, useFormProps, wrapWithField } from '../../form';
22
- import { Item } from '../../Item';
23
22
  import { OverlayWrapper } from '../../overlays/OverlayWrapper';
24
23
  import { InvalidIcon } from '../../shared/InvalidIcon';
25
24
  import { ValidIcon } from '../../shared/ValidIcon';
26
- import { DEFAULT_INPUT_STYLES, INPUT_WRAPPER_STYLES } from '../index';
27
- import { ListBoxPopup } from '../Select';
25
+ import { ListBox } from '../ListBox/ListBox';
26
+ import { DEFAULT_INPUT_STYLES, INPUT_WRAPPER_STYLES, } from '../TextInput/TextInputBase';
28
27
  const ComboBoxWrapperElement = tasty({
29
28
  styles: INPUT_WRAPPER_STYLES,
30
29
  });
@@ -62,7 +61,320 @@ const TriggerElement = tasty({
62
61
  cursor: 'pointer',
63
62
  },
64
63
  });
64
+ const ComboBoxOverlayElement = tasty({
65
+ qa: 'ComboBoxOverlay',
66
+ styles: {
67
+ display: 'grid',
68
+ gridRows: '1sf',
69
+ width: '30x max-content 50vw',
70
+ maxHeight: '50vh',
71
+ overflow: 'auto',
72
+ background: '#white',
73
+ radius: '1cr',
74
+ shadow: '0px .5x 2x #shadow',
75
+ padding: '0',
76
+ border: '#dark.08',
77
+ outline: '#purple-03.0',
78
+ },
79
+ });
65
80
  const PROP_STYLES = [...BASE_STYLES, ...OUTER_STYLES, ...COLOR_STYLES];
81
+ function useComboBoxState({ selectedKey, defaultSelectedKey, inputValue, comboBoxId, }) {
82
+ // Get event bus for menu synchronization
83
+ const { emit, on } = useEventBus();
84
+ // Internal state for uncontrolled mode
85
+ const [internalSelectedKey, setInternalSelectedKey] = useState(defaultSelectedKey ?? null);
86
+ const [internalInputValue, setInternalInputValue] = useState('');
87
+ const isControlledKey = selectedKey !== undefined;
88
+ const isControlledInput = inputValue !== undefined;
89
+ const effectiveSelectedKey = isControlledKey
90
+ ? selectedKey
91
+ : internalSelectedKey;
92
+ const effectiveInputValue = isControlledInput
93
+ ? inputValue
94
+ : internalInputValue;
95
+ // Popover state
96
+ const [isPopoverOpen, setIsPopoverOpen] = useState(false);
97
+ // Listen for other menus opening and close this one if needed
98
+ useEffect(() => {
99
+ const unsubscribe = on('popover:open', (data) => {
100
+ if (data.menuId !== comboBoxId && isPopoverOpen) {
101
+ setIsPopoverOpen(false);
102
+ }
103
+ });
104
+ return unsubscribe;
105
+ }, [on, comboBoxId, isPopoverOpen]);
106
+ // Emit event when this combobox opens
107
+ useEffect(() => {
108
+ if (isPopoverOpen) {
109
+ emit('popover:open', { menuId: comboBoxId });
110
+ }
111
+ }, [isPopoverOpen, emit, comboBoxId]);
112
+ return {
113
+ effectiveSelectedKey,
114
+ effectiveInputValue,
115
+ isPopoverOpen,
116
+ setIsPopoverOpen,
117
+ setInternalSelectedKey,
118
+ setInternalInputValue,
119
+ isControlledKey,
120
+ isControlledInput,
121
+ };
122
+ }
123
+ function useComboBoxFiltering({ children, effectiveInputValue, filter, }) {
124
+ const [isFilterActive, setIsFilterActive] = useState(false);
125
+ const { contains } = useFilter({ sensitivity: 'base' });
126
+ const textFilterFn = useMemo(() => (filter === false ? () => true : filter || contains), [filter, contains]);
127
+ // Filter children based on input value
128
+ const filteredChildren = useMemo(() => {
129
+ const term = effectiveInputValue.trim();
130
+ if (!isFilterActive || !term || !children) {
131
+ return children;
132
+ }
133
+ const nodeMatches = (node) => {
134
+ if (!node?.props)
135
+ return false;
136
+ const textValue = node.props.textValue ||
137
+ (typeof node.props.children === 'string' ? node.props.children : '') ||
138
+ String(node.props.children || '');
139
+ return textFilterFn(textValue, term);
140
+ };
141
+ const filterChildren = (childNodes) => {
142
+ if (!childNodes)
143
+ return null;
144
+ const childArray = Array.isArray(childNodes) ? childNodes : [childNodes];
145
+ const filteredNodes = [];
146
+ childArray.forEach((child) => {
147
+ if (!child || typeof child !== 'object') {
148
+ return;
149
+ }
150
+ if (child.type === BaseSection ||
151
+ child.type?.displayName === 'Section') {
152
+ const sectionChildren = Array.isArray(child.props.children)
153
+ ? child.props.children
154
+ : [child.props.children];
155
+ const filteredSectionChildren = sectionChildren.filter((sectionChild) => {
156
+ return (sectionChild &&
157
+ typeof sectionChild === 'object' &&
158
+ nodeMatches(sectionChild));
159
+ });
160
+ if (filteredSectionChildren.length > 0) {
161
+ filteredNodes.push(cloneElement(child, {
162
+ key: child.key,
163
+ children: filteredSectionChildren,
164
+ }));
165
+ }
166
+ }
167
+ else if (child.type === Item) {
168
+ if (nodeMatches(child)) {
169
+ filteredNodes.push(child);
170
+ }
171
+ }
172
+ else if (nodeMatches(child)) {
173
+ filteredNodes.push(child);
174
+ }
175
+ });
176
+ return filteredNodes;
177
+ };
178
+ return filterChildren(children);
179
+ }, [isFilterActive, children, effectiveInputValue, textFilterFn]);
180
+ return {
181
+ filteredChildren,
182
+ isFilterActive,
183
+ setIsFilterActive,
184
+ };
185
+ }
186
+ function useComboBoxKeyboard({ isPopoverOpen, listStateRef, hasResults, allowsCustomValue, effectiveInputValue, isClearable, onSelectionChange, onClearValue, onOpenPopover, onClosePopover, inputRef, }) {
187
+ const { keyboardProps } = useKeyboard({
188
+ onKeyDown: (e) => {
189
+ if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
190
+ e.preventDefault();
191
+ // Open popover if closed
192
+ if (!isPopoverOpen) {
193
+ onOpenPopover();
194
+ return;
195
+ }
196
+ const listState = listStateRef.current;
197
+ if (!listState)
198
+ return;
199
+ const { selectionManager, collection, disabledKeys } = listState;
200
+ // Helper to collect visible item keys (supports sections)
201
+ const collectVisibleKeys = (nodes, out) => {
202
+ for (const node of nodes) {
203
+ if (node.type === 'item') {
204
+ if (!disabledKeys?.has(node.key)) {
205
+ out.push(node.key);
206
+ }
207
+ }
208
+ else if (node.childNodes) {
209
+ collectVisibleKeys(node.childNodes, out);
210
+ }
211
+ }
212
+ };
213
+ const visibleKeys = [];
214
+ collectVisibleKeys(collection, visibleKeys);
215
+ if (visibleKeys.length === 0)
216
+ return;
217
+ const isArrowDown = e.key === 'ArrowDown';
218
+ const currentKey = selectionManager.focusedKey;
219
+ let nextKey = null;
220
+ if (currentKey == null) {
221
+ nextKey = isArrowDown
222
+ ? visibleKeys[0]
223
+ : visibleKeys[visibleKeys.length - 1];
224
+ }
225
+ else {
226
+ const currentIndex = visibleKeys.indexOf(currentKey);
227
+ if (currentIndex !== -1) {
228
+ const newIndex = currentIndex + (isArrowDown ? 1 : -1);
229
+ if (newIndex >= 0 && newIndex < visibleKeys.length) {
230
+ nextKey = visibleKeys[newIndex];
231
+ }
232
+ }
233
+ else {
234
+ nextKey = isArrowDown
235
+ ? visibleKeys[0]
236
+ : visibleKeys[visibleKeys.length - 1];
237
+ }
238
+ }
239
+ if (nextKey != null) {
240
+ if (listState.lastFocusSourceRef) {
241
+ listState.lastFocusSourceRef.current = 'keyboard';
242
+ }
243
+ selectionManager.setFocusedKey(nextKey);
244
+ }
245
+ }
246
+ else if (e.key === 'Enter') {
247
+ if (!hasResults) {
248
+ e.preventDefault();
249
+ if (allowsCustomValue) {
250
+ const value = effectiveInputValue;
251
+ onSelectionChange(value ?? null);
252
+ }
253
+ else {
254
+ onSelectionChange(null);
255
+ }
256
+ return;
257
+ }
258
+ if (isPopoverOpen) {
259
+ const listState = listStateRef.current;
260
+ if (!listState)
261
+ return;
262
+ const keyToSelect = listState.selectionManager.focusedKey;
263
+ if (keyToSelect != null) {
264
+ e.preventDefault();
265
+ listState.selectionManager.select(keyToSelect, e);
266
+ // Ensure the popover closes even if selection stays the same
267
+ onClosePopover();
268
+ setTimeout(() => inputRef.current?.focus(), 0);
269
+ }
270
+ }
271
+ }
272
+ else if (e.key === 'Escape') {
273
+ if (isPopoverOpen) {
274
+ e.preventDefault();
275
+ onClosePopover();
276
+ inputRef.current?.focus();
277
+ }
278
+ else if (effectiveInputValue && isClearable) {
279
+ e.preventDefault();
280
+ onClearValue();
281
+ }
282
+ }
283
+ else if (e.key === 'Home' || e.key === 'End') {
284
+ if (isPopoverOpen) {
285
+ e.preventDefault();
286
+ const listState = listStateRef.current;
287
+ if (!listState)
288
+ return;
289
+ const { selectionManager, collection, disabledKeys } = listState;
290
+ // Helper to collect visible item keys (supports sections)
291
+ const collectVisibleKeys = (nodes, out) => {
292
+ for (const node of nodes) {
293
+ if (node.type === 'item') {
294
+ if (!disabledKeys?.has(node.key)) {
295
+ out.push(node.key);
296
+ }
297
+ }
298
+ else if (node.childNodes) {
299
+ collectVisibleKeys(node.childNodes, out);
300
+ }
301
+ }
302
+ };
303
+ const visibleKeys = [];
304
+ collectVisibleKeys(collection, visibleKeys);
305
+ if (visibleKeys.length === 0)
306
+ return;
307
+ const targetKey = e.key === 'Home'
308
+ ? visibleKeys[0]
309
+ : visibleKeys[visibleKeys.length - 1];
310
+ if (listState.lastFocusSourceRef) {
311
+ listState.lastFocusSourceRef.current = 'keyboard';
312
+ }
313
+ selectionManager.setFocusedKey(targetKey);
314
+ }
315
+ }
316
+ },
317
+ });
318
+ return { keyboardProps };
319
+ }
320
+ const ComboBoxInput = forwardRef(function ComboBoxInput({ inputRef, value, placeholder, isDisabled, isReadOnly, autoFocus, size, mods, inputStyles, keyboardProps, focusProps, onChange, onFocus, isPopoverOpen, hasResults, comboBoxId, listStateRef, }, ref) {
321
+ const combinedRef = useCombinedRefs(ref, inputRef);
322
+ return (_jsx(InputElement, { ref: combinedRef, qa: "Input", type: "text", value: value, placeholder: placeholder, disabled: isDisabled, readOnly: isReadOnly, autoFocus: autoFocus, "data-autofocus": autoFocus ? '' : undefined, onChange: onChange, onFocus: onFocus, onBlur: focusProps.onBlur, ...keyboardProps, styles: inputStyles, mods: mods, "data-size": size, role: "combobox", "aria-expanded": isPopoverOpen && hasResults, "aria-haspopup": "listbox", "aria-controls": isPopoverOpen && hasResults
323
+ ? `ComboBoxListBox-${comboBoxId}`
324
+ : undefined, "aria-activedescendant": isPopoverOpen &&
325
+ hasResults &&
326
+ listStateRef.current?.selectionManager.focusedKey != null
327
+ ? `ListBoxItem-${listStateRef.current?.selectionManager.focusedKey}`
328
+ : undefined }));
329
+ });
330
+ function ComboBoxOverlay({ isOpen, triggerRef, popoverRef, listBoxRef, direction, shouldFlip, overlayOffset, comboBoxWidth, comboBoxId, overlayStyles, listBoxStyles, optionStyles, sectionStyles, headingStyles, effectiveSelectedKey, isDisabled, disabledKeys, items, children, listStateRef, onSelectionChange, onClose, label, ariaLabel, }) {
331
+ // Overlay positioning
332
+ const { overlayProps: overlayPositionProps, placement, updatePosition, } = useOverlayPosition({
333
+ targetRef: triggerRef,
334
+ overlayRef: popoverRef,
335
+ placement: `${direction} start`,
336
+ shouldFlip,
337
+ isOpen,
338
+ offset: overlayOffset,
339
+ });
340
+ // Overlay behavior (dismiss on outside click, escape)
341
+ const { overlayProps: overlayBehaviorProps } = useOverlay({
342
+ onClose,
343
+ shouldCloseOnBlur: true,
344
+ isOpen,
345
+ isDismissable: true,
346
+ shouldCloseOnInteractOutside: (el) => {
347
+ const menuTriggerEl = el.closest('[data-popover-trigger]');
348
+ if (!menuTriggerEl)
349
+ return true;
350
+ if (menuTriggerEl === triggerRef?.current)
351
+ return true;
352
+ return false;
353
+ },
354
+ }, popoverRef);
355
+ // Update position when overlay opens
356
+ useLayoutEffect(() => {
357
+ if (isOpen) {
358
+ // Use double RAF to ensure layout is complete before positioning
359
+ requestAnimationFrame(() => {
360
+ requestAnimationFrame(() => {
361
+ updatePosition?.();
362
+ });
363
+ });
364
+ }
365
+ }, [isOpen, updatePosition]);
366
+ if (!isOpen)
367
+ return null;
368
+ return (_jsx(OverlayWrapper, { isOpen: true, placement: placement, children: _jsx(ComboBoxOverlayElement, { ...mergeProps(overlayPositionProps, overlayBehaviorProps), ref: popoverRef, styles: overlayStyles, style: {
369
+ minWidth: comboBoxWidth ? `${comboBoxWidth}px` : undefined,
370
+ ...overlayPositionProps.style,
371
+ }, children: _jsx(ListBox, { ref: listBoxRef, focusOnHover: true, disableSelectionToggle: true, id: `ComboBoxListBox-${comboBoxId}`, "aria-label": ariaLabel || (typeof label === 'string' ? label : 'Options'), selectedKey: effectiveSelectedKey, selectionMode: "single", isDisabled: isDisabled, disabledKeys: disabledKeys, shouldUseVirtualFocus: true, items: items, styles: listBoxStyles, optionStyles: optionStyles, sectionStyles: sectionStyles, headingStyles: headingStyles, stateRef: listStateRef, mods: {
372
+ popover: true,
373
+ }, onSelectionChange: onSelectionChange, children: children }) }) }));
374
+ }
375
+ // ============================================================================
376
+ // Main Component: ComboBox
377
+ // ============================================================================
66
378
  export const ComboBox = forwardRef(function ComboBox(props, ref) {
67
379
  props = useProviderProps(props);
68
380
  props = useFormProps(props);
@@ -86,37 +398,16 @@ export const ComboBox = forwardRef(function ComboBox(props, ref) {
86
398
  };
87
399
  },
88
400
  });
89
- let { qa, label, extra, labelStyles, isRequired, necessityIndicator, validationState, icon, prefix, isDisabled, multiLine, autoFocus, wrapperRef, inputRef, triggerRef, popoverRef, listBoxRef, isLoading, loadingIndicator, overlayOffset = 8, inputStyles, optionStyles, triggerStyles, listBoxStyles, overlayStyles, wrapperStyles, suffix, hideTrigger, message, description, size = 'medium', autoComplete = 'off', direction = 'bottom', shouldFlip = true, menuTrigger = 'input', suffixPosition = 'before', loadingState, filter, styles, labelSuffix, selectedKey, defaultSelectedKey, isClearable, ...otherProps } = props;
90
- let isAsync = loadingState != null;
91
- let { contains } = useFilter({ sensitivity: 'base' });
92
- let comboBoxStateProps = {
93
- ...props,
94
- defaultFilter: filter || contains,
95
- filter: undefined,
96
- allowsEmptyCollection: isAsync,
97
- menuTrigger,
98
- };
99
- let state = useComboBoxState(comboBoxStateProps);
401
+ let { qa, label, extra, labelStyles, isRequired, necessityIndicator, validationState, icon, prefix, isDisabled, autoFocus, wrapperRef, inputRef, triggerRef, popoverRef, listBoxRef, isLoading, inputStyles, optionStyles, triggerStyles, listBoxStyles, overlayStyles, wrapperStyles, suffix, hideTrigger, message, description, size = 'medium', direction = 'bottom', shouldFlip = true, popoverTrigger = 'input', suffixPosition = 'before', filter, styles, labelSuffix, selectedKey, defaultSelectedKey, inputValue, onInputChange, isClearable, onClear, placeholder, allowsCustomValue, emptyLabel, items, children: renderChildren, customValueProps, newCustomValueProps, sectionStyles, headingStyles, isReadOnly, overlayOffset = 8, onSelectionChange: externalOnSelectionChange, ...otherProps } = props;
100
402
  // Generate a unique ID for this combobox instance
101
403
  const comboBoxId = useMemo(() => generateRandomId(), []);
102
- // Get event bus for menu synchronization
103
- const { emit, on } = useEventBus();
104
- // Listen for other menus opening and close this one if needed
105
- useEffect(() => {
106
- const unsubscribe = on('popover:open', (data) => {
107
- // If another menu is opening and this combobox is open, close this one
108
- if (data.menuId !== comboBoxId && state.isOpen) {
109
- state.close();
110
- }
111
- });
112
- return unsubscribe;
113
- }, [on, comboBoxId, state]);
114
- // Emit event when this combobox opens
115
- useEffect(() => {
116
- if (state.isOpen) {
117
- emit('popover:open', { menuId: comboBoxId });
118
- }
119
- }, [state.isOpen, emit, comboBoxId]);
404
+ // State management hook
405
+ const { effectiveSelectedKey, effectiveInputValue, isPopoverOpen, setIsPopoverOpen, setInternalSelectedKey, setInternalInputValue, isControlledKey, isControlledInput, } = useComboBoxState({
406
+ selectedKey,
407
+ defaultSelectedKey,
408
+ inputValue,
409
+ comboBoxId,
410
+ });
120
411
  styles = extractStyles(otherProps, PROP_STYLES, styles);
121
412
  ref = useCombinedRefs(ref);
122
413
  wrapperRef = useCombinedRefs(wrapperRef);
@@ -124,62 +415,171 @@ export const ComboBox = forwardRef(function ComboBox(props, ref) {
124
415
  triggerRef = useCombinedRefs(triggerRef);
125
416
  popoverRef = useCombinedRefs(popoverRef);
126
417
  listBoxRef = useCombinedRefs(listBoxRef);
127
- let { overlayProps, placement, updatePosition } = useOverlayPosition({
128
- targetRef: triggerRef,
129
- overlayRef: popoverRef,
130
- scrollRef: listBoxRef,
131
- placement: `${direction} end`,
132
- shouldFlip: shouldFlip,
133
- isOpen: state.isOpen,
134
- onClose: state.close,
135
- offset: overlayOffset,
136
- });
137
- let { labelProps, inputProps, listBoxProps, buttonProps: triggerProps, } = useComboBox({
138
- ...comboBoxStateProps,
139
- inputRef,
140
- buttonRef: triggerRef,
141
- listBoxRef,
142
- popoverRef,
143
- menuTrigger,
144
- }, state);
145
- let { isFocused, focusProps } = useFocus({ isDisabled });
146
- let { hoverProps, isHovered } = useHover({ isDisabled });
147
- // Get props for the button based on the trigger props from useComboBox
148
- let { buttonProps, isPressed: isTriggerPressed } = useButton(triggerProps, triggerRef);
149
- let { hoverProps: triggerHoverProps, isHovered: isTriggerHovered } = useHover({ isDisabled });
150
- let { focusProps: triggerFocusProps, isFocused: isTriggerFocused } = useFocus({ isDisabled }, true);
151
- useLayoutEffect(() => {
152
- if (state.isOpen) {
153
- updatePosition();
418
+ // Preserve the original `children` (may be a render function) before we
419
+ // potentially overwrite it.
420
+ let children = renderChildren;
421
+ const renderFn = renderChildren;
422
+ if (items && typeof renderFn === 'function') {
423
+ try {
424
+ const itemsArray = Array.from(items);
425
+ children = itemsArray.map((item, idx) => {
426
+ const rendered = renderFn(item);
427
+ if (React.isValidElement(rendered) &&
428
+ rendered.key == null) {
429
+ return React.cloneElement(rendered, {
430
+ key: rendered?.key ?? item?.key ?? idx,
431
+ });
432
+ }
433
+ return rendered;
434
+ });
435
+ }
436
+ catch {
437
+ // If conversion fails, proceed with the original children
154
438
  }
155
- }, [state.isOpen, state.collection.size]);
439
+ }
440
+ // Filtering hook
441
+ const { filteredChildren, isFilterActive, setIsFilterActive } = useComboBoxFiltering({
442
+ children,
443
+ effectiveInputValue,
444
+ filter,
445
+ });
446
+ const { isFocused, focusProps } = useFocus({ isDisabled });
156
447
  let isInvalid = validationState === 'invalid';
157
448
  let validationIcon = isInvalid ? InvalidIcon : ValidIcon;
158
449
  let validation = cloneElement(validationIcon);
450
+ // Ref to access internal ListBox state
451
+ const listStateRef = useRef(null);
452
+ const focusInitAttemptsRef = useRef(0);
453
+ // Find item by key to get its label
454
+ const findItemByKey = useCallback((key) => {
455
+ let foundItem = null;
456
+ const traverse = (nodes) => {
457
+ Children.forEach(nodes, (child) => {
458
+ if (!child || typeof child !== 'object')
459
+ return;
460
+ if (child.type === Item && String(child.key) === String(key)) {
461
+ foundItem = child;
462
+ }
463
+ if (child.props?.children) {
464
+ traverse(child.props.children);
465
+ }
466
+ });
467
+ };
468
+ if (children)
469
+ traverse(children);
470
+ return foundItem;
471
+ }, [children]);
472
+ // Selection change handler
473
+ const handleSelectionChange = useEvent((selection) => {
474
+ // Extract single key from selection (we only support single selection)
475
+ const key = Array.isArray(selection) ? selection[0] : selection;
476
+ // Update selected key
477
+ if (!isControlledKey) {
478
+ setInternalSelectedKey(key ?? null);
479
+ }
480
+ // Update input value to show selected item label
481
+ if (key != null) {
482
+ setIsFilterActive(false);
483
+ const selectedItem = findItemByKey(key);
484
+ const label = selectedItem?.props?.textValue ||
485
+ (typeof selectedItem?.props?.children === 'string'
486
+ ? selectedItem.props.children
487
+ : '') ||
488
+ String(key);
489
+ if (!isControlledInput) {
490
+ setInternalInputValue(label);
491
+ }
492
+ onInputChange?.(label);
493
+ }
494
+ else {
495
+ // Clear input when selection is cleared
496
+ if (!isControlledInput) {
497
+ setInternalInputValue('');
498
+ }
499
+ onInputChange?.('');
500
+ setIsFilterActive(false);
501
+ }
502
+ externalOnSelectionChange?.(key);
503
+ // Close popover after selection
504
+ setIsPopoverOpen(false);
505
+ // Focus input
506
+ setTimeout(() => {
507
+ inputRef.current?.focus();
508
+ }, 0);
509
+ });
510
+ // Input change handler
511
+ const handleInputChange = useEvent((e) => {
512
+ const value = e.target.value;
513
+ // Update input value
514
+ if (!isControlledInput) {
515
+ setInternalInputValue(value);
516
+ }
517
+ onInputChange?.(value);
518
+ const trimmed = value.trim();
519
+ setIsFilterActive(trimmed.length > 0);
520
+ // Clear selection when input changes
521
+ if (effectiveSelectedKey != null) {
522
+ if (!isControlledKey) {
523
+ setInternalSelectedKey(null);
524
+ }
525
+ externalOnSelectionChange?.(null);
526
+ }
527
+ // Open popover based on trigger
528
+ if (popoverTrigger === 'input' && value && !isPopoverOpen) {
529
+ setIsPopoverOpen(true);
530
+ }
531
+ });
532
+ // Input focus handler
533
+ const handleInputFocus = useEvent((e) => {
534
+ // Call focus props handler if it exists
535
+ focusProps.onFocus?.(e);
536
+ if (popoverTrigger === 'focus' && !isPopoverOpen) {
537
+ setIsPopoverOpen(true);
538
+ }
539
+ });
159
540
  // Clear button logic
160
- let hasValue = props.allowsCustomValue
161
- ? state.inputValue !== ''
162
- : state.selectedKey != null;
163
- let showClearButton = isClearable && hasValue && !isDisabled && !props.isReadOnly;
541
+ let hasValue = allowsCustomValue
542
+ ? effectiveInputValue !== ''
543
+ : effectiveSelectedKey != null;
544
+ let showClearButton = isClearable && hasValue && !isDisabled && !isReadOnly;
545
+ const hasResults = Boolean(filteredChildren &&
546
+ (Array.isArray(filteredChildren)
547
+ ? filteredChildren.length > 0
548
+ : filteredChildren !== null));
164
549
  // Clear function
165
550
  let clearValue = useEvent(() => {
166
- // Always clear input value in state so UI resets to placeholder
167
- state.setInputValue('');
168
- // Notify external input value only when custom value mode is enabled
169
- if (props.allowsCustomValue) {
170
- props.onInputChange?.('');
551
+ // Clear input
552
+ if (!isControlledInput) {
553
+ setInternalInputValue('');
171
554
  }
172
- props.onSelectionChange?.(null);
173
- state.setSelectedKey(null);
174
- // Close the popup if it's open
175
- if (state.isOpen) {
176
- state.close();
555
+ onInputChange?.('');
556
+ // Clear selection
557
+ if (!isControlledKey) {
558
+ setInternalSelectedKey(null);
177
559
  }
178
- // Focus back to the input
560
+ externalOnSelectionChange?.(null);
561
+ // Close popover
562
+ if (isPopoverOpen) {
563
+ setIsPopoverOpen(false);
564
+ }
565
+ // Focus input
179
566
  inputRef.current?.focus();
180
- props.onClear?.();
567
+ onClear?.();
568
+ });
569
+ // Keyboard navigation hook
570
+ const { keyboardProps } = useComboBoxKeyboard({
571
+ isPopoverOpen,
572
+ listStateRef,
573
+ hasResults,
574
+ allowsCustomValue,
575
+ effectiveInputValue,
576
+ isClearable,
577
+ onSelectionChange: handleSelectionChange,
578
+ onClearValue: clearValue,
579
+ onOpenPopover: () => setIsPopoverOpen(true),
580
+ onClosePopover: () => setIsPopoverOpen(false),
581
+ inputRef,
181
582
  });
182
- let comboBoxWidth = wrapperRef?.current?.offsetWidth;
183
583
  if (icon) {
184
584
  icon = _jsx("div", { "data-element": "InputIcon", children: icon });
185
585
  if (prefix) {
@@ -193,7 +593,7 @@ export const ComboBox = forwardRef(function ComboBox(props, ref) {
193
593
  invalid: isInvalid,
194
594
  valid: validationState === 'valid',
195
595
  disabled: isDisabled,
196
- hovered: isHovered,
596
+ hovered: false,
197
597
  focused: isFocused,
198
598
  loading: isLoading,
199
599
  prefix: !!prefix,
@@ -203,84 +603,87 @@ export const ComboBox = forwardRef(function ComboBox(props, ref) {
203
603
  isInvalid,
204
604
  validationState,
205
605
  isDisabled,
206
- isHovered,
207
606
  isFocused,
208
607
  isLoading,
209
608
  prefix,
210
609
  showClearButton,
211
610
  ]);
212
- // If input is not full and the user presses Enter, pick the first option.
213
- let onKeyPress = useEvent((e) => {
214
- if (!props.onSelectionChange) {
215
- return;
611
+ const comboBoxWidth = wrapperRef?.current?.offsetWidth;
612
+ const shouldShowPopover = Boolean(isPopoverOpen && hasResults);
613
+ // Close popover if no results
614
+ useEffect(() => {
615
+ if (isPopoverOpen && !hasResults) {
616
+ setIsPopoverOpen(false);
216
617
  }
217
- if (e.key === 'Enter') {
218
- if (!props.allowsCustomValue) {
219
- if (state.isOpen) {
220
- // If there is a selected option then do nothing. It will be selected on Enter anyway.
221
- if (listBoxRef.current?.querySelector('li[aria-selected="true"]')) {
222
- return;
223
- }
224
- const option = [...state.collection][0]?.key;
225
- if (option && selectedKey !== option) {
226
- props.onSelectionChange?.(option);
227
- e.stopPropagation();
228
- e.preventDefault();
229
- }
618
+ }, [isPopoverOpen, hasResults]);
619
+ const ensureInitialFocus = useCallback(() => {
620
+ if (!shouldShowPopover)
621
+ return;
622
+ const listState = listStateRef.current;
623
+ if (!listState)
624
+ return;
625
+ const { selectionManager, collection, disabledKeys, lastFocusSourceRef } = listState;
626
+ if (!selectionManager || !collection)
627
+ return;
628
+ const collectFirstKey = () => {
629
+ for (const node of collection) {
630
+ if (node.type === 'item') {
631
+ if (!disabledKeys?.has(node.key))
632
+ return node.key;
230
633
  }
231
- else if (inputRef.current?.value &&
232
- ![...state.collection]
233
- .map((i) => i.textValue)
234
- .includes(inputRef.current?.value)) {
235
- // If the input value is not in the collection, we need to prevent the submitting of the form.
236
- // Also, we reset value manually.
237
- e.preventDefault();
238
- props.onSelectionChange?.(null);
634
+ else if (node.childNodes) {
635
+ for (const child of node.childNodes) {
636
+ if (child.type === 'item' && !disabledKeys?.has(child.key)) {
637
+ return child.key;
638
+ }
639
+ }
239
640
  }
240
- // If a custom value is allowed, we need to check if the input value is in the collection.
241
641
  }
242
- else if (props.allowsCustomValue) {
243
- const inputValue = inputRef?.current?.value;
244
- const item = [...state.collection].find((item) => item.textValue.toLowerCase() === inputValue?.toLowerCase());
245
- props.onSelectionChange?.(item ? item.key : inputRef?.current?.value ?? '');
246
- }
247
- }
248
- });
249
- let onBlur = useEvent((e) => {
250
- // If the input value is not in the collection, we need to reset the value.
251
- if (!props.allowsCustomValue &&
252
- inputRef.current?.value &&
253
- ![...state.collection]
254
- .map((i) => i.textValue)
255
- .includes(inputRef.current?.value)) {
256
- props.onSelectionChange?.(null);
642
+ return null;
643
+ };
644
+ if (lastFocusSourceRef)
645
+ lastFocusSourceRef.current = 'keyboard';
646
+ if (selectionManager.focusedKey == null) {
647
+ const keyToFocus = effectiveSelectedKey != null ? effectiveSelectedKey : collectFirstKey();
648
+ if (keyToFocus != null)
649
+ selectionManager.setFocusedKey(keyToFocus);
257
650
  }
258
- });
259
- useEffect(() => {
260
- inputRef.current?.addEventListener('keydown', onKeyPress, true);
261
- inputRef.current?.addEventListener('blur', onBlur, true);
262
- return () => {
263
- inputRef.current?.removeEventListener('keydown', onKeyPress, true);
264
- inputRef.current?.removeEventListener('blur', onBlur, true);
651
+ }, [shouldShowPopover, effectiveSelectedKey]);
652
+ useLayoutEffect(() => {
653
+ if (!shouldShowPopover)
654
+ return;
655
+ focusInitAttemptsRef.current = 0;
656
+ const tick = () => {
657
+ if (!shouldShowPopover)
658
+ return;
659
+ ensureInitialFocus();
660
+ focusInitAttemptsRef.current += 1;
661
+ // Try a few frames to wait for collection to mount
662
+ if (focusInitAttemptsRef.current < 8 &&
663
+ listStateRef.current?.selectionManager?.focusedKey == null) {
664
+ requestAnimationFrame(tick);
665
+ }
265
666
  };
266
- }, []);
267
- let allInputProps = useMemo(() => mergeProps(inputProps, hoverProps, focusProps), [inputProps, hoverProps, focusProps]);
268
- let comboBoxField = (_jsxs(ComboBoxWrapperElement, { ref: wrapperRef, qa: qa || 'ComboBox', mods: mods, styles: wrapperStyles, style: {
667
+ requestAnimationFrame(() => requestAnimationFrame(tick));
668
+ }, [shouldShowPopover, ensureInitialFocus]);
669
+ const comboBoxField = (_jsxs(ComboBoxWrapperElement, { ref: wrapperRef, qa: qa || 'ComboBox', mods: mods, styles: wrapperStyles, style: {
269
670
  zIndex: isFocused ? 1 : 'initial',
270
- }, "data-size": size, children: [prefix ? _jsx("div", { "data-element": "Prefix", children: prefix }) : null, _jsx(InputElement, { ref: inputRef, qa: "Input", autoFocus: autoFocus, "data-autofocus": autoFocus ? '' : undefined, ...allInputProps, autoComplete: autoComplete, styles: inputStyles, mods: mods, "data-size": size }), _jsxs("div", { "data-element": "Suffix", children: [suffixPosition === 'before' ? suffix : null, validationState || isLoading ? (_jsxs(_Fragment, { children: [validationState && !isLoading ? validation : null, isLoading ? _jsx(LoadingIcon, {}) : null] })) : null, suffixPosition === 'after' ? suffix : null, showClearButton && (_jsx(ItemAction, { icon: _jsx(CloseIcon, {}), size: size, theme: validationState === 'invalid' ? 'danger' : undefined, qa: "ComboBoxClearButton", "data-no-trigger": hideTrigger ? '' : undefined, onPress: clearValue })), !hideTrigger ? (_jsx(TriggerElement, { "data-popover-trigger": true, qa: "ComboBoxTrigger", ...mergeProps(buttonProps, triggerFocusProps, triggerHoverProps), ref: triggerRef, mods: {
271
- pressed: isTriggerPressed,
272
- focused: isTriggerFocused,
273
- hovered: isTriggerHovered,
671
+ }, "data-size": size, children: [prefix ? _jsx("div", { "data-element": "Prefix", children: prefix }) : null, _jsx(ComboBoxInput, { inputRef: inputRef, value: effectiveInputValue, placeholder: placeholder, isDisabled: isDisabled, isReadOnly: isReadOnly, autoFocus: autoFocus, size: size, mods: mods, inputStyles: inputStyles, keyboardProps: keyboardProps, focusProps: focusProps, isPopoverOpen: isPopoverOpen, hasResults: hasResults, comboBoxId: comboBoxId, listStateRef: listStateRef, onChange: handleInputChange, onFocus: handleInputFocus }), _jsxs("div", { "data-element": "Suffix", children: [suffixPosition === 'before' ? suffix : null, validationState || isLoading ? (_jsxs(_Fragment, { children: [validationState && !isLoading ? validation : null, isLoading ? _jsx(LoadingIcon, {}) : null] })) : null, suffixPosition === 'after' ? suffix : null, showClearButton && (_jsx(ItemAction, { icon: _jsx(CloseIcon, {}), size: size, theme: validationState === 'invalid' ? 'danger' : undefined, qa: "ComboBoxClearButton", "data-no-trigger": hideTrigger ? '' : undefined, onPress: clearValue })), !hideTrigger ? (_jsx(ItemAction, { ref: triggerRef, "data-popover-trigger": true, icon: _jsx(DownIcon, {}), qa: "ComboBoxTrigger", mods: {
672
+ pressed: isPopoverOpen,
274
673
  disabled: isDisabled,
275
674
  loading: isLoading,
276
- }, "data-size": size, isDisabled: isDisabled, styles: triggerStyles, children: _jsx(DownIcon, {}) })) : null] }), _jsx(OverlayWrapper, { isOpen: state.isOpen && !isDisabled, children: _jsx(ListBoxPopup, { ...listBoxProps, shouldUseVirtualFocus: true, listBoxRef: listBoxRef, popoverRef: popoverRef, overlayProps: overlayProps, placement: placement, state: state, listBoxStyles: listBoxStyles, overlayStyles: overlayStyles, optionStyles: optionStyles, minWidth: comboBoxWidth, triggerRef: triggerRef }) })] }));
277
- return wrapWithField(comboBoxField, ref, mergeProps({ ...props, styles }, { labelProps }));
278
- });
279
- const ComboBoxSectionComponent = Object.assign(BaseSection, {
280
- displayName: 'Section',
675
+ }, "data-size": size, isDisabled: isDisabled, styles: triggerStyles, onClick: () => {
676
+ if (!isDisabled) {
677
+ setIsPopoverOpen(!isPopoverOpen);
678
+ if (!isPopoverOpen) {
679
+ inputRef.current?.focus();
680
+ }
681
+ }
682
+ } })) : null] }), _jsx(ComboBoxOverlay, { isOpen: shouldShowPopover, triggerRef: wrapperRef, popoverRef: popoverRef, listBoxRef: listBoxRef, direction: direction, shouldFlip: shouldFlip, overlayOffset: overlayOffset, comboBoxWidth: comboBoxWidth, comboBoxId: comboBoxId, overlayStyles: overlayStyles, listBoxStyles: listBoxStyles, optionStyles: optionStyles, sectionStyles: sectionStyles, headingStyles: headingStyles, effectiveSelectedKey: effectiveSelectedKey, isDisabled: isDisabled, disabledKeys: props.disabledKeys, items: items, listStateRef: listStateRef, label: label, ariaLabel: props['aria-label'], onSelectionChange: handleSelectionChange, onClose: () => setIsPopoverOpen(false), children: filteredChildren })] }));
683
+ return wrapWithField(comboBoxField, ref, mergeProps({ ...props, styles }, {}));
281
684
  });
282
685
  ComboBox.Item = Item;
283
- ComboBox.Section = ComboBoxSectionComponent;
686
+ ComboBox.Section = BaseSection;
284
687
  Object.defineProperty(ComboBox, 'cubeInputType', {
285
688
  value: 'ComboBox',
286
689
  enumerable: false,