@cube-dev/ui-kit 0.67.0 → 0.69.0

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 (493) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/es/_internal/hooks/index.js +1 -1
  3. package/es/_internal/hooks/use-chained-callback.js +1 -1
  4. package/es/_internal/hooks/use-debounced-value.js +1 -1
  5. package/es/_internal/hooks/use-deprecation-warning.js +1 -1
  6. package/es/_internal/hooks/use-effect-once.js +1 -1
  7. package/es/_internal/hooks/use-event.js +1 -1
  8. package/es/_internal/hooks/use-is-first-render.js +1 -1
  9. package/es/_internal/hooks/use-sync-ref.js +1 -1
  10. package/es/_internal/hooks/use-timer/index.js +1 -1
  11. package/es/_internal/hooks/use-timer/timer.js +1 -1
  12. package/es/_internal/hooks/use-timer/use-timer.js +1 -1
  13. package/es/_internal/hooks/use-update-effect.js +1 -1
  14. package/es/_internal/hooks/use-warn.js +1 -1
  15. package/es/_internal/index.js +1 -1
  16. package/es/components/Block.js +1 -1
  17. package/es/components/GlobalStyles.js +1 -1
  18. package/es/components/GridProvider.js +1 -1
  19. package/es/components/HiddenInput.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 +36 -29
  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 +16 -26
  27. package/es/components/actions/CommandMenu/index.js +1 -1
  28. package/es/components/actions/CommandMenu/styled.js +8 -16
  29. package/es/components/actions/Menu/Menu.js +18 -13
  30. package/es/components/actions/Menu/MenuItem.js +2 -1
  31. package/es/components/actions/Menu/MenuSection.js +1 -1
  32. package/es/components/actions/Menu/MenuTrigger.js +1 -1
  33. package/es/components/actions/Menu/context.js +1 -1
  34. package/es/components/actions/Menu/index.js +1 -1
  35. package/es/components/actions/Menu/styled.js +49 -24
  36. package/es/components/actions/index.js +1 -1
  37. package/es/components/actions/use-action.js +1 -1
  38. package/es/components/actions/use-anchored-menu.js +1 -1
  39. package/es/components/actions/use-context-menu.js +1 -1
  40. package/es/components/content/ActiveZone/ActiveZone.js +1 -1
  41. package/es/components/content/Alert/Alert.js +1 -1
  42. package/es/components/content/Alert/index.js +1 -1
  43. package/es/components/content/Alert/types.js +1 -1
  44. package/es/components/content/Alert/use-alert.js +1 -1
  45. package/es/components/content/Avatar/Avatar.js +1 -1
  46. package/es/components/content/Badge/Badge.js +1 -1
  47. package/es/components/content/Card/Card.js +1 -1
  48. package/es/components/content/Content.js +1 -1
  49. package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  50. package/es/components/content/CopyPasteBlock/index.js +1 -1
  51. package/es/components/content/CopySnippet/CopySnippet.js +1 -1
  52. package/es/components/content/CopySnippet/index.js +1 -1
  53. package/es/components/content/Divider.js +1 -1
  54. package/es/components/content/Footer.js +1 -1
  55. package/es/components/content/Header.js +1 -1
  56. package/es/components/content/HotKeys/HotKeys.js +1 -1
  57. package/es/components/content/HotKeys/index.js +1 -1
  58. package/es/components/content/Paragraph.js +1 -1
  59. package/es/components/content/Placeholder/Placeholder.js +1 -1
  60. package/es/components/content/PrismCode/PrismCode.js +1 -1
  61. package/es/components/content/PrismCode/prismSetup.js +1 -1
  62. package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  63. package/es/components/content/Result/Result.js +1 -1
  64. package/es/components/content/Skeleton/Skeleton.js +1 -1
  65. package/es/components/content/Tag/Tag.js +2 -2
  66. package/es/components/content/Text.js +1 -1
  67. package/es/components/content/Title.js +1 -1
  68. package/es/components/fields/Checkbox/Checkbox.js +1 -1
  69. package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
  70. package/es/components/fields/Checkbox/context.js +1 -1
  71. package/es/components/fields/Checkbox/index.js +1 -1
  72. package/es/components/fields/ComboBox/ComboBox.js +1 -1
  73. package/es/components/fields/ComboBox/index.js +1 -1
  74. package/es/components/fields/DatePicker/DateInput.js +1 -1
  75. package/es/components/fields/DatePicker/DateInputBase.js +1 -1
  76. package/es/components/fields/DatePicker/DatePicker.js +1 -1
  77. package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
  78. package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
  79. package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
  80. package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
  81. package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
  82. package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  83. package/es/components/fields/DatePicker/TimeInput.js +1 -1
  84. package/es/components/fields/DatePicker/index.js +1 -1
  85. package/es/components/fields/DatePicker/intl.js +1 -1
  86. package/es/components/fields/DatePicker/parseDate.js +1 -1
  87. package/es/components/fields/DatePicker/props.js +1 -1
  88. package/es/components/fields/DatePicker/types.js +1 -1
  89. package/es/components/fields/DatePicker/utils.js +1 -1
  90. package/es/components/fields/FileInput/FileInput.js +1 -1
  91. package/es/components/fields/FilterListBox/FilterListBox.js +584 -0
  92. package/es/components/fields/FilterListBox/index.js +10 -0
  93. package/es/components/fields/FilterPicker/FilterPicker.js +426 -0
  94. package/es/components/fields/FilterPicker/index.js +10 -0
  95. package/es/components/fields/Input/Input.js +1 -1
  96. package/es/components/fields/Input/index.js +1 -1
  97. package/es/components/fields/ListBox/ListBox.js +325 -238
  98. package/es/components/fields/ListBox/index.js +1 -1
  99. package/es/components/fields/NumberInput/NumberInput.js +1 -1
  100. package/es/components/fields/NumberInput/StepButton.js +1 -1
  101. package/es/components/fields/PasswordInput/PasswordInput.js +1 -1
  102. package/es/components/fields/RadioGroup/Radio.js +1 -1
  103. package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
  104. package/es/components/fields/RadioGroup/context.js +1 -1
  105. package/es/components/fields/RadioGroup/index.js +1 -1
  106. package/es/components/fields/SearchInput/SearchInput.js +3 -3
  107. package/es/components/fields/SearchInput/index.js +1 -1
  108. package/es/components/fields/Select/Select.js +23 -14
  109. package/es/components/fields/Select/index.js +1 -1
  110. package/es/components/fields/Slider/Gradation.js +1 -1
  111. package/es/components/fields/Slider/Header.js +1 -1
  112. package/es/components/fields/Slider/RangeSlider.js +1 -1
  113. package/es/components/fields/Slider/Slider.js +1 -1
  114. package/es/components/fields/Slider/SliderBase.js +4 -4
  115. package/es/components/fields/Slider/SliderInput.js +1 -1
  116. package/es/components/fields/Slider/SliderThumb.js +1 -1
  117. package/es/components/fields/Slider/SliderTrack.js +1 -1
  118. package/es/components/fields/Slider/elements.js +1 -1
  119. package/es/components/fields/Slider/index.js +1 -1
  120. package/es/components/fields/Slider/types.js +1 -1
  121. package/es/components/fields/Switch/Switch.js +1 -1
  122. package/es/components/fields/Switch/index.js +1 -1
  123. package/es/components/fields/TextArea/TextArea.js +2 -2
  124. package/es/components/fields/TextArea/index.js +1 -1
  125. package/es/components/fields/TextInput/TextInput.js +1 -1
  126. package/es/components/fields/TextInput/TextInputBase.js +26 -11
  127. package/es/components/fields/TextInput/index.js +1 -1
  128. package/es/components/fields/TextInputMapper/TextInputMapper.js +7 -7
  129. package/es/components/fields/TextInputMapper/index.js +1 -1
  130. package/es/components/fields/index.js +3 -1
  131. package/es/components/form/FieldWrapper/FieldWrapper.js +1 -1
  132. package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  133. package/es/components/form/FieldWrapper/index.js +1 -1
  134. package/es/components/form/FieldWrapper/types.js +1 -1
  135. package/es/components/form/Form/Field.js +1 -1
  136. package/es/components/form/Form/Form.js +1 -1
  137. package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
  138. package/es/components/form/Form/ResetButton/index.js +1 -1
  139. package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  140. package/es/components/form/Form/SubmitButton/index.js +1 -1
  141. package/es/components/form/Form/SubmitError.js +1 -1
  142. package/es/components/form/Form/index.js +1 -1
  143. package/es/components/form/Form/types.js +1 -1
  144. package/es/components/form/Form/use-field/index.js +1 -1
  145. package/es/components/form/Form/use-field/types.js +1 -1
  146. package/es/components/form/Form/use-field/use-field-props.js +1 -1
  147. package/es/components/form/Form/use-field/use-field.js +1 -1
  148. package/es/components/form/Form/use-form.js +1 -1
  149. package/es/components/form/Form/validation.js +1 -1
  150. package/es/components/form/Label.js +1 -1
  151. package/es/components/form/index.js +1 -1
  152. package/es/components/form/wrapper.js +5 -2
  153. package/es/components/layout/Flex.js +1 -1
  154. package/es/components/layout/Flow.js +1 -1
  155. package/es/components/layout/Grid.js +1 -1
  156. package/es/components/layout/Panel.js +1 -1
  157. package/es/components/layout/Prefix.js +1 -1
  158. package/es/components/layout/ResizablePanel.js +1 -1
  159. package/es/components/layout/Space.js +1 -1
  160. package/es/components/layout/Suffix.js +1 -1
  161. package/es/components/navigation/LegacyTabs/LegacyTabs.js +1 -2
  162. package/es/components/navigation/Link/Link.js +1 -1
  163. package/es/components/organisms/FileTabs/FileTabs.js +1 -2
  164. package/es/components/organisms/Modal/Modal.js +1 -1
  165. package/es/components/organisms/StatsCard/StatsCard.js +1 -1
  166. package/es/components/other/Base64Upload/Base64Upload.js +1 -1
  167. package/es/components/other/Calendar/Calendar.js +1 -1
  168. package/es/components/other/Calendar/CalendarCell.js +1 -1
  169. package/es/components/other/Calendar/CalendarGrid.js +1 -1
  170. package/es/components/other/Calendar/RangeCalendar.js +1 -1
  171. package/es/components/other/CloudLogo/CloudLogo.js +1 -1
  172. package/es/components/overlays/AlertDialog/AlertDialog.js +1 -1
  173. package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  174. package/es/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  175. package/es/components/overlays/AlertDialog/index.js +1 -1
  176. package/es/components/overlays/AlertDialog/types.js +1 -1
  177. package/es/components/overlays/Dialog/Dialog.js +2 -1
  178. package/es/components/overlays/Dialog/DialogContainer.js +1 -1
  179. package/es/components/overlays/Dialog/DialogForm.js +1 -1
  180. package/es/components/overlays/Dialog/DialogTrigger.js +1 -1
  181. package/es/components/overlays/Dialog/context.js +1 -1
  182. package/es/components/overlays/Dialog/index.js +1 -1
  183. package/es/components/overlays/Dialog/use-dialog-container.js +1 -1
  184. package/es/components/overlays/Modal/Modal.js +1 -1
  185. package/es/components/overlays/Modal/OpenTransition.js +1 -1
  186. package/es/components/overlays/Modal/Overlay.js +1 -1
  187. package/es/components/overlays/Modal/Popover.js +1 -1
  188. package/es/components/overlays/Modal/Tray.js +1 -1
  189. package/es/components/overlays/Modal/Underlay.js +1 -1
  190. package/es/components/overlays/Modal/index.js +1 -1
  191. package/es/components/overlays/Modal/types.js +1 -1
  192. package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +1 -1
  193. package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +1 -1
  194. package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +1 -1
  195. package/es/components/overlays/NewNotifications/Bar/index.js +1 -1
  196. package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +1 -1
  197. package/es/components/overlays/NewNotifications/Dialog/index.js +1 -1
  198. package/es/components/overlays/NewNotifications/Notification.js +1 -1
  199. package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +2 -2
  200. package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +1 -2
  201. package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +1 -1
  202. package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +1 -1
  203. package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +1 -1
  204. package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +1 -1
  205. package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
  206. package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +1 -1
  207. package/es/components/overlays/NewNotifications/NotificationView/index.js +1 -1
  208. package/es/components/overlays/NewNotifications/NotificationView/types.js +1 -1
  209. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +1 -1
  210. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +1 -1
  211. package/es/components/overlays/NewNotifications/NotificationsContext/index.js +1 -1
  212. package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +1 -1
  213. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +1 -1
  214. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +1 -1
  215. package/es/components/overlays/NewNotifications/NotificationsList/index.js +1 -1
  216. package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
  217. package/es/components/overlays/NewNotifications/hooks/index.js +1 -1
  218. package/es/components/overlays/NewNotifications/hooks/types.js +1 -1
  219. package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +1 -1
  220. package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +1 -1
  221. package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
  222. package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +1 -1
  223. package/es/components/overlays/NewNotifications/index.js +1 -1
  224. package/es/components/overlays/NewNotifications/types.js +1 -1
  225. package/es/components/overlays/Notification/Notification.js +1 -1
  226. package/es/components/overlays/OverlayWrapper.js +1 -1
  227. package/es/components/overlays/Toasts/Toast.js +1 -1
  228. package/es/components/overlays/Toasts/index.js +1 -1
  229. package/es/components/overlays/Toasts/types.js +1 -1
  230. package/es/components/overlays/Toasts/use-toasts-api.js +1 -1
  231. package/es/components/overlays/Tooltip/Tooltip.js +1 -1
  232. package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
  233. package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  234. package/es/components/overlays/Tooltip/context.js +1 -1
  235. package/es/components/overlays/Tooltip/index.js +1 -1
  236. package/es/components/portal/Portal.js +1 -1
  237. package/es/components/portal/PortalProvider.js +1 -1
  238. package/es/components/portal/index.js +1 -1
  239. package/es/components/portal/storybook/templates/CustomRoot.js +1 -1
  240. package/es/components/portal/storybook/templates/PortalOrder.js +1 -1
  241. package/es/components/portal/storybook/templates/basic.js +1 -1
  242. package/es/components/portal/storybook/templates/index.js +1 -1
  243. package/es/components/portal/types.js +1 -1
  244. package/es/components/portal/usePortal.js +1 -1
  245. package/es/components/shared/InvalidIcon.js +1 -1
  246. package/es/components/shared/ValidIcon.js +1 -1
  247. package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  248. package/es/components/status/LoadingAnimation/index.js +1 -1
  249. package/es/components/status/Spin/Cube.js +1 -1
  250. package/es/components/status/Spin/InternalSpinner.js +1 -1
  251. package/es/components/status/Spin/Spin.js +1 -1
  252. package/es/components/status/Spin/SpinsContainer.js +1 -1
  253. package/es/components/status/Spin/index.js +1 -1
  254. package/es/components/status/Spin/types.js +1 -1
  255. package/es/components/status/index.js +1 -1
  256. package/es/data/themes.js +1 -1
  257. package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
  258. package/es/icons/AdjustmentsIcon.js +1 -1
  259. package/es/icons/AiIcon.js +1 -1
  260. package/es/icons/AreaChartIcon.js +1 -1
  261. package/es/icons/BackwardIcon.js +1 -1
  262. package/es/icons/BarChartIcon.js +1 -1
  263. package/es/icons/BellFilledIcon.js +1 -1
  264. package/es/icons/BellIcon.js +1 -1
  265. package/es/icons/BooleanIcon.js +1 -1
  266. package/es/icons/CalendarEditIcon.js +1 -1
  267. package/es/icons/CalendarIcon.js +1 -1
  268. package/es/icons/CaretDownIcon.js +1 -1
  269. package/es/icons/CaretUpIcon.js +1 -1
  270. package/es/icons/ChartAreaStackedIcon.js +1 -1
  271. package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
  272. package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  273. package/es/icons/ChartBarGroupedIcon.js +1 -1
  274. package/es/icons/ChartBarHorizontalIcon.js +1 -1
  275. package/es/icons/ChartBarLineIcon.js +1 -1
  276. package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
  277. package/es/icons/ChartBarStackedIcon.js +1 -1
  278. package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  279. package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
  280. package/es/icons/ChartBoxPlot2Icon.js +1 -1
  281. package/es/icons/ChartBoxPlotIcon.js +1 -1
  282. package/es/icons/ChartBubbleIcon.js +1 -1
  283. package/es/icons/ChartDonut2Icon.js +1 -1
  284. package/es/icons/ChartFunnelIcon.js +1 -1
  285. package/es/icons/ChartKPIIcon.js +12 -0
  286. package/es/icons/ChartPie2Icon.js +1 -1
  287. package/es/icons/ChartScatterIcon.js +1 -1
  288. package/es/icons/CheckCircleFilledIcon.js +1 -1
  289. package/es/icons/CheckCircleIcon.js +1 -1
  290. package/es/icons/CheckIcon.js +1 -1
  291. package/es/icons/CircleFilledIcon.js +1 -1
  292. package/es/icons/ClearIcon.js +1 -1
  293. package/es/icons/CloseCircleFilledIcon.js +1 -1
  294. package/es/icons/CloseCircleIcon.js +1 -1
  295. package/es/icons/CloseIcon.js +1 -1
  296. package/es/icons/CodeIcon.js +1 -1
  297. package/es/icons/CopyIcon.js +1 -1
  298. package/es/icons/CountIcon.js +1 -1
  299. package/es/icons/CubeIcon.js +1 -1
  300. package/es/icons/DangerIcon.js +1 -1
  301. package/es/icons/DashboardIcon.js +1 -1
  302. package/es/icons/DatabaseIcon.js +1 -1
  303. package/es/icons/DirectionIcon.js +1 -1
  304. package/es/icons/DonutIcon.js +1 -1
  305. package/es/icons/DownIcon.js +1 -1
  306. package/es/icons/EditIcon.js +1 -1
  307. package/es/icons/ExclamationCircleFilledIcon.js +1 -1
  308. package/es/icons/ExclamationCircleIcon.js +1 -1
  309. package/es/icons/ExclamationIcon.js +1 -1
  310. package/es/icons/EyeIcon.js +1 -1
  311. package/es/icons/EyeInvisibleIcon.js +1 -1
  312. package/es/icons/FilterIcon.js +1 -1
  313. package/es/icons/FolderFilledIcon.js +1 -1
  314. package/es/icons/FolderIcon.js +1 -1
  315. package/es/icons/FolderOpenFilledIcon.js +1 -1
  316. package/es/icons/FolderOpenIcon.js +1 -1
  317. package/es/icons/ForwardIcon.js +1 -1
  318. package/es/icons/HierarchyIcon.js +1 -1
  319. package/es/icons/Icon.js +1 -1
  320. package/es/icons/InfoCircleIcon.js +1 -1
  321. package/es/icons/InfoIcon.js +1 -1
  322. package/es/icons/KeyIcon.js +1 -1
  323. package/es/icons/LeftIcon.js +1 -1
  324. package/es/icons/LineChartIcon.js +1 -1
  325. package/es/icons/LoadingIcon.js +1 -1
  326. package/es/icons/LockFilledIcon.js +1 -1
  327. package/es/icons/LockIcon.js +1 -1
  328. package/es/icons/MoreIcon.js +1 -1
  329. package/es/icons/NotAllowedIcon.js +1 -1
  330. package/es/icons/NumberIcon.js +1 -1
  331. package/es/icons/PauseCircleFilledIcon.js +1 -1
  332. package/es/icons/PauseCircleIcon.js +1 -1
  333. package/es/icons/PauseIcon.js +1 -1
  334. package/es/icons/PieChartIcon.js +1 -1
  335. package/es/icons/PlayCircleIcon.js +1 -1
  336. package/es/icons/PlayIcon.js +1 -1
  337. package/es/icons/PlusIcon.js +1 -1
  338. package/es/icons/ReloadIcon.js +1 -1
  339. package/es/icons/ReportIcon.js +1 -1
  340. package/es/icons/ReturnIcon.js +1 -1
  341. package/es/icons/RightIcon.js +1 -1
  342. package/es/icons/SchemeIcon.js +1 -1
  343. package/es/icons/SearchIcon.js +1 -1
  344. package/es/icons/SettingsIcon.js +1 -1
  345. package/es/icons/ShieldFilledIcon.js +1 -1
  346. package/es/icons/ShieldIcon.js +1 -1
  347. package/es/icons/SlashIcon.js +1 -1
  348. package/es/icons/SparklesIcon.js +1 -1
  349. package/es/icons/SqlIcon.js +1 -1
  350. package/es/icons/StatsIcon.js +1 -1
  351. package/es/icons/StopIcon.js +1 -1
  352. package/es/icons/StringIcon.js +1 -1
  353. package/es/icons/SwitchIcon.js +1 -1
  354. package/es/icons/TableIcon.js +1 -1
  355. package/es/icons/ThumbsDownIcon.js +1 -1
  356. package/es/icons/ThumbsUpIcon.js +1 -1
  357. package/es/icons/ThunderboltCrossedIcon.js +1 -1
  358. package/es/icons/ThunderboltFilledIcon.js +1 -1
  359. package/es/icons/ThunderboltIcon.js +1 -1
  360. package/es/icons/TimeIcon.js +1 -1
  361. package/es/icons/UnlockIcon.js +1 -1
  362. package/es/icons/UpIcon.js +1 -1
  363. package/es/icons/UserGroupIcon.js +1 -1
  364. package/es/icons/UserIcon.js +1 -1
  365. package/es/icons/UserLockIcon.js +1 -1
  366. package/es/icons/ViewIcon.js +1 -1
  367. package/es/icons/WarningFilledIcon.js +1 -1
  368. package/es/icons/WarningIcon.js +1 -1
  369. package/es/icons/add-new-icon.js +1 -1
  370. package/es/icons/index.js +2 -1
  371. package/es/icons/wrap-icon.js +1 -1
  372. package/es/index.js +1 -1
  373. package/es/provider.js +1 -1
  374. package/es/providers/TrackingProvider.js +1 -1
  375. package/es/services/notification.js +1 -1
  376. package/es/shared/form.js +1 -1
  377. package/es/shared/index.js +1 -1
  378. package/es/stories/Form.legacy-stories.js +1 -1
  379. package/es/stories/FormFieldArgs.js +1 -1
  380. package/es/stories/Layout.stories.js +1 -1
  381. package/es/stories/Tasty.stories.js +1 -1
  382. package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
  383. package/es/stories/components/DialogFormApp.js +1 -1
  384. package/es/stories/components/StyledButton.js +1 -1
  385. package/es/stories/lists/baseProps.js +1 -1
  386. package/es/tasty/index.js +1 -1
  387. package/es/tasty/providers/BreakpointsProvider.js +1 -1
  388. package/es/tasty/styles/align.js +1 -1
  389. package/es/tasty/styles/border.js +1 -1
  390. package/es/tasty/styles/boxShadow.combinator.js +1 -1
  391. package/es/tasty/styles/color.js +1 -1
  392. package/es/tasty/styles/createStyle.js +1 -1
  393. package/es/tasty/styles/dimension.js +1 -1
  394. package/es/tasty/styles/display.js +1 -1
  395. package/es/tasty/styles/fade.js +1 -1
  396. package/es/tasty/styles/fill.js +1 -1
  397. package/es/tasty/styles/flow.js +1 -1
  398. package/es/tasty/styles/font.js +1 -1
  399. package/es/tasty/styles/fontStyle.js +1 -1
  400. package/es/tasty/styles/gap.js +1 -1
  401. package/es/tasty/styles/groupRadius.js +1 -1
  402. package/es/tasty/styles/height.js +1 -1
  403. package/es/tasty/styles/index.js +1 -1
  404. package/es/tasty/styles/inset.js +1 -1
  405. package/es/tasty/styles/justify.js +1 -1
  406. package/es/tasty/styles/list.js +1 -1
  407. package/es/tasty/styles/margin.js +1 -1
  408. package/es/tasty/styles/marginBlock.js +1 -1
  409. package/es/tasty/styles/marginInline.js +1 -1
  410. package/es/tasty/styles/outline.js +1 -1
  411. package/es/tasty/styles/padding.js +1 -1
  412. package/es/tasty/styles/paddingBlock.js +1 -1
  413. package/es/tasty/styles/paddingInline.js +1 -1
  414. package/es/tasty/styles/place.js +1 -1
  415. package/es/tasty/styles/predefined.js +1 -1
  416. package/es/tasty/styles/preset.js +1 -1
  417. package/es/tasty/styles/radius.js +1 -1
  418. package/es/tasty/styles/reset.js +1 -1
  419. package/es/tasty/styles/scrollbar.js +1 -1
  420. package/es/tasty/styles/shadow.js +1 -1
  421. package/es/tasty/styles/styledScrollbar.js +1 -1
  422. package/es/tasty/styles/transition.js +1 -1
  423. package/es/tasty/styles/types.js +1 -1
  424. package/es/tasty/styles/width.js +1 -1
  425. package/es/tasty/tasty.js +1 -1
  426. package/es/tasty/types.js +1 -1
  427. package/es/tasty/utils/cache-wrapper.js +1 -1
  428. package/es/tasty/utils/case-converter.js +1 -1
  429. package/es/tasty/utils/colors.js +1 -1
  430. package/es/tasty/utils/dotize.js +1 -1
  431. package/es/tasty/utils/filterBaseProps.js +1 -1
  432. package/es/tasty/utils/getDisplayName.js +1 -1
  433. package/es/tasty/utils/getModCombinations.js +1 -1
  434. package/es/tasty/utils/mergeStyles.js +1 -1
  435. package/es/tasty/utils/modAttrs.js +1 -1
  436. package/es/tasty/utils/renderStyles.js +1 -1
  437. package/es/tasty/utils/responsive.js +1 -1
  438. package/es/tasty/utils/string.js +1 -1
  439. package/es/tasty/utils/styles.js +4 -1
  440. package/es/tasty/utils/warnings.js +1 -1
  441. package/es/tokens.js +20 -1
  442. package/es/type-checks.js +1 -1
  443. package/es/utils/ResizeSensor.js +1 -1
  444. package/es/utils/modules.js +1 -1
  445. package/es/utils/promise.js +1 -1
  446. package/es/utils/random.js +1 -1
  447. package/es/utils/range.js +1 -1
  448. package/es/utils/react/Slots.js +1 -1
  449. package/es/utils/react/chain.js +1 -1
  450. package/es/utils/react/index.js +2 -1
  451. package/es/utils/react/interactions.js +1 -1
  452. package/es/utils/react/isTextOnly.js +1 -1
  453. package/es/utils/react/mapProps.js +1 -1
  454. package/es/utils/react/mergeProps.js +1 -1
  455. package/es/utils/react/nullableValue.js +1 -1
  456. package/es/utils/react/sharedStore.js +1 -1
  457. package/es/utils/react/useCombinedRefs.js +1 -1
  458. package/es/utils/react/useControlledFocusVisible.js +42 -0
  459. package/es/utils/react/useEventBus.js +1 -1
  460. package/es/utils/react/useId.js +1 -1
  461. package/es/utils/react/useIsDarwin.js +1 -1
  462. package/es/utils/react/useKeySymbols.js +1 -1
  463. package/es/utils/react/useLayoutEffect.js +1 -1
  464. package/es/utils/react/useQaProps.js +1 -1
  465. package/es/utils/react/useViewportSize.js +1 -1
  466. package/es/utils/react/wrapNodeIfPlain.js +1 -1
  467. package/es/utils/transitions.js +1 -1
  468. package/es/utils/tree.js +1 -1
  469. package/es/utils/warnings.js +1 -1
  470. package/es/version.js +2 -2
  471. package/package.json +2 -1
  472. package/types/components/actions/Button/Button.d.ts +20 -13
  473. package/types/components/actions/CommandMenu/CommandMenu.d.ts +1 -1
  474. package/types/components/actions/Menu/Menu.d.ts +4 -1
  475. package/types/components/actions/Menu/MenuItem.d.ts +1 -1
  476. package/types/components/actions/Menu/styled.d.ts +1 -0
  477. package/types/components/fields/ComboBox/ComboBox.d.ts +1 -1
  478. package/types/components/fields/FilterListBox/FilterListBox.d.ts +51 -0
  479. package/types/components/fields/FilterListBox/index.d.ts +1 -0
  480. package/types/components/fields/FilterPicker/FilterPicker.d.ts +55 -0
  481. package/types/components/fields/FilterPicker/index.d.ts +1 -0
  482. package/types/components/fields/ListBox/ListBox.d.ts +48 -22
  483. package/types/components/fields/Select/Select.d.ts +7 -1
  484. package/types/components/fields/TextInput/TextInputBase.d.ts +1 -1
  485. package/types/components/fields/TextInputMapper/TextInputMapper.d.ts +2 -0
  486. package/types/components/fields/index.d.ts +2 -0
  487. package/types/icons/ChartKPIIcon.d.ts +4 -0
  488. package/types/icons/index.d.ts +1 -0
  489. package/types/shared/form.d.ts +2 -0
  490. package/types/tasty/utils/styles.d.ts +1 -0
  491. package/types/tokens.d.ts +17 -0
  492. package/types/utils/react/index.d.ts +2 -0
  493. package/types/utils/react/useControlledFocusVisible.d.ts +10 -0
@@ -0,0 +1,584 @@
1
+ /**
2
+ * @license MIT
3
+ * author: Cube Dev Team
4
+ * @cube-dev/ui-kit v0.69.0
5
+ * Released under the MIT license.
6
+ */
7
+
8
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
+ import React, { forwardRef, useLayoutEffect, useMemo, useRef, useState, } from 'react';
10
+ import { useFilter, useKeyboard } from 'react-aria';
11
+ import { Section as BaseSection, Item } from 'react-stately';
12
+ import { LoadingIcon } from '../../../icons';
13
+ import { useProviderProps } from '../../../provider';
14
+ import { BASE_STYLES, COLOR_STYLES, extractStyles, OUTER_STYLES, tasty, } from '../../../tasty';
15
+ import { mergeProps, modAttrs, useCombinedRefs } from '../../../utils/react';
16
+ import { useFocus } from '../../../utils/react/interactions';
17
+ import { StyledHeader } from '../../actions/Menu/styled';
18
+ import { Block } from '../../Block';
19
+ import { useFieldProps, useFormProps, wrapWithField } from '../../form';
20
+ import { ListBox } from '../ListBox/ListBox';
21
+ import { DEFAULT_INPUT_STYLES, INPUT_WRAPPER_STYLES, } from '../TextInput/TextInputBase';
22
+ const FilterListBoxWrapperElement = tasty({
23
+ styles: {
24
+ display: 'grid',
25
+ flow: 'column',
26
+ gridColumns: '1sf',
27
+ gridRows: 'max-content max-content 1sf',
28
+ gap: 0,
29
+ position: 'relative',
30
+ radius: true,
31
+ color: '#dark-02',
32
+ transition: 'theme',
33
+ outline: {
34
+ '': '#purple-03.0',
35
+ 'invalid & focused': '#danger.50',
36
+ focused: '#purple-03',
37
+ },
38
+ height: {
39
+ '': false,
40
+ popover: 'initial max-content (50vh - 4x)',
41
+ },
42
+ border: {
43
+ '': true,
44
+ focused: '#purple-text',
45
+ valid: '#success-text.50',
46
+ invalid: '#danger-text.50',
47
+ disabled: true,
48
+ popover: false,
49
+ },
50
+ },
51
+ });
52
+ const SearchWrapperElement = tasty({
53
+ styles: {
54
+ ...INPUT_WRAPPER_STYLES,
55
+ border: 'bottom',
56
+ radius: '1r top',
57
+ fill: '#clear',
58
+ },
59
+ });
60
+ const SearchInputElement = tasty({
61
+ as: 'input',
62
+ styles: {
63
+ ...DEFAULT_INPUT_STYLES,
64
+ fill: '#clear',
65
+ padding: {
66
+ '': '.5x 1.5x',
67
+ prefix: '.5x 1.5x .5x .5x',
68
+ },
69
+ },
70
+ });
71
+ const StyledHeaderWithoutBorder = tasty(StyledHeader, {
72
+ styles: {
73
+ border: false,
74
+ },
75
+ });
76
+ const PROP_STYLES = [...BASE_STYLES, ...OUTER_STYLES, ...COLOR_STYLES];
77
+ export const FilterListBox = forwardRef(function FilterListBox(props, ref) {
78
+ props = useProviderProps(props);
79
+ props = useFormProps(props);
80
+ props = useFieldProps(props, {
81
+ valuePropsMapper: ({ value, onChange }) => {
82
+ const fieldProps = {};
83
+ if (props.selectionMode === 'multiple') {
84
+ fieldProps.selectedKeys = value || [];
85
+ }
86
+ else {
87
+ fieldProps.selectedKey = value ?? null;
88
+ }
89
+ fieldProps.onSelectionChange = (key) => {
90
+ if (props.selectionMode === 'multiple') {
91
+ onChange(key ? (Array.isArray(key) ? key : [key]) : []);
92
+ }
93
+ else {
94
+ onChange(Array.isArray(key) ? key[0] : key);
95
+ }
96
+ };
97
+ return fieldProps;
98
+ },
99
+ });
100
+ let { qa, label, extra, labelStyles, isRequired, necessityIndicator, validationState, isDisabled, isLoading, searchPlaceholder = 'Search...', autoFocus, filter, mods: externalMods, emptyLabel, searchInputStyles, listStyles, optionStyles, sectionStyles, headingStyles, searchInputRef, listRef, message, description, styles, focusOnHover, labelSuffix, selectedKey, defaultSelectedKey, selectedKeys, defaultSelectedKeys, onSelectionChange: externalOnSelectionChange, allowsCustomValue = false, header, footer, size = 'medium', headerStyles, footerStyles, listBoxStyles, children, onEscape, isCheckable, onOptionClick, selectionMode = 'single', ...otherProps } = props;
101
+ // Collect original option keys to avoid duplicating them as custom values.
102
+ const originalKeys = useMemo(() => {
103
+ const keys = new Set();
104
+ const collectKeys = (nodes) => {
105
+ React.Children.forEach(nodes, (child) => {
106
+ if (!child || typeof child !== 'object')
107
+ return;
108
+ if (child.type === Item) {
109
+ if (child.key != null)
110
+ keys.add(String(child.key));
111
+ }
112
+ if (child.props?.children) {
113
+ collectKeys(child.props.children);
114
+ }
115
+ });
116
+ };
117
+ if (children)
118
+ collectKeys(children);
119
+ return keys;
120
+ }, [children]);
121
+ // State to keep track of custom (user-entered) items that were selected.
122
+ const [customKeys, setCustomKeys] = useState(new Set());
123
+ // Initialize custom keys from current selection
124
+ React.useEffect(() => {
125
+ if (!allowsCustomValue)
126
+ return;
127
+ const currentSelectedKeys = selectedKeys
128
+ ? Array.from(selectedKeys).map(String)
129
+ : selectedKey != null
130
+ ? [String(selectedKey)]
131
+ : [];
132
+ if (currentSelectedKeys.length === 0)
133
+ return;
134
+ const keysToAdd = currentSelectedKeys.filter((k) => !originalKeys.has(k));
135
+ if (keysToAdd.length) {
136
+ setCustomKeys((prev) => new Set([...Array.from(prev), ...keysToAdd]));
137
+ }
138
+ }, [allowsCustomValue, selectedKeys, selectedKey, originalKeys]);
139
+ // Merge original children with any custom items so they persist in the list.
140
+ // If there are selected custom values, they should appear on top with other
141
+ // selected items (which are already sorted by the parent component, e.g. FilterPicker).
142
+ const mergedChildren = useMemo(() => {
143
+ if (!children && customKeys.size === 0)
144
+ return children;
145
+ // Build React elements for custom values (kept stable via their key).
146
+ const customArray = Array.from(customKeys).map((key) => (_jsx(Item, { textValue: key, children: key }, key)));
147
+ // Identify which custom keys are currently selected so we can promote them.
148
+ const selectedKeysSet = new Set();
149
+ if (selectionMode === 'multiple') {
150
+ Array.from(selectedKeys ?? []).forEach((k) => selectedKeysSet.add(String(k)));
151
+ }
152
+ else {
153
+ if (selectedKey != null)
154
+ selectedKeysSet.add(String(selectedKey));
155
+ }
156
+ const selectedCustom = [];
157
+ const unselectedCustom = [];
158
+ customArray.forEach((item) => {
159
+ if (selectedKeysSet.has(String(item.key))) {
160
+ selectedCustom.push(item);
161
+ }
162
+ else {
163
+ unselectedCustom.push(item);
164
+ }
165
+ });
166
+ if (!children) {
167
+ // No original items – just return selected custom followed by the rest.
168
+ return [...selectedCustom, ...unselectedCustom];
169
+ }
170
+ const originalArray = Array.isArray(children) ? children : [children];
171
+ // Final order: selected custom items -> original array (already possibly
172
+ // sorted by parent) -> unselected custom items.
173
+ return [...selectedCustom, ...originalArray, ...unselectedCustom];
174
+ }, [children, customKeys, selectionMode, selectedKey, selectedKeys]);
175
+ // Determine an aria-label for the internal ListBox to avoid React Aria warnings.
176
+ const innerAriaLabel = props['aria-label'] ||
177
+ (typeof label === 'string' ? label : undefined);
178
+ const [searchValue, setSearchValue] = useState('');
179
+ const { contains } = useFilter({ sensitivity: 'base' });
180
+ // Choose the text filter function: user-provided `filter` prop (if any)
181
+ // or the default `contains` helper from `useFilter`.
182
+ const textFilterFn = useMemo(() => filter || contains, [filter, contains]);
183
+ // Filter children based on search value
184
+ const filteredChildren = useMemo(() => {
185
+ const term = searchValue.trim();
186
+ if (!term || !mergedChildren) {
187
+ return mergedChildren;
188
+ }
189
+ // Helper to check if a node matches the search term
190
+ const nodeMatches = (node) => {
191
+ if (!node?.props)
192
+ return false;
193
+ // Get text content from the node
194
+ const textValue = node.props.textValue ||
195
+ (typeof node.props.children === 'string' ? node.props.children : '') ||
196
+ String(node.props.children || '');
197
+ return textFilterFn(textValue, term);
198
+ };
199
+ // Helper to filter React children recursively
200
+ const filterChildren = (childNodes) => {
201
+ if (!childNodes)
202
+ return null;
203
+ const childArray = Array.isArray(childNodes) ? childNodes : [childNodes];
204
+ const filteredNodes = [];
205
+ childArray.forEach((child) => {
206
+ if (!child || typeof child !== 'object') {
207
+ return;
208
+ }
209
+ // Handle ListBox.Section
210
+ if (child.type === BaseSection ||
211
+ child.type?.displayName === 'Section') {
212
+ const sectionChildren = Array.isArray(child.props.children)
213
+ ? child.props.children
214
+ : [child.props.children];
215
+ const filteredSectionChildren = sectionChildren.filter((sectionChild) => {
216
+ return (sectionChild &&
217
+ typeof sectionChild === 'object' &&
218
+ nodeMatches(sectionChild));
219
+ });
220
+ if (filteredSectionChildren.length > 0) {
221
+ // Store filtered children in a way that doesn't require cloning the section
222
+ const filteredSection = {
223
+ ...child,
224
+ filteredChildren: filteredSectionChildren,
225
+ };
226
+ filteredNodes.push(filteredSection);
227
+ }
228
+ }
229
+ // Handle ListBox.Item
230
+ else if (child.type === Item) {
231
+ if (nodeMatches(child)) {
232
+ filteredNodes.push(child);
233
+ }
234
+ }
235
+ // Handle other components
236
+ else if (nodeMatches(child)) {
237
+ filteredNodes.push(child);
238
+ }
239
+ });
240
+ return filteredNodes;
241
+ };
242
+ return filterChildren(mergedChildren);
243
+ }, [mergedChildren, searchValue, textFilterFn]);
244
+ // Handle custom values if allowed
245
+ const enhancedChildren = useMemo(() => {
246
+ let childrenToProcess = filteredChildren;
247
+ // Handle custom values if allowed
248
+ if (!allowsCustomValue)
249
+ return childrenToProcess;
250
+ const term = searchValue.trim();
251
+ if (!term)
252
+ return childrenToProcess;
253
+ // Helper to determine if the term is already present (exact match on rendered textValue or the key).
254
+ const doesTermExist = (nodes) => {
255
+ let exists = false;
256
+ const checkNodes = (childNodes) => {
257
+ React.Children.forEach(childNodes, (child) => {
258
+ if (!child || typeof child !== 'object')
259
+ return;
260
+ // Check items directly
261
+ if (child.type === Item) {
262
+ const childText = child.props.textValue ||
263
+ (typeof child.props.children === 'string'
264
+ ? child.props.children
265
+ : '') ||
266
+ String(child.props.children ?? '');
267
+ if (term === childText || String(child.key) === term) {
268
+ exists = true;
269
+ }
270
+ }
271
+ // Recurse into sections or other wrappers
272
+ if (child.props?.children) {
273
+ checkNodes(child.props.children);
274
+ }
275
+ });
276
+ };
277
+ checkNodes(nodes);
278
+ return exists;
279
+ };
280
+ if (doesTermExist(mergedChildren)) {
281
+ return childrenToProcess;
282
+ }
283
+ // Append the custom option at the end.
284
+ const customOption = (_jsx(Item, { textValue: term, children: term }, term));
285
+ if (Array.isArray(childrenToProcess)) {
286
+ return [...childrenToProcess, customOption];
287
+ }
288
+ if (childrenToProcess) {
289
+ return [childrenToProcess, customOption];
290
+ }
291
+ return customOption;
292
+ }, [allowsCustomValue, filteredChildren, mergedChildren, searchValue]);
293
+ // Convert custom objects back to React elements for rendering
294
+ const finalChildren = useMemo(() => {
295
+ if (!enhancedChildren)
296
+ return enhancedChildren;
297
+ const convertToReactElements = (nodes) => {
298
+ if (!nodes)
299
+ return nodes;
300
+ const nodeArray = Array.isArray(nodes) ? nodes : [nodes];
301
+ return nodeArray.map((node, index) => {
302
+ if (!node || typeof node !== 'object') {
303
+ return node;
304
+ }
305
+ // Handle our custom filtered section objects
306
+ if (node.filteredChildren) {
307
+ const childrenToUse = node.filteredChildren;
308
+ // Return the original section but with the processed children
309
+ return React.cloneElement(node, {
310
+ key: node.key || index,
311
+ children: childrenToUse,
312
+ });
313
+ }
314
+ // Handle regular React elements
315
+ return node;
316
+ });
317
+ };
318
+ return convertToReactElements(enhancedChildren);
319
+ }, [enhancedChildren]);
320
+ styles = extractStyles(otherProps, PROP_STYLES, styles);
321
+ ref = useCombinedRefs(ref);
322
+ searchInputRef = useCombinedRefs(searchInputRef);
323
+ listRef = useCombinedRefs(listRef);
324
+ const { isFocused, focusProps } = useFocus({ isDisabled });
325
+ const isInvalid = validationState === 'invalid';
326
+ const listBoxRef = useRef(null);
327
+ // Ref to access internal ListBox state (selection manager, etc.)
328
+ const listStateRef = useRef(null);
329
+ // No separate focusedKey state needed; rely directly on selectionManager.focusedKey.
330
+ // When the search value changes, the visible collection of items may change as well.
331
+ // If the currently focused item is no longer visible, move virtual focus to the first
332
+ // available item so that arrow navigation and Enter behaviour continue to work.
333
+ // If there are no available items, reset the selection so Enter won't select anything.
334
+ useLayoutEffect(() => {
335
+ const listState = listStateRef.current;
336
+ if (!listState)
337
+ return;
338
+ const { selectionManager, collection } = listState;
339
+ // Helper to collect visible item keys (supports sections)
340
+ const collectVisibleKeys = (nodes, out) => {
341
+ const term = searchValue.trim();
342
+ for (const node of nodes) {
343
+ if (node.type === 'item') {
344
+ const text = node.textValue ?? String(node.rendered ?? '');
345
+ if (!term || textFilterFn(text, term)) {
346
+ out.push(node.key);
347
+ }
348
+ }
349
+ else if (node.childNodes) {
350
+ collectVisibleKeys(node.childNodes, out);
351
+ }
352
+ }
353
+ };
354
+ const visibleKeys = [];
355
+ collectVisibleKeys(collection, visibleKeys);
356
+ // If there are no visible items, reset the focused key so Enter won't select anything
357
+ if (visibleKeys.length === 0) {
358
+ selectionManager.setFocusedKey(null);
359
+ return;
360
+ }
361
+ // Early exit if the current focused key is still present in the visible items.
362
+ const currentFocused = selectionManager.focusedKey;
363
+ if (currentFocused != null && visibleKeys.includes(currentFocused)) {
364
+ return;
365
+ }
366
+ // Set focus to the first visible item
367
+ selectionManager.setFocusedKey(visibleKeys[0]);
368
+ }, [searchValue, enhancedChildren, textFilterFn]);
369
+ // Keyboard navigation handler for search input
370
+ const { keyboardProps } = useKeyboard({
371
+ onKeyDown: (e) => {
372
+ if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
373
+ e.preventDefault();
374
+ const listState = listStateRef.current;
375
+ if (!listState)
376
+ return;
377
+ const { selectionManager, collection } = listState;
378
+ // Helper to collect visible item keys (supports sections)
379
+ const collectVisibleKeys = (nodes, out) => {
380
+ const term = searchValue.trim();
381
+ for (const node of nodes) {
382
+ if (node.type === 'item') {
383
+ const text = node.textValue ?? String(node.rendered ?? '');
384
+ if (!term || textFilterFn(text, term)) {
385
+ out.push(node.key);
386
+ }
387
+ }
388
+ else if (node.childNodes) {
389
+ collectVisibleKeys(node.childNodes, out);
390
+ }
391
+ }
392
+ };
393
+ const visibleKeys = [];
394
+ collectVisibleKeys(collection, visibleKeys);
395
+ if (visibleKeys.length === 0)
396
+ return;
397
+ const isArrowDown = e.key === 'ArrowDown';
398
+ const direction = isArrowDown ? 1 : -1;
399
+ const currentKey = selectionManager.focusedKey;
400
+ let nextKey = null;
401
+ if (currentKey == null) {
402
+ // If nothing focused yet, pick first/last depending on direction
403
+ nextKey = isArrowDown
404
+ ? visibleKeys[0]
405
+ : visibleKeys[visibleKeys.length - 1];
406
+ }
407
+ else {
408
+ const currentIndex = visibleKeys.indexOf(currentKey);
409
+ if (currentIndex !== -1) {
410
+ const newIndex = currentIndex + direction;
411
+ if (newIndex >= 0 && newIndex < visibleKeys.length) {
412
+ nextKey = visibleKeys[newIndex];
413
+ }
414
+ else {
415
+ // Wrap around
416
+ nextKey = isArrowDown
417
+ ? visibleKeys[0]
418
+ : visibleKeys[visibleKeys.length - 1];
419
+ }
420
+ }
421
+ else {
422
+ // Fallback
423
+ nextKey = isArrowDown
424
+ ? visibleKeys[0]
425
+ : visibleKeys[visibleKeys.length - 1];
426
+ }
427
+ }
428
+ if (nextKey != null) {
429
+ // Mark this focus change as keyboard navigation
430
+ if (listState.lastFocusSourceRef) {
431
+ listState.lastFocusSourceRef.current = 'keyboard';
432
+ }
433
+ selectionManager.setFocusedKey(nextKey);
434
+ }
435
+ }
436
+ else if (e.key === 'Home' ||
437
+ e.key === 'End' ||
438
+ e.key === 'PageUp' ||
439
+ e.key === 'PageDown') {
440
+ e.preventDefault();
441
+ const listState = listStateRef.current;
442
+ if (!listState)
443
+ return;
444
+ const { selectionManager, collection } = listState;
445
+ // Helper to collect visible item keys (supports sections)
446
+ const collectVisibleKeys = (nodes, out) => {
447
+ const term = searchValue.trim();
448
+ for (const node of nodes) {
449
+ if (node.type === 'item') {
450
+ const text = node.textValue ?? String(node.rendered ?? '');
451
+ if (!term || textFilterFn(text, term)) {
452
+ out.push(node.key);
453
+ }
454
+ }
455
+ else if (node.childNodes) {
456
+ collectVisibleKeys(node.childNodes, out);
457
+ }
458
+ }
459
+ };
460
+ const visibleKeys = [];
461
+ collectVisibleKeys(collection, visibleKeys);
462
+ if (visibleKeys.length === 0)
463
+ return;
464
+ const targetKey = e.key === 'Home' || e.key === 'PageUp'
465
+ ? visibleKeys[0]
466
+ : visibleKeys[visibleKeys.length - 1];
467
+ // Mark this focus change as keyboard navigation
468
+ if (listState.lastFocusSourceRef) {
469
+ listState.lastFocusSourceRef.current = 'keyboard';
470
+ }
471
+ selectionManager.setFocusedKey(targetKey);
472
+ }
473
+ else if (e.key === 'Enter' || (e.key === ' ' && !searchValue)) {
474
+ const listState = listStateRef.current;
475
+ if (!listState)
476
+ return;
477
+ const keyToSelect = listState.selectionManager.focusedKey;
478
+ if (keyToSelect != null) {
479
+ e.preventDefault();
480
+ listState.selectionManager.select(keyToSelect, e);
481
+ if (e.key === 'Enter' &&
482
+ isCheckable &&
483
+ onEscape &&
484
+ selectionMode === 'multiple') {
485
+ onEscape();
486
+ }
487
+ }
488
+ }
489
+ else if (e.key === 'Escape') {
490
+ if (searchValue) {
491
+ // Clear the current search if any text is present.
492
+ e.preventDefault();
493
+ setSearchValue('');
494
+ }
495
+ else {
496
+ // Notify parent that Escape was pressed on an empty input.
497
+ if (onEscape) {
498
+ e.preventDefault();
499
+ onEscape();
500
+ }
501
+ }
502
+ }
503
+ },
504
+ });
505
+ const mods = useMemo(() => ({
506
+ invalid: isInvalid,
507
+ valid: validationState === 'valid',
508
+ disabled: !!isDisabled,
509
+ focused: isFocused,
510
+ loading: !!isLoading,
511
+ searchable: true,
512
+ ...externalMods,
513
+ }), [
514
+ isInvalid,
515
+ validationState,
516
+ isDisabled,
517
+ isFocused,
518
+ isLoading,
519
+ externalMods,
520
+ ]);
521
+ const hasResults = enhancedChildren &&
522
+ (Array.isArray(enhancedChildren)
523
+ ? enhancedChildren.length > 0
524
+ : enhancedChildren !== null);
525
+ const showEmptyMessage = !hasResults && searchValue.trim();
526
+ // Handler must be defined before we render ListBox so we can pass it.
527
+ const handleSelectionChange = (selection) => {
528
+ if (allowsCustomValue) {
529
+ // Normalize current selection into an array of string keys
530
+ let selectedValues = [];
531
+ if (selection != null) {
532
+ if (Array.isArray(selection)) {
533
+ selectedValues = selection.map(String);
534
+ }
535
+ else {
536
+ selectedValues = [String(selection)];
537
+ }
538
+ }
539
+ // Build next custom keys set based on selected values
540
+ const nextSet = new Set();
541
+ selectedValues.forEach((val) => {
542
+ if (!originalKeys.has(val)) {
543
+ nextSet.add(val);
544
+ }
545
+ });
546
+ // Update internal custom keys state
547
+ setCustomKeys(nextSet);
548
+ }
549
+ if (externalOnSelectionChange) {
550
+ externalOnSelectionChange(selection);
551
+ }
552
+ };
553
+ // Custom option click handler that ensures search input receives focus
554
+ const handleOptionClick = (key) => {
555
+ // Focus the search input to enable keyboard navigation
556
+ // Use setTimeout to ensure this happens after React state updates
557
+ setTimeout(() => {
558
+ if (searchInputRef.current) {
559
+ searchInputRef.current.focus();
560
+ }
561
+ }, 0);
562
+ // Call the original onOptionClick if provided
563
+ if (onOptionClick) {
564
+ onOptionClick(key);
565
+ }
566
+ };
567
+ const searchInput = (_jsxs(SearchWrapperElement, { mods: mods, "data-size": "small", children: [_jsx(SearchInputElement, { ref: searchInputRef, "data-is-prefix": isLoading ? '' : undefined, type: "search", placeholder: searchPlaceholder, value: searchValue, disabled: isDisabled, autoFocus: autoFocus, "data-autofocus": autoFocus ? '' : undefined, styles: searchInputStyles, "data-size": size, role: "combobox", "aria-expanded": "true", "aria-haspopup": "listbox", "aria-activedescendant": listStateRef.current?.selectionManager.focusedKey != null
568
+ ? `ListBoxItem-${listStateRef.current?.selectionManager.focusedKey}`
569
+ : undefined, onChange: (e) => {
570
+ const value = e.target.value;
571
+ setSearchValue(value);
572
+ }, ...keyboardProps, ...modAttrs(mods) }), isLoading && (_jsx("div", { "data-element": "Prefix", children: _jsx("div", { "data-element": "InputIcon", children: isLoading ? _jsx(LoadingIcon, {}) : null }) }))] }));
573
+ const filterListBoxField = (_jsxs(FilterListBoxWrapperElement, { ref: ref, qa: qa || 'FilterListBox', ...modAttrs(mods), styles: styles, ...focusProps, children: [header ? (_jsx(StyledHeaderWithoutBorder, { "data-size": size, styles: headerStyles, children: header })) : (_jsx("div", { role: "presentation" })), searchInput, showEmptyMessage ? (_jsx("div", { style: { padding: '0.75rem 1rem' }, children: _jsx(Block, { preset: "t4", color: "#dark-03", children: emptyLabel !== undefined ? emptyLabel : 'No results found' }) })) : (_jsx(ListBox, { ref: listBoxRef, "aria-label": innerAriaLabel, selectedKey: selectedKey, defaultSelectedKey: defaultSelectedKey, selectedKeys: selectedKeys, defaultSelectedKeys: defaultSelectedKeys, selectionMode: selectionMode, isDisabled: isDisabled, listRef: listRef, stateRef: listStateRef, listStyles: listStyles, optionStyles: optionStyles, sectionStyles: sectionStyles, headingStyles: headingStyles, validationState: validationState, disallowEmptySelection: props.disallowEmptySelection, disabledKeys: props.disabledKeys, focusOnHover: focusOnHover, shouldUseVirtualFocus: true, footer: footer, footerStyles: footerStyles, mods: mods, size: size, isCheckable: isCheckable, onSelectionChange: handleSelectionChange, onEscape: onEscape, onOptionClick: handleOptionClick, children: finalChildren }))] }));
574
+ return wrapWithField(filterListBoxField, ref, mergeProps({ ...props, styles: undefined }, {}));
575
+ });
576
+ FilterListBox.Item = ListBox.Item;
577
+ FilterListBox.Section = BaseSection;
578
+ Object.defineProperty(FilterListBox, 'cubeInputType', {
579
+ value: 'FilterListBox',
580
+ enumerable: false,
581
+ configurable: false,
582
+ });
583
+
584
+
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @license MIT
3
+ * author: Cube Dev Team
4
+ * @cube-dev/ui-kit v0.69.0
5
+ * Released under the MIT license.
6
+ */
7
+
8
+ export * from './FilterListBox';
9
+
10
+