@cube-dev/ui-kit 0.0.0-canary-aedbcc7 → 0.0.0-canary-a46ac70

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 (447) hide show
  1. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  2. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  3. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  4. package/dist/_internal/hooks/use-event.js +1 -1
  5. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  6. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  7. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  8. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  9. package/dist/_internal/hooks/use-warn.js +1 -1
  10. package/dist/components/Block.js +1 -1
  11. package/dist/components/CollectionItem.js +1 -1
  12. package/dist/components/GlobalStyles.js +1 -1
  13. package/dist/components/GridProvider.js +1 -1
  14. package/dist/components/HiddenInput.js +1 -1
  15. package/dist/components/Root.js +1 -1
  16. package/dist/components/actions/Action/Action.js +1 -1
  17. package/dist/components/actions/Banner/Banner.js +1 -1
  18. package/dist/components/actions/Button/Button.js +1 -1
  19. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  20. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  21. package/dist/components/actions/ButtonSplit/context.js +1 -1
  22. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  23. package/dist/components/actions/CommandMenu/styled.js +1 -1
  24. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  25. package/dist/components/actions/ItemActionContext.js +1 -1
  26. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  27. package/dist/components/actions/Link/Link.js +1 -1
  28. package/dist/components/actions/Menu/Menu.js +1 -1
  29. package/dist/components/actions/Menu/MenuItem.js +1 -1
  30. package/dist/components/actions/Menu/MenuSection.js +1 -1
  31. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  32. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  33. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  34. package/dist/components/actions/Menu/context.js +1 -1
  35. package/dist/components/actions/Menu/styled.js +1 -1
  36. package/dist/components/actions/index.js +1 -1
  37. package/dist/components/actions/use-action.js +1 -1
  38. package/dist/components/actions/use-anchored-menu.js +1 -1
  39. package/dist/components/actions/use-context-menu.js +1 -1
  40. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  41. package/dist/components/content/Alert/Alert.js +1 -1
  42. package/dist/components/content/Alert/use-alert.js +1 -1
  43. package/dist/components/content/Avatar/Avatar.js +1 -1
  44. package/dist/components/content/Badge/Badge.js +1 -1
  45. package/dist/components/content/Card/Card.js +1 -1
  46. package/dist/components/content/Content.js +1 -1
  47. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  48. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  49. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  50. package/dist/components/content/Divider.js +1 -1
  51. package/dist/components/content/Footer.js +1 -1
  52. package/dist/components/content/Header.js +1 -1
  53. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  54. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  55. package/dist/components/content/Item/Item.js +2 -11
  56. package/dist/components/content/Item/Item.js.map +1 -1
  57. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  58. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  59. package/dist/components/content/Layout/GridLayout.js +1 -1
  60. package/dist/components/content/Layout/Layout.js +1 -1
  61. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  62. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  63. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  64. package/dist/components/content/Layout/LayoutContent.js +1 -1
  65. package/dist/components/content/Layout/LayoutContext.js +1 -1
  66. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  67. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  68. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  69. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  70. package/dist/components/content/Layout/LayoutPane.js +1 -1
  71. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  72. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  73. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  74. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  75. package/dist/components/content/Layout/index.js +1 -1
  76. package/dist/components/content/Layout/utils.js +1 -1
  77. package/dist/components/content/Paragraph.js +1 -1
  78. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  79. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  80. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  81. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  82. package/dist/components/content/Result/Result.js +1 -1
  83. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  84. package/dist/components/content/Tag/Tag.js +1 -1
  85. package/dist/components/content/Text.js +1 -1
  86. package/dist/components/content/TextItem/TextItem.js +1 -1
  87. package/dist/components/content/Title.js +1 -1
  88. package/dist/components/content/Tree/Tree.js +1 -1
  89. package/dist/components/content/Tree/TreeNode.js +1 -1
  90. package/dist/components/content/Tree/styled.js +1 -1
  91. package/dist/components/content/Tree/tree-index.js +1 -1
  92. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  93. package/dist/components/content/Tree/use-load-data.js +1 -1
  94. package/dist/components/content/highlightText.js +1 -1
  95. package/dist/components/content/use-auto-tooltip.js +1 -1
  96. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  97. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  98. package/dist/components/fields/Checkbox/context.js +1 -1
  99. package/dist/components/fields/ComboBox/ComboBox.js +213 -17
  100. package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
  101. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  102. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  103. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  104. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  105. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  106. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  107. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  108. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  109. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  110. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  111. package/dist/components/fields/DatePicker/intl.js +1 -1
  112. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  113. package/dist/components/fields/DatePicker/props.js +1 -1
  114. package/dist/components/fields/DatePicker/utils.js +1 -1
  115. package/dist/components/fields/FileInput/FileInput.js +1 -1
  116. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  117. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  118. package/dist/components/fields/Input/Input.js +1 -1
  119. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  120. package/dist/components/fields/ListBox/ListBox.d.ts +0 -5
  121. package/dist/components/fields/ListBox/ListBox.js +4 -10
  122. package/dist/components/fields/ListBox/ListBox.js.map +1 -1
  123. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  124. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  125. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  126. package/dist/components/fields/Picker/Picker.js +1 -1
  127. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  128. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  129. package/dist/components/fields/RadioGroup/context.js +1 -1
  130. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  131. package/dist/components/fields/Select/Select.js +1 -1
  132. package/dist/components/fields/Slider/Gradation.js +1 -1
  133. package/dist/components/fields/Slider/HueSlider.js +1 -1
  134. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  135. package/dist/components/fields/Slider/Slider.js +1 -1
  136. package/dist/components/fields/Slider/SliderBase.js +1 -1
  137. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  138. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  139. package/dist/components/fields/Slider/elements.js +1 -1
  140. package/dist/components/fields/Slider/index.js +1 -1
  141. package/dist/components/fields/Switch/Switch.js +1 -1
  142. package/dist/components/fields/TextArea/TextArea.js +1 -1
  143. package/dist/components/fields/TextInput/TextInput.js +1 -1
  144. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  145. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  146. package/dist/components/fields/index.d.ts +0 -2
  147. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  148. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  149. package/dist/components/form/Form/Field.js +1 -1
  150. package/dist/components/form/Form/Form.js +1 -1
  151. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  152. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  153. package/dist/components/form/Form/SubmitError.js +1 -1
  154. package/dist/components/form/Form/index.js +1 -1
  155. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  156. package/dist/components/form/Form/use-field/use-field.js +1 -1
  157. package/dist/components/form/Form/use-form.js +1 -1
  158. package/dist/components/form/Form/validation.js +1 -1
  159. package/dist/components/form/Label.js +1 -1
  160. package/dist/components/form/wrapper.js +1 -1
  161. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  162. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  163. package/dist/components/layout/Flex.js +1 -1
  164. package/dist/components/layout/Flow.js +1 -1
  165. package/dist/components/layout/Grid.js +1 -1
  166. package/dist/components/layout/Panel.js +1 -1
  167. package/dist/components/layout/Prefix.js +1 -1
  168. package/dist/components/layout/ResizablePanel.js +1 -1
  169. package/dist/components/layout/Space.js +1 -1
  170. package/dist/components/layout/Suffix.js +1 -1
  171. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  172. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  173. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  174. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  175. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  176. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  177. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  178. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  179. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  180. package/dist/components/navigation/Tabs/styled.js +1 -1
  181. package/dist/components/navigation/Tabs/types.js +1 -1
  182. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  183. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  184. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  185. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  186. package/dist/components/other/Calendar/Calendar.js +1 -1
  187. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  188. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  189. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  190. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  191. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  192. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  193. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  194. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  195. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  196. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  197. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  198. package/dist/components/overlays/Dialog/context.js +1 -1
  199. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  200. package/dist/components/overlays/Modal/Modal.js +1 -1
  201. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  202. package/dist/components/overlays/Modal/Overlay.js +1 -1
  203. package/dist/components/overlays/Modal/Popover.js +1 -1
  204. package/dist/components/overlays/Modal/Tray.js +1 -1
  205. package/dist/components/overlays/Modal/Underlay.js +1 -1
  206. package/dist/components/overlays/Notifications/Notification.js +1 -1
  207. package/dist/components/overlays/Notifications/NotificationAction.d.ts +2 -1
  208. package/dist/components/overlays/Notifications/NotificationAction.js +4 -6
  209. package/dist/components/overlays/Notifications/NotificationAction.js.map +1 -1
  210. package/dist/components/overlays/Notifications/NotificationCard.js +33 -20
  211. package/dist/components/overlays/Notifications/NotificationCard.js.map +1 -1
  212. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  213. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  214. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  215. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  216. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  217. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  218. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  219. package/dist/components/overlays/Notifications/index.js +1 -1
  220. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  221. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  222. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  223. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  224. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  225. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  226. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  227. package/dist/components/overlays/Toast/index.js +1 -1
  228. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  229. package/dist/components/overlays/Toast/useToast.js +1 -1
  230. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  231. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  232. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  233. package/dist/components/overlays/Tooltip/context.js +1 -1
  234. package/dist/components/portal/Portal.js +1 -1
  235. package/dist/components/portal/PortalProvider.js +1 -1
  236. package/dist/components/portal/usePortal.js +1 -1
  237. package/dist/components/shared/DraggableCollection.js +1 -1
  238. package/dist/components/shared/InvalidIcon.js +1 -1
  239. package/dist/components/shared/ValidIcon.js +1 -1
  240. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  241. package/dist/components/status/Spin/Cube.js +1 -1
  242. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  243. package/dist/components/status/Spin/Spin.js +1 -1
  244. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  245. package/dist/data/item-themes.js +1 -1
  246. package/dist/data/themes.js +1 -1
  247. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  248. package/dist/icons/AdjustmentsIcon.js +1 -1
  249. package/dist/icons/AiIcon.js +1 -1
  250. package/dist/icons/AreaChartIcon.js +1 -1
  251. package/dist/icons/BackwardIcon.js +1 -1
  252. package/dist/icons/BarChartIcon.js +1 -1
  253. package/dist/icons/BellFilledIcon.js +1 -1
  254. package/dist/icons/BellIcon.js +1 -1
  255. package/dist/icons/BooleanIcon.js +1 -1
  256. package/dist/icons/CalendarEditIcon.js +1 -1
  257. package/dist/icons/CalendarIcon.js +1 -1
  258. package/dist/icons/CaretDownIcon.js +1 -1
  259. package/dist/icons/CaretUpIcon.js +1 -1
  260. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  261. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  262. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  263. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  264. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  265. package/dist/icons/ChartBarLineIcon.js +1 -1
  266. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  267. package/dist/icons/ChartBarStackedIcon.js +1 -1
  268. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  269. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  270. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  271. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  272. package/dist/icons/ChartBubbleIcon.js +1 -1
  273. package/dist/icons/ChartDonut2Icon.js +1 -1
  274. package/dist/icons/ChartFunnelIcon.js +1 -1
  275. package/dist/icons/ChartHeatmapIcon.js +1 -1
  276. package/dist/icons/ChartKPIIcon.js +1 -1
  277. package/dist/icons/ChartPie2Icon.js +1 -1
  278. package/dist/icons/ChartScatterIcon.js +1 -1
  279. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  280. package/dist/icons/CheckCircleIcon.js +1 -1
  281. package/dist/icons/CheckIcon.js +1 -1
  282. package/dist/icons/CircleFilledIcon.js +1 -1
  283. package/dist/icons/ClearIcon.js +1 -1
  284. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  285. package/dist/icons/CloseCircleIcon.js +1 -1
  286. package/dist/icons/CloseIcon.js +1 -1
  287. package/dist/icons/CodeIcon.js +1 -1
  288. package/dist/icons/ColumnTotalIcon.js +1 -1
  289. package/dist/icons/CopyIcon.js +1 -1
  290. package/dist/icons/CountIcon.js +1 -1
  291. package/dist/icons/CubeIcon.js +1 -1
  292. package/dist/icons/CubePauseIcon.js +1 -1
  293. package/dist/icons/CubePlayIcon.js +1 -1
  294. package/dist/icons/CurrencyDollarIcon.js +1 -1
  295. package/dist/icons/DangerIcon.js +1 -1
  296. package/dist/icons/DashboardIcon.js +1 -1
  297. package/dist/icons/DatabaseIcon.js +1 -1
  298. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  299. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  300. package/dist/icons/DirectionIcon.js +1 -1
  301. package/dist/icons/DonutIcon.js +1 -1
  302. package/dist/icons/DownIcon.js +1 -1
  303. package/dist/icons/EditIcon.js +1 -1
  304. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  305. package/dist/icons/ExclamationCircleIcon.js +1 -1
  306. package/dist/icons/ExclamationIcon.js +1 -1
  307. package/dist/icons/EyeIcon.js +1 -1
  308. package/dist/icons/EyeInvisibleIcon.js +1 -1
  309. package/dist/icons/FilterIcon.js +1 -1
  310. package/dist/icons/FolderFilledIcon.js +1 -1
  311. package/dist/icons/FolderIcon.js +1 -1
  312. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  313. package/dist/icons/FolderOpenIcon.js +1 -1
  314. package/dist/icons/ForwardIcon.js +1 -1
  315. package/dist/icons/GripVerticalIcon.js +1 -1
  316. package/dist/icons/HierarchyIcon.js +1 -1
  317. package/dist/icons/HierarchyOpenIcon.js +1 -1
  318. package/dist/icons/Icon.js +1 -1
  319. package/dist/icons/InfoCircleIcon.js +1 -1
  320. package/dist/icons/InfoIcon.js +1 -1
  321. package/dist/icons/KeyIcon.js +1 -1
  322. package/dist/icons/LeftIcon.js +1 -1
  323. package/dist/icons/LineChartIcon.js +1 -1
  324. package/dist/icons/LoadingIcon.js +1 -1
  325. package/dist/icons/LockFilledIcon.js +1 -1
  326. package/dist/icons/LockIcon.js +1 -1
  327. package/dist/icons/MoreIcon.js +1 -1
  328. package/dist/icons/NotAllowedIcon.js +1 -1
  329. package/dist/icons/Number123Icon.js +1 -1
  330. package/dist/icons/NumberIcon.js +1 -1
  331. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  332. package/dist/icons/PauseCircleIcon.js +1 -1
  333. package/dist/icons/PauseIcon.js +1 -1
  334. package/dist/icons/PercentageIcon.js +1 -1
  335. package/dist/icons/PieChartIcon.js +1 -1
  336. package/dist/icons/PlayCircleIcon.js +1 -1
  337. package/dist/icons/PlayIcon.js +1 -1
  338. package/dist/icons/PlusIcon.js +1 -1
  339. package/dist/icons/ProgressBarIcon.js +1 -1
  340. package/dist/icons/ReloadIcon.js +1 -1
  341. package/dist/icons/ReportIcon.js +1 -1
  342. package/dist/icons/ReturnIcon.js +1 -1
  343. package/dist/icons/RightIcon.js +1 -1
  344. package/dist/icons/RowTotalsIcon.js +1 -1
  345. package/dist/icons/SchemeIcon.js +1 -1
  346. package/dist/icons/SearchIcon.js +1 -1
  347. package/dist/icons/SemanticQueryIcon.js +1 -1
  348. package/dist/icons/SettingsIcon.js +1 -1
  349. package/dist/icons/ShieldFilledIcon.js +1 -1
  350. package/dist/icons/ShieldIcon.js +1 -1
  351. package/dist/icons/SlashIcon.js +1 -1
  352. package/dist/icons/SparklesIcon.js +1 -1
  353. package/dist/icons/SqlIcon.js +1 -1
  354. package/dist/icons/StatsIcon.js +1 -1
  355. package/dist/icons/StopIcon.js +1 -1
  356. package/dist/icons/StringIcon.js +1 -1
  357. package/dist/icons/SubtotalsIcon.js +1 -1
  358. package/dist/icons/SwitchIcon.js +1 -1
  359. package/dist/icons/TableIcon.js +1 -1
  360. package/dist/icons/ThumbsDownIcon.js +1 -1
  361. package/dist/icons/ThumbsUpIcon.js +1 -1
  362. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  363. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  364. package/dist/icons/ThunderboltIcon.js +1 -1
  365. package/dist/icons/TimeIcon.js +1 -1
  366. package/dist/icons/TrashIcon.js +1 -1
  367. package/dist/icons/UnlockIcon.js +1 -1
  368. package/dist/icons/UpIcon.js +1 -1
  369. package/dist/icons/UserGroupIcon.js +1 -1
  370. package/dist/icons/UserIcon.js +1 -1
  371. package/dist/icons/UserLockIcon.js +1 -1
  372. package/dist/icons/ViewIcon.js +1 -1
  373. package/dist/icons/WarningFilledIcon.js +1 -1
  374. package/dist/icons/WarningIcon.js +1 -1
  375. package/dist/icons/wrap-icon.js +1 -1
  376. package/dist/index.d.ts +1 -2
  377. package/dist/index.js +2 -3
  378. package/dist/index.js.map +1 -1
  379. package/dist/provider.js +1 -1
  380. package/dist/providers/TrackingProvider.js +1 -1
  381. package/dist/providers/navigationAdapter.default.js +1 -1
  382. package/dist/tokens/base.js +1 -1
  383. package/dist/tokens/colors.js +1 -1
  384. package/dist/tokens/index.js +1 -1
  385. package/dist/tokens/layout.js +1 -1
  386. package/dist/tokens/palette.js +1 -1
  387. package/dist/tokens/shadows.js +1 -1
  388. package/dist/tokens/sizes.js +1 -1
  389. package/dist/tokens/spacing.js +1 -1
  390. package/dist/tokens/typography.js +1 -1
  391. package/dist/utils/ResizeSensor.js +1 -1
  392. package/dist/utils/is-dev-env.js +1 -1
  393. package/dist/utils/modules.js +1 -1
  394. package/dist/utils/promise.js +1 -1
  395. package/dist/utils/raf.js +1 -1
  396. package/dist/utils/random.js +1 -1
  397. package/dist/utils/range.js +1 -1
  398. package/dist/utils/react/RenderCache.js +1 -1
  399. package/dist/utils/react/Slots.js +1 -1
  400. package/dist/utils/react/chain.js +1 -1
  401. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  402. package/dist/utils/react/index.js +1 -1
  403. package/dist/utils/react/interactions.js +1 -1
  404. package/dist/utils/react/isTextOnly.js +1 -1
  405. package/dist/utils/react/mapProps.js +1 -1
  406. package/dist/utils/react/mergeProps.js +1 -1
  407. package/dist/utils/react/nullableValue.js +1 -1
  408. package/dist/utils/react/resolveIcon.js +1 -1
  409. package/dist/utils/react/sharedStore.js +1 -1
  410. package/dist/utils/react/useCombinedRefs.js +1 -1
  411. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  412. package/dist/utils/react/useEventBus.js +1 -1
  413. package/dist/utils/react/useId.js +1 -1
  414. package/dist/utils/react/useIsDarwin.js +1 -1
  415. package/dist/utils/react/useKeySymbols.js +1 -1
  416. package/dist/utils/react/useLayoutEffect.js +1 -1
  417. package/dist/utils/react/useLocalStorage.js +1 -1
  418. package/dist/utils/react/useMergeStyles.js +1 -1
  419. package/dist/utils/react/usePopoverSync.js +1 -1
  420. package/dist/utils/react/useQaProps.js +1 -1
  421. package/dist/utils/react/useViewportSize.js +1 -1
  422. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  423. package/dist/utils/selection.js +1 -1
  424. package/dist/utils/styles.js +1 -1
  425. package/dist/utils/tree.js +1 -1
  426. package/dist/utils/warnings.js +1 -1
  427. package/dist/version.js +2 -2
  428. package/package.json +1 -1
  429. package/dist/components/fields/CommandTextArea/CommandTextArea.d.ts +0 -99
  430. package/dist/components/fields/CommandTextArea/CommandTextArea.js +0 -383
  431. package/dist/components/fields/CommandTextArea/CommandTextArea.js.map +0 -1
  432. package/dist/components/fields/CommandTextArea/caretPosition.js +0 -89
  433. package/dist/components/fields/CommandTextArea/caretPosition.js.map +0 -1
  434. package/dist/components/fields/CommandTextArea/index.d.ts +0 -2
  435. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +0 -68
  436. package/dist/components/fields/CommandTextArea/useCaretAnchor.js.map +0 -1
  437. package/dist/components/fields/ListBoxPopover/ListBoxPopover.d.ts +0 -5
  438. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +0 -164
  439. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js.map +0 -1
  440. package/dist/components/fields/ListBoxPopover/index.d.ts +0 -4
  441. package/dist/components/fields/ListBoxPopover/listNavigation.d.ts +0 -24
  442. package/dist/components/fields/ListBoxPopover/listNavigation.js +0 -98
  443. package/dist/components/fields/ListBoxPopover/listNavigation.js.map +0 -1
  444. package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +0 -2
  445. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +0 -53
  446. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js.map +0 -1
  447. package/docs/components/fields/CommandTextArea.md +0 -153
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommandTextArea.js","names":["mergeProps","BaseSection"],"sources":["../../../../src/components/fields/CommandTextArea/CommandTextArea.tsx"],"sourcesContent":["import { Key } from '@react-types/shared';\nimport { Styles } from '@tenphi/tasty';\nimport React, {\n ForwardedRef,\n forwardRef,\n ReactElement,\n ReactNode,\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useFilter, useTextField } from 'react-aria';\nimport { Section as BaseSection, useListState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal';\nimport { useProviderProps } from '../../../provider';\nimport { generateRandomId } from '../../../utils/random';\nimport { chain, mergeProps, useCombinedRefs } from '../../../utils/react';\nimport {\n castNullableStringValue,\n WithNullableValue,\n} from '../../../utils/react/nullableValue';\nimport { CollectionItem as Item } from '../../CollectionItem';\nimport { useFieldProps, useFormProps } from '../../form';\nimport {\n filterCollectionNodes,\n getEdgeVisibleKey,\n getNextVisibleKey,\n ListBoxPopover,\n ListStateLike,\n markKeyboardFocus,\n TextFilterFn,\n useCompositeFocus,\n} from '../ListBoxPopover';\nimport {\n CubeTextInputBaseProps,\n TextInputBase,\n} from '../TextInput/TextInputBase';\n\nimport { useCaretAnchor } from './useCaretAnchor';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single trigger character with optional placement constraint. */\nexport interface CommandTrigger {\n /** The character that opens the autocomplete (e.g. `/` or `@`). */\n char: string;\n /**\n * When true, the trigger token must start at the beginning of the line the\n * caret is on (right after a newline, or at the very start of the input) —\n * i.e. line-scoped slash commands. When false, the token may appear after\n * any whitespace, anywhere in the text (Slack/Notion-style).\n */\n atLineStart?: boolean;\n}\n\n/** Result of scanning the textarea for an active trigger token. */\nexport interface ActiveToken {\n /** The matched trigger descriptor. */\n trigger: CommandTrigger;\n /** The active token text, INCLUDING the trigger char (e.g. `/cle`). */\n token: string;\n /** Inclusive start index of the token in the textarea value. */\n start: number;\n /** Exclusive end index of the token (caret position while typing). */\n end: number;\n}\n\nexport type CommandTextAreaFilterFn = TextFilterFn;\n\nexport interface CubeCommandTextAreaProps<T>\n extends Omit<CubeTextInputBaseProps, 'children' | 'multiLine'> {\n /** Whether the textarea should resize to fit its content. */\n autoSize?: boolean;\n /** Max visible rows when `autoSize` is true. Defaults to 10. */\n maxRows?: number;\n /** Number of visible rows. Defaults to 3. */\n rows?: number;\n\n /** Command/option source (alternative to JSX children). */\n items?: Iterable<T>;\n /** Static items or a render function (same shape as ComboBox/ListBox). */\n children?: ReactNode | ((item: T) => ReactElement);\n /**\n * Triggers that open the autocomplete. Defaults to a single slash command\n * that must start at the beginning of the input.\n */\n triggers?: CommandTrigger[];\n /**\n * Custom filter. Pass `false` to disable internal filtering (server-side).\n */\n filter?: CommandTextAreaFilterFn | false;\n /**\n * Fired when the user picks a command (Enter/Tab/click). The option's\n * `textValue` is also inserted into the textarea regardless.\n */\n onCommand?: (key: Key, item: { textValue: string; [k: string]: any }) => void;\n /** Insert a trailing space after the chosen command. Defaults to true. */\n insertSpaceAfter?: boolean;\n /** Keys of disabled options. */\n disabledKeys?: Iterable<Key>;\n /** Popover placement. Chat inputs usually want `top`. Defaults to `top`. */\n direction?: 'bottom' | 'top';\n /** Whether the popover should flip when overflowing. Defaults to true. */\n shouldFlip?: boolean;\n /** Offset between the textarea and the popover. */\n overlayOffset?: number;\n /** Padding between the popover and the viewport edge. */\n containerPadding?: number;\n\n // Refs\n /** Ref for the textarea element. */\n inputRef?: RefObject<HTMLTextAreaElement>;\n /** Ref for the wrapper element (popover anchor). */\n wrapperRef?: RefObject<HTMLDivElement>;\n /** Ref for the popover overlay element. */\n popoverRef?: RefObject<HTMLDivElement>;\n /** Ref for the listbox element. */\n listBoxRef?: RefObject<HTMLDivElement>;\n /** Ref through which the internal list state is exposed. */\n listStateRef?: RefObject<ListStateLike | null>;\n\n // Style props\n overlayStyles?: any;\n listBoxStyles?: any;\n optionStyles?: any;\n sectionStyles?: any;\n headingStyles?: any;\n}\n\nconst DEFAULT_TRIGGERS: CommandTrigger[] = [{ char: '/', atLineStart: true }];\n\n// ---------------------------------------------------------------------------\n// Trigger parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Inspect the textarea contents up to the caret and find the active trigger\n * token, if any. The token includes the trigger character and ends at the\n * caret (so it grows as the user types). A token ends at whitespace or the end\n * of the input.\n */\nexport function parseActiveToken(\n value: string,\n caret: number,\n triggers: CommandTrigger[],\n): ActiveToken | null {\n if (!triggers.length) return null;\n const before = value.slice(0, caret);\n const after = value.slice(caret);\n\n for (const trigger of triggers) {\n const ch = trigger.char;\n if (trigger.atLineStart) {\n // Line-start command: the trigger char must sit at the start of the line\n // the caret is on (right after a newline, or at index 0), with no\n // whitespace between it and the caret. On a single-line input with no\n // newlines this is equivalent to \"index 0 of the whole input\".\n const lineStart = before.lastIndexOf('\\n') + 1;\n const linePrefix = before.slice(lineStart);\n if (linePrefix[0] !== ch) continue;\n // No whitespace allowed within the token (after the trigger char).\n const wsIndex = linePrefix.slice(1).search(/\\s/);\n if (wsIndex !== -1) continue;\n if (!linePrefix) continue;\n return { trigger, token: linePrefix, start: lineStart, end: caret };\n }\n\n // Caret-token mode: find the last trigger char that begins a token at or\n // after a line start / whitespace boundary, with no whitespace between it\n // and the caret.\n const match = /(?:^|\\s)([\\S]+)$/.exec(before);\n if (!match) continue;\n const candidate = match[1];\n if (candidate[0] !== ch) continue;\n // Ensure the token hasn't already been closed by whitespace after caret.\n // (If there's non-whitespace after the caret, the user is mid-token.)\n const start = caret - candidate.length;\n // If immediately after the caret there's whitespace (or end), the token is\n // \"complete\" — still offer completions as long as the caret sits on the\n // token. We accept it.\n void after;\n return { trigger, token: candidate, start, end: caret };\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nfunction CommandTextArea<T extends object>(\n props: WithNullableValue<CubeCommandTextAreaProps<T>>,\n ref: ForwardedRef<HTMLElement>,\n) {\n props = castNullableStringValue(props);\n props = useProviderProps(props);\n props = useFormProps(props);\n props = useFieldProps(props, {\n defaultValidationTrigger: 'onBlur',\n valuePropsMapper: ({ value, onChange }) => ({\n onChange,\n value: value?.toString() ?? '',\n }),\n });\n\n let {\n qa,\n autoSize = false,\n isDisabled = false,\n isReadOnly = false,\n isRequired = false,\n onChange,\n maxRows = 10,\n rows = 3,\n labelProps: userLabelProps,\n inputRef: propsInputRef,\n value,\n placeholder,\n // command props\n items,\n children: renderChildren,\n triggers = DEFAULT_TRIGGERS,\n filter,\n onCommand,\n insertSpaceAfter = true,\n disabledKeys,\n direction = 'top',\n shouldFlip = true,\n overlayOffset = 8,\n containerPadding = 8,\n overlayStyles,\n listBoxStyles,\n optionStyles,\n sectionStyles,\n headingStyles,\n wrapperRef: propsWrapperRef,\n popoverRef: propsPopoverRef,\n listBoxRef: propsListBoxRef,\n listStateRef: propsListStateRef,\n onKeyDown,\n onFocus,\n onBlur,\n ...otherProps\n } = props;\n\n rows = Math.max(rows, 1);\n maxRows = Math.max(maxRows, rows);\n\n // ---- refs -------------------------------------------------------------\n const localInputRef = useRef<HTMLTextAreaElement>(null);\n const inputRef = (propsInputRef ??\n localInputRef) as RefObject<HTMLTextAreaElement>;\n const wrapperRef = useCombinedRefs(propsWrapperRef);\n const popoverRef = useCombinedRefs(propsPopoverRef);\n const listBoxRef = useCombinedRefs(propsListBoxRef);\n const listStateRef = (propsListStateRef ??\n useRef<ListStateLike | null>(null)) as RefObject<ListStateLike | null>;\n\n const commandTextAreaId = useMemo(() => generateRandomId(), []);\n\n // ---- controlled / uncontrolled value ----------------------------------\n // When no `value` is provided (standalone, no form), track the text\n // internally so trigger detection and commit still work.\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n (value as string) ?? '',\n );\n const effectiveValue: string = isControlled\n ? (value as string)\n : internalValue;\n const handleChange = useEvent((next: string) => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n });\n\n // ---- children / items normalization -----------------------------------\n let children: ReactNode = renderChildren as ReactNode;\n const renderFn = renderChildren as unknown;\n if (items && typeof renderFn === 'function') {\n const itemsArray = Array.from(items as Iterable<any>);\n children = itemsArray.map((item, idx) => {\n const rendered = (renderFn as (it: any) => ReactNode)(item);\n if (\n React.isValidElement(rendered) &&\n (rendered as ReactElement).key == null\n ) {\n return React.cloneElement(rendered as ReactElement, {\n key: (rendered as any)?.key ?? item?.key ?? idx,\n });\n }\n return rendered as ReactNode;\n });\n }\n\n // ---- caret tracking ---------------------------------------------------\n // The caret drives trigger detection. We keep it in state so a caret move\n // (arrow keys without typing) re-renders and recomputes the active token.\n const [caret, setCaret] = useState(() => effectiveValue.length);\n const syncCaret = useEvent(() => {\n const el = inputRef.current;\n if (!el) return;\n setCaret(el.selectionStart ?? el.value.length);\n });\n\n // ---- trigger detection ------------------------------------------------\n const activeToken = useMemo(\n () => parseActiveToken(effectiveValue, caret, triggers),\n [effectiveValue, caret, triggers],\n );\n\n // The active token includes the trigger char (e.g. `/co`). Strip it before\n // filtering so the query is matched against the meaningful text — this lets\n // options match by their label/description (which don't contain the trigger\n // char) as well as by their `textValue`.\n const term = useMemo(() => {\n if (!activeToken) return '';\n const { token, trigger } = activeToken;\n return token.startsWith(trigger.char)\n ? token.slice(trigger.char.length)\n : token;\n }, [activeToken]);\n\n // ---- filtering --------------------------------------------------------\n const { contains } = useFilter({ sensitivity: 'base' });\n const textFilterFn = useMemo<CommandTextAreaFilterFn>(\n () => (filter === false ? () => true : filter || contains),\n [filter, contains],\n );\n\n // Local collection used to read option textValues and to count matches.\n const localCollectionState = useListState({\n children: children as any,\n items: items as any,\n selectionMode: 'none',\n });\n\n const filterFn = useCallback(\n (nodes: Iterable<any>) => filterCollectionNodes(nodes, term, textFilterFn),\n [term, textFilterFn],\n );\n\n // Count filtered options (flatten sections) to decide whether to show.\n const filteredCount = useMemo(() => {\n if (!activeToken) return 0;\n const filtered = filterFn(localCollectionState.collection);\n let count = 0;\n for (const node of filtered as Iterable<any>) {\n if (node.type === 'section' && node.childNodes) {\n for (const child of node.childNodes) {\n if (child.type === 'item') count++;\n }\n } else if (node.type === 'item') {\n count++;\n }\n }\n return count;\n }, [activeToken, filterFn, localCollectionState.collection]);\n\n // ---- dismiss handling (Escape keeps the text but hides the popover) ---\n const [dismissedToken, setDismissedToken] = useState<string | null>(null);\n // Bumped whenever we move the virtual focus so the textarea's\n // `aria-activedescendant` (read from the ListBox's stateRef at render time)\n // stays in sync — the ListBox's own state update does not re-render us.\n const [, setFocusTick] = useState(0);\n const bumpFocus = useEvent(() => setFocusTick((t) => t + 1));\n // Reset dismissal whenever the active token changes (user typed/backspaced).\n useEffect(() => {\n setDismissedToken((prev) =>\n prev != null && activeToken?.token !== prev ? null : prev,\n );\n }, [activeToken?.token]);\n\n const isCommandMode = !!activeToken && activeToken.token !== dismissedToken;\n const shouldShowPopover = isCommandMode && filteredCount > 0;\n\n // ---- caret-anchored popover ------------------------------------------\n // A zero-size element positioned at the caret (both axes) drives the\n // popover's geometry; the wrapper remains the dismiss/outside-click trigger.\n const { anchorRef: caretAnchorRef, positionApiRef } = useCaretAnchor({\n inputRef: inputRef as RefObject<HTMLTextAreaElement>,\n wrapperRef: wrapperRef as RefObject<HTMLElement>,\n caret,\n value: effectiveValue,\n isActive: shouldShowPopover,\n });\n\n // ---- height autosize (mirrors TextArea) -------------------------------\n const adjustHeight = useEvent(() => {\n const textarea = inputRef.current;\n if (!textarea || !autoSize) return;\n\n textarea.style.height = 'auto';\n const computedStyle = getComputedStyle(textarea);\n const paddingTop = parseFloat(computedStyle.paddingTop) || 0;\n const paddingBottom = parseFloat(computedStyle.paddingBottom) || 0;\n const borderTop = parseFloat(computedStyle.borderTopWidth) || 0;\n const borderBottom = parseFloat(computedStyle.borderBottomWidth) || 0;\n const lineHeight = parseInt(computedStyle.lineHeight) || 20;\n const contentHeight = textarea.scrollHeight - paddingTop - paddingBottom;\n const computedRows = Math.ceil(contentHeight / lineHeight);\n const targetRows = Math.max(Math.min(computedRows, maxRows), rows);\n const totalHeight =\n targetRows * lineHeight +\n paddingTop +\n paddingBottom +\n borderTop +\n borderBottom;\n textarea.style.height = `${totalHeight}px`;\n });\n\n // ---- useTextField (ARIA wiring for the textarea) ----------------------\n let { labelProps, inputProps } = useTextField(\n {\n ...otherProps,\n value: effectiveValue,\n placeholder,\n isDisabled,\n isReadOnly,\n isRequired,\n onChange: chain(handleChange, adjustHeight),\n inputElementType: 'textarea',\n } as any,\n inputRef as any,\n );\n\n const mergedLabelProps = mergeProps(labelProps, userLabelProps);\n\n const useEnvironmentalEffect =\n typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\n useEnvironmentalEffect(() => {\n if (!autoSize || !inputRef.current) return;\n adjustHeight();\n const resizeObserver = new ResizeObserver(adjustHeight);\n resizeObserver.observe(inputRef.current);\n return () => resizeObserver.disconnect();\n }, [autoSize, inputRef.current]);\n\n useEnvironmentalEffect(() => {\n if (autoSize && inputRef.current) {\n adjustHeight();\n }\n }, [effectiveValue]);\n\n // ---- caret restore after commit --------------------------------------\n const pendingCaretRef = useRef<number | null>(null);\n useEnvironmentalEffect(() => {\n if (pendingCaretRef.current != null && inputRef.current) {\n const pos = pendingCaretRef.current;\n pendingCaretRef.current = null;\n inputRef.current.focus();\n inputRef.current.setSelectionRange(pos, pos);\n setCaret(pos);\n }\n }, [effectiveValue]);\n\n // ---- helpers ----------------------------------------------------------\n const getItemTextValue = useCallback(\n (key: Key): string => {\n const item = localCollectionState?.collection?.getItem(key);\n return item?.textValue || String(key);\n },\n [localCollectionState?.collection],\n );\n\n // ---- commit (insert the chosen option's literal value) ---------------\n const commit = useEvent((key: Key) => {\n const listState = listStateRef.current;\n const textValue = getItemTextValue(key);\n const token = activeToken;\n const el = inputRef.current;\n\n if (token) {\n const next =\n effectiveValue.slice(0, token.start) +\n textValue +\n (insertSpaceAfter ? ' ' : '') +\n effectiveValue.slice(token.end);\n const caretPos =\n token.start + textValue.length + (insertSpaceAfter ? 1 : 0);\n pendingCaretRef.current = caretPos;\n handleChange(next);\n // If controlled, caret is restored by the effect above; if not, set now.\n if (el) {\n el.focus();\n try {\n el.setSelectionRange(caretPos, caretPos);\n } catch {\n /* noop */\n }\n }\n } else if (el) {\n // Fallback: insert at caret.\n const start = el.selectionStart ?? effectiveValue.length;\n const end = el.selectionEnd ?? effectiveValue.length;\n const next =\n effectiveValue.slice(0, start) +\n textValue +\n (insertSpaceAfter ? ' ' : '') +\n effectiveValue.slice(end);\n const caretPos = start + textValue.length + (insertSpaceAfter ? 1 : 0);\n pendingCaretRef.current = caretPos;\n handleChange(next);\n }\n\n setDismissedToken(null);\n onCommand?.(key, {\n textValue,\n ...(listState?.collection?.getItem(key)?.props ?? {}),\n });\n });\n\n // ---- keyboard navigation (only while the popover is open) -------------\n const onKeyDownHandler = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n\n if (!shouldShowPopover) {\n // While not in command mode, the textarea behaves normally; but clear\n // any dismissal when the user edits.\n return;\n }\n\n const listState = listStateRef.current;\n\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n if (!listState) return;\n e.preventDefault();\n const nextKey = getNextVisibleKey(\n listState,\n e.key === 'ArrowDown' ? 1 : -1,\n );\n if (nextKey != null) {\n markKeyboardFocus(listState);\n listState.selectionManager.setFocusedKey(nextKey);\n bumpFocus();\n }\n } else if (e.key === 'Home' || e.key === 'End') {\n if (!listState) return;\n e.preventDefault();\n const edgeKey = getEdgeVisibleKey(\n listState,\n e.key === 'Home' ? 'first' : 'last',\n );\n if (edgeKey != null) {\n markKeyboardFocus(listState);\n listState.selectionManager.setFocusedKey(edgeKey);\n bumpFocus();\n }\n } else if (e.key === 'Enter' || e.key === 'Tab') {\n if (!listState) return;\n const focused = listState.selectionManager.focusedKey;\n if (focused != null) {\n e.preventDefault();\n commit(focused);\n }\n // Otherwise pass through (newline / form submit / tab navigation).\n } else if (e.key === 'Escape') {\n e.preventDefault();\n if (activeToken) {\n setDismissedToken(activeToken.token);\n }\n }\n },\n [shouldShowPopover, activeToken, commit, onKeyDown, listStateRef],\n );\n\n // ---- initial focus on the first option when the popover opens ---------\n const focusInitAttemptsRef = useRef(0);\n useLayoutEffect(() => {\n if (!shouldShowPopover) return;\n focusInitAttemptsRef.current = 0;\n\n const tick = () => {\n if (!shouldShowPopover) return;\n const listState = listStateRef.current;\n if (!listState) {\n focusInitAttemptsRef.current += 1;\n if (focusInitAttemptsRef.current < 8) {\n requestAnimationFrame(tick);\n }\n return;\n }\n if (listState.selectionManager.focusedKey == null) {\n const first = getEdgeVisibleKey(listState, 'first');\n if (first != null) {\n markKeyboardFocus(listState);\n listState.selectionManager.setFocusedKey(first);\n bumpFocus();\n }\n }\n };\n\n requestAnimationFrame(() => requestAnimationFrame(tick));\n }, [shouldShowPopover]);\n\n // ---- composite focus (wrapper + portaled popover) ---------------------\n const { compositeFocusProps } = useCompositeFocus({\n wrapperRef: wrapperRef as RefObject<HTMLElement>,\n popoverRef: popoverRef as RefObject<HTMLElement>,\n onFocus,\n onBlur,\n isDisabled,\n });\n\n // ---- aria-activedescendant -------------------------------------------\n const focusedKey = listStateRef.current?.selectionManager.focusedKey ?? null;\n const listBoxId = `CommandTextAreaListBox-${commandTextAreaId}`;\n\n // ---- popover width ----------------------------------------------------\n // The popover is anchored to the caret (a point), so it must not be sized to\n // the textarea. We use the same default as the shared `ListBoxPopover` /\n // `Picker` popovers: a `30x` floor (240px), `max-content` preferred, `50vw`\n // cap. The concrete floor keeps the virtualized ListBox from collapsing to a\n // sliver (it has no intrinsic width), and `max-content` lets short option\n // lists size to their content. The user's `overlayStyles` still win on top.\n const popoverOverlayStyles: Styles = {\n width: '30x max-content 50vw',\n ...overlayStyles,\n };\n\n // ---- assemble input props ---------------------------------------------\n const commandInputProps = mergeProps(inputProps, {\n role: 'combobox',\n 'aria-autocomplete': 'list',\n 'aria-expanded': shouldShowPopover,\n 'aria-haspopup': 'listbox',\n 'aria-controls': shouldShowPopover ? listBoxId : undefined,\n 'aria-activedescendant':\n shouldShowPopover && focusedKey != null\n ? `ListBoxItem-${focusedKey}`\n : undefined,\n onKeyDown: onKeyDownHandler,\n onSelect: syncCaret,\n onKeyUp: syncCaret,\n onClick: syncCaret,\n 'data-input-type': 'command-textarea',\n });\n\n // ---- render -----------------------------------------------------------\n const field = (\n <TextInputBase\n ref={ref as any}\n {...otherProps}\n multiLine\n qa={qa}\n inputRef={inputRef}\n wrapperRef={wrapperRef}\n wrapperProps={compositeFocusProps}\n labelProps={mergedLabelProps}\n inputProps={commandInputProps}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isRequired={isRequired}\n rows={rows}\n />\n );\n\n return (\n <>\n {field}\n <ListBoxPopover\n isOpen={shouldShowPopover}\n triggerRef={wrapperRef as RefObject<HTMLElement>}\n positionTargetRef={caretAnchorRef as RefObject<Element | null>}\n positionApiRef={positionApiRef}\n popoverRef={popoverRef}\n listBoxRef={listBoxRef}\n direction={direction}\n shouldFlip={shouldFlip}\n overlayOffset={overlayOffset}\n containerPadding={containerPadding}\n listBoxId={listBoxId}\n overlayStyles={popoverOverlayStyles}\n listBoxStyles={listBoxStyles}\n optionStyles={optionStyles}\n optionHighlight={term}\n sectionStyles={sectionStyles}\n headingStyles={headingStyles}\n isDisabled={isDisabled}\n disabledKeys={disabledKeys}\n items={items as any}\n listStateRef={listStateRef}\n ariaLabel={\n (props as any)['aria-label'] ||\n (typeof otherProps.label === 'string' ? otherProps.label : 'Commands')\n }\n compositeFocusProps={compositeFocusProps}\n filter={filterFn}\n onClose={() => {\n if (activeToken) setDismissedToken(activeToken.token);\n }}\n onSelectionChange={(selection) => {\n const key = Array.isArray(selection) ? selection[0] : selection;\n if (key != null) commit(key);\n }}\n >\n {children as any}\n </ListBoxPopover>\n </>\n );\n}\n\nconst _CommandTextArea = forwardRef(CommandTextArea) as unknown as (<T>(\n props: CubeCommandTextAreaProps<T> & {\n ref?: ForwardedRef<HTMLElement>;\n },\n) => ReactElement) & {\n Item: typeof Item;\n Section: typeof BaseSection;\n};\n\nObject.assign(_CommandTextArea, {\n Item,\n Section: BaseSection,\n displayName: 'CommandTextArea',\n});\n\nObject.defineProperty(_CommandTextArea, 'cubeInputType', {\n value: 'CommandTextArea',\n enumerable: false,\n configurable: false,\n});\n\nexport { _CommandTextArea as CommandTextArea };\n"],"mappings":"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"}
@@ -1,89 +0,0 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-aedbcc7 | Cube Dev Team */
2
- //#region src/components/fields/CommandTextArea/caretPosition.ts
3
- const MIRROR_STYLES = [
4
- "boxSizing",
5
- "width",
6
- "height",
7
- "overflowX",
8
- "overflowY",
9
- "paddingTop",
10
- "paddingRight",
11
- "paddingBottom",
12
- "paddingLeft",
13
- "borderTopWidth",
14
- "borderRightWidth",
15
- "borderBottomWidth",
16
- "borderLeftWidth",
17
- "fontStyle",
18
- "fontVariant",
19
- "fontWeight",
20
- "fontStretch",
21
- "fontSize",
22
- "fontSizeAdjust",
23
- "lineHeight",
24
- "fontFamily",
25
- "textAlign",
26
- "textTransform",
27
- "textIndent",
28
- "textDecoration",
29
- "letterSpacing",
30
- "wordSpacing",
31
- "tabSize",
32
- "whiteSpace",
33
- "wordWrap",
34
- "wordBreak",
35
- "overflowWrap"
36
- ];
37
- /**
38
- * Returns the viewport-space rect of the caret at `index` within `textarea`,
39
- * or `null` if it can't be measured (e.g. jsdom, no layout, detached node).
40
- */
41
- function getCaretRect(textarea, index) {
42
- if (typeof document === "undefined") return null;
43
- const doc = textarea.ownerDocument;
44
- const style = doc.defaultView?.getComputedStyle(textarea);
45
- if (!style) return null;
46
- const box = textarea.getBoundingClientRect();
47
- if (box.width === 0 && box.height === 0) return null;
48
- const mirror = doc.createElement("div");
49
- mirror.setAttribute("data-caret-mirror", "");
50
- mirror.style.position = "absolute";
51
- mirror.style.visibility = "hidden";
52
- mirror.style.whiteSpace = "pre-wrap";
53
- mirror.style.wordWrap = "break-word";
54
- mirror.style.top = "0";
55
- mirror.style.left = "0";
56
- mirror.style.overflow = "hidden";
57
- for (const prop of MIRROR_STYLES) {
58
- const value = style[prop];
59
- if (value != null) mirror.style.setProperty(prop.replace(/[A-Z]/g, (m) => "-" + m.toLowerCase()), value);
60
- }
61
- mirror.style.width = style.width;
62
- const value = textarea.value;
63
- const before = value.slice(0, index);
64
- const after = value.slice(index) || ".";
65
- mirror.textContent = before;
66
- const marker = doc.createElement("span");
67
- marker.textContent = after;
68
- marker.style.display = "inline-block";
69
- mirror.appendChild(marker);
70
- doc.body.appendChild(mirror);
71
- let rect = null;
72
- try {
73
- const mirrorRect = mirror.getBoundingClientRect();
74
- const markerRect = marker.getBoundingClientRect();
75
- const { scrollTop, scrollLeft } = textarea;
76
- rect = {
77
- left: box.left - scrollLeft + (markerRect.left - mirrorRect.left),
78
- top: box.top - scrollTop + (markerRect.top - mirrorRect.top),
79
- height: markerRect.height || parseFloat(style.lineHeight) || 0
80
- };
81
- } finally {
82
- mirror.remove();
83
- }
84
- return rect.height > 0 ? rect : null;
85
- }
86
-
87
- //#endregion
88
- export { getCaretRect };
89
- //# sourceMappingURL=caretPosition.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"caretPosition.js","names":[],"sources":["../../../../src/components/fields/CommandTextArea/caretPosition.ts"],"sourcesContent":["/**\n * Computes the caret's position for a `<textarea>` using a mirror-element\n * technique. jsdom returns zeros (no layout), but in a real browser this gives\n * the caret's viewport coordinates and its line height, so a popover can be\n * anchored to it.\n */\n\nexport interface CaretRect {\n /** Caret left edge, in viewport coordinates (px). */\n left: number;\n /** Caret top edge, in viewport coordinates (px). */\n top: number;\n /** Caret height (the textarea's line height), in px. */\n height: number;\n}\n\n// Computed styles that affect text wrapping / caret placement inside a textarea.\nconst MIRROR_STYLES: ReadonlyArray<keyof CSSStyleDeclaration> = [\n 'boxSizing',\n 'width',\n 'height',\n 'overflowX',\n 'overflowY',\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'fontStyle',\n 'fontVariant',\n 'fontWeight',\n 'fontStretch',\n 'fontSize',\n 'fontSizeAdjust',\n 'lineHeight',\n 'fontFamily',\n 'textAlign',\n 'textTransform',\n 'textIndent',\n 'textDecoration',\n 'letterSpacing',\n 'wordSpacing',\n 'tabSize',\n 'whiteSpace',\n 'wordWrap',\n 'wordBreak',\n 'overflowWrap',\n];\n\n/**\n * Returns the viewport-space rect of the caret at `index` within `textarea`,\n * or `null` if it can't be measured (e.g. jsdom, no layout, detached node).\n */\nexport function getCaretRect(\n textarea: HTMLTextAreaElement,\n index: number,\n): CaretRect | null {\n if (typeof document === 'undefined') return null;\n\n const doc = textarea.ownerDocument;\n const style = doc.defaultView?.getComputedStyle(textarea);\n if (!style) return null;\n\n // Bail out in environments without real layout (jsdom reports 0x0).\n const box = textarea.getBoundingClientRect();\n if (box.width === 0 && box.height === 0) return null;\n\n const mirror = doc.createElement('div');\n mirror.setAttribute('data-caret-mirror', '');\n mirror.style.position = 'absolute';\n mirror.style.visibility = 'hidden';\n mirror.style.whiteSpace = 'pre-wrap';\n mirror.style.wordWrap = 'break-word';\n mirror.style.top = '0';\n mirror.style.left = '0';\n // Prevent the mirror from affecting scroll/anchor lookups.\n mirror.style.overflow = 'hidden';\n\n for (const prop of MIRROR_STYLES) {\n const value = style[prop];\n if (value != null) {\n mirror.style.setProperty(\n prop.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase()),\n value,\n );\n }\n }\n\n // Match the textarea's content width, not its border-box scroll width.\n mirror.style.width = style.width;\n\n const value = textarea.value;\n const before = value.slice(0, index);\n const after = value.slice(index) || '.';\n\n mirror.textContent = before;\n\n const marker = doc.createElement('span');\n marker.textContent = after;\n marker.style.display = 'inline-block';\n mirror.appendChild(marker);\n\n // The mirror must be attached to the same document to inherit fonts.\n doc.body.appendChild(mirror);\n\n let rect: CaretRect | null = null;\n try {\n const mirrorRect = mirror.getBoundingClientRect();\n const markerRect = marker.getBoundingClientRect();\n // The mirror is not scrolled, so subtract the textarea's scroll to map the\n // unscrolled caret offset back into viewport space.\n const { scrollTop, scrollLeft } = textarea;\n rect = {\n left: box.left - scrollLeft + (markerRect.left - mirrorRect.left),\n top: box.top - scrollTop + (markerRect.top - mirrorRect.top),\n height: markerRect.height || parseFloat(style.lineHeight) || 0,\n };\n } finally {\n mirror.remove();\n }\n\n return rect.height > 0 ? rect : null;\n}\n"],"mappings":";;AAiBA,MAAM,gBAA0D;CAC9D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;AAMD,SAAgB,aACd,UACA,OACkB;AAClB,KAAI,OAAO,aAAa,YAAa,QAAO;CAE5C,MAAM,MAAM,SAAS;CACrB,MAAM,QAAQ,IAAI,aAAa,iBAAiB,SAAS;AACzD,KAAI,CAAC,MAAO,QAAO;CAGnB,MAAM,MAAM,SAAS,uBAAuB;AAC5C,KAAI,IAAI,UAAU,KAAK,IAAI,WAAW,EAAG,QAAO;CAEhD,MAAM,SAAS,IAAI,cAAc,MAAM;AACvC,QAAO,aAAa,qBAAqB,GAAG;AAC5C,QAAO,MAAM,WAAW;AACxB,QAAO,MAAM,aAAa;AAC1B,QAAO,MAAM,aAAa;AAC1B,QAAO,MAAM,WAAW;AACxB,QAAO,MAAM,MAAM;AACnB,QAAO,MAAM,OAAO;AAEpB,QAAO,MAAM,WAAW;AAExB,MAAK,MAAM,QAAQ,eAAe;EAChC,MAAM,QAAQ,MAAM;AACpB,MAAI,SAAS,KACX,QAAO,MAAM,YACX,KAAK,QAAQ,WAAW,MAAM,MAAM,EAAE,aAAa,CAAC,EACpD,MACD;;AAKL,QAAO,MAAM,QAAQ,MAAM;CAE3B,MAAM,QAAQ,SAAS;CACvB,MAAM,SAAS,MAAM,MAAM,GAAG,MAAM;CACpC,MAAM,QAAQ,MAAM,MAAM,MAAM,IAAI;AAEpC,QAAO,cAAc;CAErB,MAAM,SAAS,IAAI,cAAc,OAAO;AACxC,QAAO,cAAc;AACrB,QAAO,MAAM,UAAU;AACvB,QAAO,YAAY,OAAO;AAG1B,KAAI,KAAK,YAAY,OAAO;CAE5B,IAAI,OAAyB;AAC7B,KAAI;EACF,MAAM,aAAa,OAAO,uBAAuB;EACjD,MAAM,aAAa,OAAO,uBAAuB;EAGjD,MAAM,EAAE,WAAW,eAAe;AAClC,SAAO;GACL,MAAM,IAAI,OAAO,cAAc,WAAW,OAAO,WAAW;GAC5D,KAAK,IAAI,MAAM,aAAa,WAAW,MAAM,WAAW;GACxD,QAAQ,WAAW,UAAU,WAAW,MAAM,WAAW,IAAI;GAC9D;WACO;AACR,SAAO,QAAQ;;AAGjB,QAAO,KAAK,SAAS,IAAI,OAAO"}
@@ -1,2 +0,0 @@
1
-
2
- import { ActiveToken, CommandTextAreaFilterFn, CommandTrigger, CubeCommandTextAreaProps, _CommandTextArea } from "./CommandTextArea.js";
@@ -1,68 +0,0 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-aedbcc7 | Cube Dev Team */
2
- import { getCaretRect } from "./caretPosition.js";
3
- import { useEffect, useLayoutEffect, useRef } from "react";
4
-
5
- //#region src/components/fields/CommandTextArea/useCaretAnchor.ts
6
- /**
7
- * Keeps a zero-size "caret anchor" element positioned at the textarea's caret
8
- * (both axes), inside the (position: relative) input wrapper. The anchor is a
9
- * real DOM node so react-aria's `useOverlayPosition` can measure it with
10
- * `getBoundingClientRect`, while interaction/outside-click stays on the
11
- * wrapper via a separate `triggerRef`.
12
- */
13
- function useCaretAnchor({ inputRef, wrapperRef, caret, value, isActive }) {
14
- const anchorRef = useRef(null);
15
- const positionApiRef = useRef(null);
16
- useEffect(() => {
17
- const wrapper = wrapperRef.current;
18
- if (!wrapper) return;
19
- const anchor = document.createElement("span");
20
- anchor.setAttribute("data-caret-anchor", "");
21
- anchor.style.position = "absolute";
22
- anchor.style.top = "0";
23
- anchor.style.left = "0";
24
- anchor.style.width = "0";
25
- anchor.style.height = "0";
26
- anchor.style.pointerEvents = "none";
27
- anchor.style.overflow = "hidden";
28
- anchor.style.opacity = "0";
29
- wrapper.appendChild(anchor);
30
- anchorRef.current = anchor;
31
- return () => {
32
- anchor.remove();
33
- anchorRef.current = null;
34
- };
35
- }, [wrapperRef]);
36
- useLayoutEffect(() => {
37
- const anchor = anchorRef.current;
38
- const wrapper = wrapperRef.current;
39
- const input = inputRef.current;
40
- if (!anchor || !wrapper || !input) return;
41
- if (!isActive) {
42
- anchor.style.transform = "translate(0px, 0px)";
43
- return;
44
- }
45
- const rect = getCaretRect(input, caret);
46
- if (!rect) return;
47
- const wrapperRect = wrapper.getBoundingClientRect();
48
- const x = rect.left - wrapperRect.left;
49
- const y = rect.top - wrapperRect.top;
50
- anchor.style.transform = `translate(${x}px, ${y}px)`;
51
- anchor.style.height = `${rect.height}px`;
52
- positionApiRef.current?.updatePosition();
53
- }, [
54
- caret,
55
- value,
56
- isActive,
57
- inputRef,
58
- wrapperRef
59
- ]);
60
- return {
61
- anchorRef,
62
- positionApiRef
63
- };
64
- }
65
-
66
- //#endregion
67
- export { useCaretAnchor };
68
- //# sourceMappingURL=useCaretAnchor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCaretAnchor.js","names":[],"sources":["../../../../src/components/fields/CommandTextArea/useCaretAnchor.ts"],"sourcesContent":["import { RefObject, useEffect, useLayoutEffect, useRef } from 'react';\n\nimport { CaretRect, getCaretRect } from './caretPosition';\n\nexport interface CaretAnchorApi {\n updatePosition: () => void;\n}\n\nexport interface UseCaretAnchorOptions {\n inputRef: RefObject<HTMLTextAreaElement>;\n wrapperRef: RefObject<HTMLElement>;\n caret: number;\n value: string;\n isActive: boolean;\n}\n\nexport interface UseCaretAnchorResult {\n /** A real (zero-size) element positioned at the caret; used as the popover's\n * geometric anchor. `null` until the wrapper mounts. */\n anchorRef: RefObject<HTMLElement | null>;\n /** Imperative handle to force the popover to re-position. */\n positionApiRef: RefObject<CaretAnchorApi | null>;\n}\n\n/**\n * Keeps a zero-size \"caret anchor\" element positioned at the textarea's caret\n * (both axes), inside the (position: relative) input wrapper. The anchor is a\n * real DOM node so react-aria's `useOverlayPosition` can measure it with\n * `getBoundingClientRect`, while interaction/outside-click stays on the\n * wrapper via a separate `triggerRef`.\n */\nexport function useCaretAnchor({\n inputRef,\n wrapperRef,\n caret,\n value,\n isActive,\n}: UseCaretAnchorOptions): UseCaretAnchorResult {\n const anchorRef = useRef<HTMLElement | null>(null);\n const positionApiRef = useRef<CaretAnchorApi | null>(null);\n\n // Lazily create the anchor element inside the wrapper and clean it up on\n // unmount. It is not managed by React so the shared TextInputBase structure\n // stays untouched.\n useEffect(() => {\n const wrapper = wrapperRef.current;\n if (!wrapper) return;\n\n const anchor = document.createElement('span');\n anchor.setAttribute('data-caret-anchor', '');\n anchor.style.position = 'absolute';\n anchor.style.top = '0';\n anchor.style.left = '0';\n anchor.style.width = '0';\n anchor.style.height = '0';\n anchor.style.pointerEvents = 'none';\n // Off the flow so it never affects layout or a11y.\n anchor.style.overflow = 'hidden';\n anchor.style.opacity = '0';\n wrapper.appendChild(anchor);\n anchorRef.current = anchor;\n\n return () => {\n anchor.remove();\n anchorRef.current = null;\n };\n }, [wrapperRef]);\n\n // Position the anchor at the caret whenever the caret/value/active state\n // changes, then nudge the popover to re-anchor.\n useLayoutEffect(() => {\n const anchor = anchorRef.current;\n const wrapper = wrapperRef.current;\n const input = inputRef.current;\n if (!anchor || !wrapper || !input) return;\n\n if (!isActive) {\n // Reset to the wrapper's origin when not active so a stale position is\n // never measured if the popover reopens without a caret move.\n anchor.style.transform = 'translate(0px, 0px)';\n return;\n }\n\n const rect = getCaretRect(input, caret);\n if (!rect) return;\n\n const wrapperRect = wrapper.getBoundingClientRect();\n // Position relative to the wrapper's border-box (it's position: relative).\n const x = rect.left - wrapperRect.left;\n const y = rect.top - wrapperRect.top;\n anchor.style.transform = `translate(${x}px, ${y}px)`;\n // Give it a real height so cross-axis centering uses the caret line.\n anchor.style.height = `${rect.height}px`;\n\n positionApiRef.current?.updatePosition();\n }, [caret, value, isActive, inputRef, wrapperRef]);\n\n return { anchorRef, positionApiRef };\n}\n"],"mappings":";;;;;;;;;;;;AA+BA,SAAgB,eAAe,EAC7B,UACA,YACA,OACA,OACA,YAC8C;CAC9C,MAAM,YAAY,OAA2B,KAAK;CAClD,MAAM,iBAAiB,OAA8B,KAAK;AAK1D,iBAAgB;EACd,MAAM,UAAU,WAAW;AAC3B,MAAI,CAAC,QAAS;EAEd,MAAM,SAAS,SAAS,cAAc,OAAO;AAC7C,SAAO,aAAa,qBAAqB,GAAG;AAC5C,SAAO,MAAM,WAAW;AACxB,SAAO,MAAM,MAAM;AACnB,SAAO,MAAM,OAAO;AACpB,SAAO,MAAM,QAAQ;AACrB,SAAO,MAAM,SAAS;AACtB,SAAO,MAAM,gBAAgB;AAE7B,SAAO,MAAM,WAAW;AACxB,SAAO,MAAM,UAAU;AACvB,UAAQ,YAAY,OAAO;AAC3B,YAAU,UAAU;AAEpB,eAAa;AACX,UAAO,QAAQ;AACf,aAAU,UAAU;;IAErB,CAAC,WAAW,CAAC;AAIhB,uBAAsB;EACpB,MAAM,SAAS,UAAU;EACzB,MAAM,UAAU,WAAW;EAC3B,MAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,UAAU,CAAC,WAAW,CAAC,MAAO;AAEnC,MAAI,CAAC,UAAU;AAGb,UAAO,MAAM,YAAY;AACzB;;EAGF,MAAM,OAAO,aAAa,OAAO,MAAM;AACvC,MAAI,CAAC,KAAM;EAEX,MAAM,cAAc,QAAQ,uBAAuB;EAEnD,MAAM,IAAI,KAAK,OAAO,YAAY;EAClC,MAAM,IAAI,KAAK,MAAM,YAAY;AACjC,SAAO,MAAM,YAAY,aAAa,EAAE,MAAM,EAAE;AAEhD,SAAO,MAAM,SAAS,GAAG,KAAK,OAAO;AAErC,iBAAe,SAAS,gBAAgB;IACvC;EAAC;EAAO;EAAO;EAAU;EAAU;EAAW,CAAC;AAElD,QAAO;EAAE;EAAW;EAAgB"}
@@ -1,5 +0,0 @@
1
-
2
- import { Styles } from "@tenphi/tasty";
3
- import React, { ReactNode, RefObject } from "react";
4
- import "react/jsx-runtime";
5
- import { Key as Key$1 } from "@react-types/shared";
@@ -1,164 +0,0 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-aedbcc7 | Cube Dev Team */
2
- import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
- import { DisplayTransition } from "../../helpers/DisplayTransition/DisplayTransition.js";
4
- import { Portal } from "../../portal/Portal.js";
5
- import { ListBox } from "../ListBox/ListBox.js";
6
- import { tasty } from "@tenphi/tasty";
7
- import React, { useCallback, useEffect, useRef } from "react";
8
- import { jsx } from "react/jsx-runtime";
9
- import { useOverlay, useOverlayPosition } from "react-aria";
10
-
11
- //#region src/components/fields/ListBoxPopover/ListBoxPopover.tsx
12
- const ListBoxPopoverWrapper = tasty({
13
- qa: "ComboBoxOverlayWrapper",
14
- styles: {
15
- position: "absolute",
16
- zIndex: 1e3
17
- }
18
- });
19
- const ListBoxPopoverElement = tasty({
20
- qa: "ComboBoxOverlay",
21
- styles: {
22
- display: "grid",
23
- gridRows: "1sf",
24
- gridColumns: "1sf",
25
- width: "$overlay-min-width max-content 50vw",
26
- height: "initial max-content (50vh - 5x)",
27
- overflow: "auto",
28
- fill: "#surface",
29
- radius: "1cr",
30
- shadow: true,
31
- padding: "0",
32
- border: "#border",
33
- hide: {
34
- "": false,
35
- hidden: true
36
- },
37
- boxSizing: "border-box",
38
- transition: "translate $transition ease-out, scale $transition ease-out, theme $transition ease-out",
39
- translate: {
40
- "": "0 0",
41
- "open & [data-placement=\"top\"]": "0 0",
42
- "!open & [data-placement=\"top\"]": "0 1x",
43
- "open & ([data-placement=\"bottom\"] | ![data-placement])": "0 0",
44
- "!open & ([data-placement=\"bottom\"] | ![data-placement])": "0 -1x"
45
- },
46
- transformOrigin: {
47
- "": "top center",
48
- "[data-placement=\"top\"]": "bottom center"
49
- },
50
- scale: {
51
- "": "1 1",
52
- "!open": "1 .9"
53
- },
54
- opacity: {
55
- "": 1,
56
- "!open": .001
57
- },
58
- "$overlay-min-width": "min 30x"
59
- }
60
- });
61
- const ListBoxPopover = function ListBoxPopover(props) {
62
- const { isOpen, triggerRef, popoverRef, listBoxRef, direction, shouldFlip, overlayOffset, containerPadding, comboBoxWidth, listBoxId, overlayStyles, listBoxStyles, optionStyles, optionHighlight, sectionStyles, headingStyles, selectedKey, isDisabled, disabledKeys, items, children, listStateRef, onSelectionChange, onClose, label, ariaLabel, compositeFocusProps, filter, size = "medium", positionTargetRef, positionApiRef } = props;
63
- const mergedPopoverRef = popoverRef;
64
- const overlayScrollRef = useRef(null);
65
- const { overlayProps: overlayPositionProps, placement, updatePosition } = useOverlayPosition({
66
- targetRef: positionTargetRef ?? triggerRef,
67
- overlayRef: mergedPopoverRef,
68
- scrollRef: overlayScrollRef,
69
- placement: `${direction} start`,
70
- shouldFlip,
71
- isOpen,
72
- offset: overlayOffset,
73
- containerPadding
74
- });
75
- const { maxHeight, maxWidth, ...positionStyle } = overlayPositionProps.style ?? {};
76
- useEffect(() => {
77
- if (positionApiRef) positionApiRef.current = { updatePosition };
78
- return () => {
79
- if (positionApiRef) positionApiRef.current = null;
80
- };
81
- }, [positionApiRef, updatePosition]);
82
- const { overlayProps: overlayBehaviorProps } = useOverlay({
83
- onClose,
84
- shouldCloseOnBlur: true,
85
- isOpen,
86
- isDismissable: true,
87
- shouldCloseOnInteractOutside: (el) => {
88
- const menuTriggerEl = el.closest("[data-popover-trigger]");
89
- if (!menuTriggerEl) {
90
- if (el.closest("[data-popover-keep]")) return false;
91
- if (el.closest("[data-popover-dismiss]")) {
92
- setTimeout(onClose, 0);
93
- return false;
94
- }
95
- return true;
96
- }
97
- if (menuTriggerEl === triggerRef?.current) return true;
98
- return false;
99
- }
100
- }, mergedPopoverRef);
101
- const placementDirection = placement?.split(" ")[0] || direction;
102
- const transitionRefHolder = useRef(null);
103
- const setScrollRef = useCallback((node) => {
104
- overlayScrollRef.current = node;
105
- transitionRefHolder.current?.(node);
106
- }, []);
107
- return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(DisplayTransition, {
108
- isShown: isOpen,
109
- children: ({ phase, isShown, ref: transitionRef }) => {
110
- transitionRefHolder.current = transitionRef;
111
- return /* @__PURE__ */ jsx(ListBoxPopoverWrapper, {
112
- ...mergeProps$1({
113
- ...overlayPositionProps,
114
- style: positionStyle
115
- }, overlayBehaviorProps, compositeFocusProps),
116
- ref: mergedPopoverRef,
117
- style: positionStyle,
118
- children: /* @__PURE__ */ jsx(ListBoxPopoverElement, {
119
- ref: setScrollRef,
120
- "data-placement": placementDirection,
121
- "data-phase": phase,
122
- mods: {
123
- open: isShown,
124
- hidden: phase === "unmounted"
125
- },
126
- styles: overlayStyles,
127
- style: {
128
- "--overlay-min-width": comboBoxWidth ? `${comboBoxWidth}px` : void 0,
129
- maxHeight,
130
- maxWidth
131
- },
132
- children: /* @__PURE__ */ jsx(ListBox, {
133
- ref: listBoxRef,
134
- focusOnHover: true,
135
- disableSelectionToggle: true,
136
- id: listBoxId,
137
- "aria-label": ariaLabel || (typeof label === "string" ? label : "Options"),
138
- selectedKey,
139
- selectionMode: "single",
140
- isDisabled,
141
- disabledKeys,
142
- shouldUseVirtualFocus: true,
143
- items,
144
- filter,
145
- styles: listBoxStyles,
146
- optionStyles,
147
- optionHighlight,
148
- sectionStyles,
149
- headingStyles,
150
- stateRef: listStateRef,
151
- size: "medium",
152
- shape: "popover",
153
- onSelectionChange,
154
- children
155
- })
156
- })
157
- });
158
- }
159
- }) });
160
- };
161
-
162
- //#endregion
163
- export { ListBoxPopover };
164
- //# sourceMappingURL=ListBoxPopover.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ListBoxPopover.js","names":["mergeProps"],"sources":["../../../../src/components/fields/ListBoxPopover/ListBoxPopover.tsx"],"sourcesContent":["import { Key } from '@react-types/shared';\nimport { Styles, tasty } from '@tenphi/tasty';\nimport React, {\n CSSProperties,\n ReactNode,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n} from 'react';\nimport { useOverlay, useOverlayPosition } from 'react-aria';\n\nimport { mergeProps } from '../../../utils/react';\nimport { DisplayTransition } from '../../helpers';\nimport { Portal } from '../../portal';\nimport { ListBox } from '../ListBox/ListBox';\n\nexport interface ListBoxPopoverProps {\n isOpen: boolean;\n triggerRef: RefObject<HTMLElement>;\n popoverRef: RefObject<HTMLDivElement>;\n listBoxRef: RefObject<HTMLDivElement>;\n direction: 'bottom' | 'top';\n shouldFlip: boolean;\n overlayOffset: number;\n containerPadding: number;\n /** Min width (px) for the overlay; usually the trigger's width. */\n comboBoxWidth?: number;\n /** Stable id used for the ListBox element and aria-controls wiring. */\n listBoxId: string;\n overlayStyles?: Styles;\n listBoxStyles?: Styles;\n optionStyles?: Styles;\n /** Substring to highlight within each option's (text) children. */\n optionHighlight?: string;\n sectionStyles?: Styles;\n headingStyles?: Styles;\n selectedKey?: Key | null;\n isDisabled?: boolean;\n disabledKeys?: Iterable<Key>;\n items?: Iterable<any>;\n children: ReactNode;\n /** Ref through which the ListBox exposes its internal list state. */\n listStateRef: RefObject<any>;\n onSelectionChange: (selection: Key | Key[] | null) => void;\n onClose: () => void;\n label?: ReactNode;\n ariaLabel?: string;\n compositeFocusProps: {\n onFocus: (e: React.FocusEvent) => void;\n onBlur: (e: React.FocusEvent) => void;\n };\n /** Collection node filter applied to the ListBox. */\n filter?: (nodes: Iterable<any>) => Iterable<any>;\n size?: 'small' | 'medium' | 'large' | (string & {});\n /**\n * Element to anchor the overlay to geometrically. Defaults to `triggerRef`.\n * Use this to anchor to something other than the trigger (e.g. the caret in\n * a textarea) while keeping `triggerRef` for outside-click/dismiss logic.\n */\n positionTargetRef?: RefObject<Element | null>;\n /**\n * Receives an imperative handle exposing `updatePosition()` so the caller can\n * force the overlay to re-anchor (e.g. when the caret moves).\n */\n positionApiRef?: RefObject<{ updatePosition: () => void } | null>;\n}\n\nconst ListBoxPopoverWrapper = tasty({\n qa: 'ComboBoxOverlayWrapper',\n styles: {\n position: 'absolute',\n zIndex: 1000,\n },\n});\n\nconst ListBoxPopoverElement = tasty({\n qa: 'ComboBoxOverlay',\n styles: {\n display: 'grid',\n gridRows: '1sf',\n gridColumns: '1sf',\n width: '$overlay-min-width max-content 50vw',\n height: 'initial max-content (50vh - 5x)',\n overflow: 'auto',\n fill: '#surface',\n radius: '1cr',\n shadow: true,\n padding: '0',\n border: '#border',\n hide: {\n '': false,\n hidden: true,\n },\n boxSizing: 'border-box',\n transition:\n 'translate $transition ease-out, scale $transition ease-out, theme $transition ease-out',\n translate: {\n '': '0 0',\n 'open & [data-placement=\"top\"]': '0 0',\n '!open & [data-placement=\"top\"]': '0 1x',\n 'open & ([data-placement=\"bottom\"] | ![data-placement])': '0 0',\n '!open & ([data-placement=\"bottom\"] | ![data-placement])': '0 -1x',\n },\n transformOrigin: {\n '': 'top center',\n '[data-placement=\"top\"]': 'bottom center',\n },\n scale: {\n '': '1 1',\n '!open': '1 .9',\n },\n opacity: {\n '': 1,\n '!open': 0.001,\n },\n\n '$overlay-min-width': 'min 30x',\n },\n});\n\nexport const ListBoxPopover = function ListBoxPopover(\n props: ListBoxPopoverProps,\n) {\n const {\n isOpen,\n triggerRef,\n popoverRef,\n listBoxRef,\n direction,\n shouldFlip,\n overlayOffset,\n containerPadding,\n comboBoxWidth,\n listBoxId,\n overlayStyles,\n listBoxStyles,\n optionStyles,\n optionHighlight,\n sectionStyles,\n headingStyles,\n selectedKey,\n isDisabled,\n disabledKeys,\n items,\n children,\n listStateRef,\n onSelectionChange,\n onClose,\n label,\n ariaLabel,\n compositeFocusProps,\n filter,\n size = 'medium',\n positionTargetRef,\n positionApiRef,\n } = props;\n\n const mergedPopoverRef = popoverRef;\n\n // Ref to the inner scrollable element (the visible popover). react-aria\n // measures this for its flip/shrink math and writes maxHeight onto the\n // overlay (positioning wrapper); we forward that maxHeight to this element\n // below so the scroll container actually shrinks instead of overflowing.\n const overlayScrollRef = useRef<HTMLDivElement | null>(null);\n\n // Overlay positioning — anchor to the explicit position target when given\n // (e.g. a caret anchor), otherwise to the trigger. `triggerRef` is still\n // used below for outside-click/dismiss behavior.\n const {\n overlayProps: overlayPositionProps,\n placement,\n updatePosition,\n } = useOverlayPosition({\n targetRef: (positionTargetRef ?? triggerRef) as any,\n overlayRef: mergedPopoverRef as any,\n scrollRef: overlayScrollRef as any,\n placement: `${direction} start` as any,\n shouldFlip,\n isOpen,\n offset: overlayOffset,\n containerPadding: containerPadding,\n });\n\n // Keep positioning (top/left/zIndex) on the wrapper, but split out the\n // available-space cap so it can be applied to the inner scroll element.\n const { maxHeight, maxWidth, ...positionStyle } =\n (overlayPositionProps.style ?? {}) as CSSProperties;\n\n // Expose updatePosition so callers can re-anchor on demand (e.g. caret move).\n useEffect(() => {\n if (positionApiRef) {\n positionApiRef.current = { updatePosition };\n }\n return () => {\n if (positionApiRef) {\n positionApiRef.current = null;\n }\n };\n }, [positionApiRef, updatePosition]);\n\n // Overlay behavior (dismiss on outside click, escape)\n const { overlayProps: overlayBehaviorProps } = useOverlay(\n {\n onClose,\n shouldCloseOnBlur: true,\n isOpen,\n isDismissable: true,\n shouldCloseOnInteractOutside: (el) => {\n const menuTriggerEl = el.closest('[data-popover-trigger]');\n if (!menuTriggerEl) {\n if (el.closest('[data-popover-keep]')) return false;\n // Plain interactive controls (Button, ItemButton) opt in via\n // `data-popover-dismiss` to dismiss us without losing their click\n // to useOverlay's stopPropagation. Schedule the close after the\n // click finishes so the button's onPress runs first.\n if (el.closest('[data-popover-dismiss]')) {\n setTimeout(onClose, 0);\n return false;\n }\n return true;\n }\n if (menuTriggerEl === triggerRef?.current) return true;\n return false;\n },\n },\n mergedPopoverRef as any,\n );\n\n // Extract primary placement direction for consistent styling\n const placementDirection = placement?.split(' ')[0] || direction;\n\n // Hold the DisplayTransition ref so we can bind the same node to both the\n // transition listener and our scroll ref via a single stable callback.\n const transitionRefHolder = useRef<\n ((node: HTMLElement | null) => void) | null\n >(null);\n const setScrollRef = useCallback((node: HTMLElement | null) => {\n overlayScrollRef.current = node as HTMLDivElement | null;\n transitionRefHolder.current?.(node);\n }, []);\n\n const overlayContent = (\n <DisplayTransition isShown={isOpen}>\n {({ phase, isShown, ref: transitionRef }) => {\n transitionRefHolder.current = transitionRef;\n return (\n <ListBoxPopoverWrapper\n {...mergeProps(\n { ...overlayPositionProps, style: positionStyle },\n overlayBehaviorProps,\n compositeFocusProps,\n )}\n ref={mergedPopoverRef}\n style={positionStyle}\n >\n <ListBoxPopoverElement\n ref={setScrollRef}\n data-placement={placementDirection}\n data-phase={phase}\n mods={{\n open: isShown,\n hidden: phase === 'unmounted',\n }}\n styles={overlayStyles}\n style={{\n '--overlay-min-width': comboBoxWidth\n ? `${comboBoxWidth}px`\n : undefined,\n maxHeight,\n maxWidth,\n }}\n >\n <ListBox\n ref={listBoxRef}\n focusOnHover\n disableSelectionToggle\n id={listBoxId}\n aria-label={\n ariaLabel || (typeof label === 'string' ? label : 'Options')\n }\n selectedKey={selectedKey}\n selectionMode=\"single\"\n isDisabled={isDisabled}\n disabledKeys={disabledKeys}\n shouldUseVirtualFocus={true}\n items={items as any}\n filter={filter}\n styles={listBoxStyles}\n optionStyles={optionStyles}\n optionHighlight={optionHighlight}\n sectionStyles={sectionStyles}\n headingStyles={headingStyles}\n stateRef={listStateRef}\n size=\"medium\"\n shape=\"popover\"\n onSelectionChange={onSelectionChange}\n >\n {children as any}\n </ListBox>\n </ListBoxPopoverElement>\n </ListBoxPopoverWrapper>\n );\n }}\n </DisplayTransition>\n );\n\n return <Portal>{overlayContent}</Portal>;\n};\n"],"mappings":"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"}
@@ -1,4 +0,0 @@
1
-
2
- import "./ListBoxPopover.js";
3
- import "./useCompositeFocus.js";
4
- import { ListStateLike, TextFilterFn } from "./listNavigation.js";
@@ -1,24 +0,0 @@
1
-
2
- import { Key } from "@react-types/shared";
3
-
4
- //#region src/components/fields/ListBoxPopover/listNavigation.d.ts
5
- /**
6
- * Minimal view of a React Stately list state. Kept structural (no imports from
7
- * `react-stately`) so the helpers can be used from any collection-backed
8
- * component without dragging extra types in.
9
- */
10
- interface ListStateLike {
11
- selectionManager: {
12
- focusedKey: Key | null;
13
- setFocusedKey: (key: Key | null) => void;
14
- };
15
- collection: Iterable<any>;
16
- disabledKeys?: Set<Key>;
17
- lastFocusSourceRef?: {
18
- current: 'keyboard' | 'mouse' | 'other';
19
- };
20
- }
21
- type TextFilterFn = (textValue: string, inputValue: string) => boolean;
22
- //#endregion
23
- export { ListStateLike, TextFilterFn };
24
- //# sourceMappingURL=listNavigation.d.ts.map
@@ -1,98 +0,0 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-aedbcc7 | Cube Dev Team */
2
- //#region src/components/fields/ListBoxPopover/listNavigation.ts
3
- /**
4
- * Walks a collection (possibly nested under sections) and collects the keys of
5
- * selectable items, skipping disabled ones. Mirrors the inline walker that
6
- * used to live in `useComboBoxKeyboard`.
7
- */
8
- function collectVisibleKeys(nodes, out, disabledKeys) {
9
- for (const node of nodes) if (node.type === "item") {
10
- if (!disabledKeys?.has(node.key)) out.push(node.key);
11
- } else if (node.childNodes) collectVisibleKeys(node.childNodes, out, disabledKeys);
12
- }
13
- /** Convenience: returns the flat list of selectable keys for a list state. */
14
- function getVisibleKeys(listState) {
15
- const keys = [];
16
- collectVisibleKeys(listState.collection, keys, listState.disabledKeys);
17
- return keys;
18
- }
19
- /**
20
- * Computes the next key to focus when navigating with ArrowUp/ArrowDown.
21
- *
22
- * - If `fromKey` is omitted, reads `selectionManager.focusedKey`.
23
- * - When nothing is focused (or the focused key is no longer visible), falls
24
- * back to the first/last visible key depending on `direction`.
25
- * - When the current key is the boundary, either returns `null` (default) or
26
- * wraps to the opposite edge when `opts.wrap` is true.
27
- */
28
- function getNextVisibleKey(listState, direction, opts) {
29
- const visibleKeys = getVisibleKeys(listState);
30
- if (visibleKeys.length === 0) return null;
31
- const isForward = direction === 1;
32
- const currentKey = opts?.fromKey ?? listState.selectionManager.focusedKey;
33
- if (currentKey == null) return isForward ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];
34
- const currentIndex = visibleKeys.indexOf(currentKey);
35
- if (currentIndex === -1) return isForward ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];
36
- const newIndex = currentIndex + direction;
37
- if (newIndex >= 0 && newIndex < visibleKeys.length) return visibleKeys[newIndex];
38
- if (opts?.wrap) return isForward ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];
39
- return null;
40
- }
41
- /** Returns the first or last selectable key. */
42
- function getEdgeVisibleKey(listState, edge) {
43
- const visibleKeys = getVisibleKeys(listState);
44
- if (visibleKeys.length === 0) return null;
45
- return edge === "first" ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];
46
- }
47
- /**
48
- * Marks a focus change as keyboard-driven so the underlying ListBox scrolls the
49
- * highlighted option into view. No-op when the list state doesn't expose a
50
- * `lastFocusSourceRef`.
51
- */
52
- function markKeyboardFocus(listState) {
53
- if (listState.lastFocusSourceRef) listState.lastFocusSourceRef.current = "keyboard";
54
- }
55
- /**
56
- * Collects the strings a node can be matched against: its `textValue` plus any
57
- * plain-text `children` and `description` props. Non-string children/description
58
- * (e.g. React elements) are ignored since we can't reliably read their text.
59
- */
60
- function getSearchableStrings(node) {
61
- const strings = [];
62
- if (node.textValue) strings.push(node.textValue);
63
- const props = node.props;
64
- if (props) {
65
- if (typeof props.children === "string") strings.push(props.children);
66
- if (typeof props.description === "string") strings.push(props.description);
67
- }
68
- return strings.length > 0 ? strings : [node.textValue || ""];
69
- }
70
- /** True when the term matches any of the node's searchable strings. */
71
- function nodeMatchesTerm(node, term, textFilterFn) {
72
- return getSearchableStrings(node).some((text) => textFilterFn(text, term));
73
- }
74
- /**
75
- * Filters collection nodes by a search term while preserving section structure.
76
- * A node matches when the term matches its `textValue`, its plain-text
77
- * `children`, or its plain-text `description`. Sections whose children all fail
78
- * the filter are dropped.
79
- */
80
- function filterCollectionNodes(nodes, term, textFilterFn) {
81
- if (!term) return nodes;
82
- return [...nodes].map((node) => {
83
- if (node.type === "section" && node.childNodes) {
84
- const filteredChildren = [...node.childNodes].filter((child) => nodeMatchesTerm(child, term, textFilterFn));
85
- if (filteredChildren.length === 0) return null;
86
- return {
87
- ...node,
88
- childNodes: filteredChildren,
89
- hasChildNodes: true
90
- };
91
- }
92
- return nodeMatchesTerm(node, term, textFilterFn) ? node : null;
93
- }).filter(Boolean);
94
- }
95
-
96
- //#endregion
97
- export { filterCollectionNodes, getEdgeVisibleKey, getNextVisibleKey, markKeyboardFocus };
98
- //# sourceMappingURL=listNavigation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"listNavigation.js","names":[],"sources":["../../../../src/components/fields/ListBoxPopover/listNavigation.ts"],"sourcesContent":["import { Key } from '@react-types/shared';\n\n/**\n * Minimal view of a React Stately list state. Kept structural (no imports from\n * `react-stately`) so the helpers can be used from any collection-backed\n * component without dragging extra types in.\n */\nexport interface ListStateLike {\n selectionManager: {\n focusedKey: Key | null;\n setFocusedKey: (key: Key | null) => void;\n };\n collection: Iterable<any>;\n disabledKeys?: Set<Key>;\n lastFocusSourceRef?: { current: 'keyboard' | 'mouse' | 'other' };\n}\n\nexport type NavigationDirection = 1 | -1;\nexport type NavigationEdge = 'first' | 'last';\n\n/**\n * Walks a collection (possibly nested under sections) and collects the keys of\n * selectable items, skipping disabled ones. Mirrors the inline walker that\n * used to live in `useComboBoxKeyboard`.\n */\nexport function collectVisibleKeys(\n nodes: Iterable<any>,\n out: Key[],\n disabledKeys?: Set<Key>,\n): void {\n for (const node of nodes) {\n if (node.type === 'item') {\n if (!disabledKeys?.has(node.key)) {\n out.push(node.key);\n }\n } else if (node.childNodes) {\n collectVisibleKeys(node.childNodes, out, disabledKeys);\n }\n }\n}\n\n/** Convenience: returns the flat list of selectable keys for a list state. */\nexport function getVisibleKeys(listState: ListStateLike): Key[] {\n const keys: Key[] = [];\n collectVisibleKeys(\n listState.collection,\n keys,\n listState.disabledKeys as Set<Key> | undefined,\n );\n return keys;\n}\n\n/**\n * Computes the next key to focus when navigating with ArrowUp/ArrowDown.\n *\n * - If `fromKey` is omitted, reads `selectionManager.focusedKey`.\n * - When nothing is focused (or the focused key is no longer visible), falls\n * back to the first/last visible key depending on `direction`.\n * - When the current key is the boundary, either returns `null` (default) or\n * wraps to the opposite edge when `opts.wrap` is true.\n */\nexport function getNextVisibleKey(\n listState: ListStateLike,\n direction: NavigationDirection,\n opts?: { wrap?: boolean; fromKey?: Key | null },\n): Key | null {\n const visibleKeys = getVisibleKeys(listState);\n if (visibleKeys.length === 0) return null;\n\n const isForward = direction === 1;\n const currentKey = opts?.fromKey ?? listState.selectionManager.focusedKey;\n\n if (currentKey == null) {\n return isForward ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];\n }\n\n const currentIndex = visibleKeys.indexOf(currentKey);\n\n if (currentIndex === -1) {\n // Focused item was filtered out — restart from the matching edge.\n return isForward ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];\n }\n\n const newIndex = currentIndex + direction;\n if (newIndex >= 0 && newIndex < visibleKeys.length) {\n return visibleKeys[newIndex];\n }\n\n if (opts?.wrap) {\n return isForward ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];\n }\n\n return null;\n}\n\n/** Returns the first or last selectable key. */\nexport function getEdgeVisibleKey(\n listState: ListStateLike,\n edge: NavigationEdge,\n): Key | null {\n const visibleKeys = getVisibleKeys(listState);\n if (visibleKeys.length === 0) return null;\n return edge === 'first'\n ? visibleKeys[0]\n : visibleKeys[visibleKeys.length - 1];\n}\n\n/**\n * Marks a focus change as keyboard-driven so the underlying ListBox scrolls the\n * highlighted option into view. No-op when the list state doesn't expose a\n * `lastFocusSourceRef`.\n */\nexport function markKeyboardFocus(listState: ListStateLike): void {\n if (listState.lastFocusSourceRef) {\n listState.lastFocusSourceRef.current = 'keyboard';\n }\n}\n\nexport type TextFilterFn = (textValue: string, inputValue: string) => boolean;\n\n/**\n * Collects the strings a node can be matched against: its `textValue` plus any\n * plain-text `children` and `description` props. Non-string children/description\n * (e.g. React elements) are ignored since we can't reliably read their text.\n */\nfunction getSearchableStrings(node: any): string[] {\n const strings: string[] = [];\n\n if (node.textValue) {\n strings.push(node.textValue);\n }\n\n const props = node.props;\n if (props) {\n if (typeof props.children === 'string') {\n strings.push(props.children);\n }\n if (typeof props.description === 'string') {\n strings.push(props.description);\n }\n }\n\n return strings.length > 0 ? strings : [node.textValue || ''];\n}\n\n/** True when the term matches any of the node's searchable strings. */\nfunction nodeMatchesTerm(\n node: any,\n term: string,\n textFilterFn: TextFilterFn,\n): boolean {\n return getSearchableStrings(node).some((text) => textFilterFn(text, term));\n}\n\n/**\n * Filters collection nodes by a search term while preserving section structure.\n * A node matches when the term matches its `textValue`, its plain-text\n * `children`, or its plain-text `description`. Sections whose children all fail\n * the filter are dropped.\n */\nexport function filterCollectionNodes(\n nodes: Iterable<any>,\n term: string,\n textFilterFn: TextFilterFn,\n): Iterable<any> {\n if (!term) {\n return nodes;\n }\n\n return [...nodes]\n .map((node: any) => {\n if (node.type === 'section' && node.childNodes) {\n const filteredChildren = [...node.childNodes].filter((child: any) =>\n nodeMatchesTerm(child, term, textFilterFn),\n );\n\n if (filteredChildren.length === 0) {\n return null;\n }\n\n return {\n ...node,\n childNodes: filteredChildren,\n hasChildNodes: true,\n };\n }\n\n return nodeMatchesTerm(node, term, textFilterFn) ? node : null;\n })\n .filter(Boolean);\n}\n"],"mappings":";;;;;;;AAyBA,SAAgB,mBACd,OACA,KACA,cACM;AACN,MAAK,MAAM,QAAQ,MACjB,KAAI,KAAK,SAAS,QAChB;MAAI,CAAC,cAAc,IAAI,KAAK,IAAI,CAC9B,KAAI,KAAK,KAAK,IAAI;YAEX,KAAK,WACd,oBAAmB,KAAK,YAAY,KAAK,aAAa;;;AAM5D,SAAgB,eAAe,WAAiC;CAC9D,MAAM,OAAc,EAAE;AACtB,oBACE,UAAU,YACV,MACA,UAAU,aACX;AACD,QAAO;;;;;;;;;;;AAYT,SAAgB,kBACd,WACA,WACA,MACY;CACZ,MAAM,cAAc,eAAe,UAAU;AAC7C,KAAI,YAAY,WAAW,EAAG,QAAO;CAErC,MAAM,YAAY,cAAc;CAChC,MAAM,aAAa,MAAM,WAAW,UAAU,iBAAiB;AAE/D,KAAI,cAAc,KAChB,QAAO,YAAY,YAAY,KAAK,YAAY,YAAY,SAAS;CAGvE,MAAM,eAAe,YAAY,QAAQ,WAAW;AAEpD,KAAI,iBAAiB,GAEnB,QAAO,YAAY,YAAY,KAAK,YAAY,YAAY,SAAS;CAGvE,MAAM,WAAW,eAAe;AAChC,KAAI,YAAY,KAAK,WAAW,YAAY,OAC1C,QAAO,YAAY;AAGrB,KAAI,MAAM,KACR,QAAO,YAAY,YAAY,KAAK,YAAY,YAAY,SAAS;AAGvE,QAAO;;;AAIT,SAAgB,kBACd,WACA,MACY;CACZ,MAAM,cAAc,eAAe,UAAU;AAC7C,KAAI,YAAY,WAAW,EAAG,QAAO;AACrC,QAAO,SAAS,UACZ,YAAY,KACZ,YAAY,YAAY,SAAS;;;;;;;AAQvC,SAAgB,kBAAkB,WAAgC;AAChE,KAAI,UAAU,mBACZ,WAAU,mBAAmB,UAAU;;;;;;;AAW3C,SAAS,qBAAqB,MAAqB;CACjD,MAAM,UAAoB,EAAE;AAE5B,KAAI,KAAK,UACP,SAAQ,KAAK,KAAK,UAAU;CAG9B,MAAM,QAAQ,KAAK;AACnB,KAAI,OAAO;AACT,MAAI,OAAO,MAAM,aAAa,SAC5B,SAAQ,KAAK,MAAM,SAAS;AAE9B,MAAI,OAAO,MAAM,gBAAgB,SAC/B,SAAQ,KAAK,MAAM,YAAY;;AAInC,QAAO,QAAQ,SAAS,IAAI,UAAU,CAAC,KAAK,aAAa,GAAG;;;AAI9D,SAAS,gBACP,MACA,MACA,cACS;AACT,QAAO,qBAAqB,KAAK,CAAC,MAAM,SAAS,aAAa,MAAM,KAAK,CAAC;;;;;;;;AAS5E,SAAgB,sBACd,OACA,MACA,cACe;AACf,KAAI,CAAC,KACH,QAAO;AAGT,QAAO,CAAC,GAAG,MAAM,CACd,KAAK,SAAc;AAClB,MAAI,KAAK,SAAS,aAAa,KAAK,YAAY;GAC9C,MAAM,mBAAmB,CAAC,GAAG,KAAK,WAAW,CAAC,QAAQ,UACpD,gBAAgB,OAAO,MAAM,aAAa,CAC3C;AAED,OAAI,iBAAiB,WAAW,EAC9B,QAAO;AAGT,UAAO;IACL,GAAG;IACH,YAAY;IACZ,eAAe;IAChB;;AAGH,SAAO,gBAAgB,MAAM,MAAM,aAAa,GAAG,OAAO;GAC1D,CACD,OAAO,QAAQ"}
@@ -1,2 +0,0 @@
1
-
2
- import React, { RefObject } from "react";