@cube-dev/ui-kit 0.0.0-canary-ccca45d → 0.0.0-canary-2256c47

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 (418) 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/Item/Item.js +1 -1
  55. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  56. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  57. package/dist/components/content/Layout/GridLayout.js +1 -1
  58. package/dist/components/content/Layout/Layout.js +1 -1
  59. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  60. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  61. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  62. package/dist/components/content/Layout/LayoutContent.js +1 -1
  63. package/dist/components/content/Layout/LayoutContext.js +1 -1
  64. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  65. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  66. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  67. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  68. package/dist/components/content/Layout/LayoutPane.js +1 -1
  69. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  70. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  71. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  72. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  73. package/dist/components/content/Layout/index.js +1 -1
  74. package/dist/components/content/Layout/utils.js +1 -1
  75. package/dist/components/content/Paragraph.js +1 -1
  76. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  77. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  78. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  79. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  80. package/dist/components/content/Result/Result.js +1 -1
  81. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  82. package/dist/components/content/Tag/Tag.js +1 -1
  83. package/dist/components/content/Text.js +1 -1
  84. package/dist/components/content/TextItem/TextItem.js +1 -1
  85. package/dist/components/content/Title.js +1 -1
  86. package/dist/components/content/Tree/Tree.js +78 -148
  87. package/dist/components/content/Tree/Tree.js.map +1 -1
  88. package/dist/components/content/Tree/TreeNode.js +17 -64
  89. package/dist/components/content/Tree/TreeNode.js.map +1 -1
  90. package/dist/components/content/Tree/styled.js +1 -3
  91. package/dist/components/content/Tree/styled.js.map +1 -1
  92. package/dist/components/content/Tree/tree-index.js +1 -1
  93. package/dist/components/content/Tree/types.d.ts +2 -2
  94. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  95. package/dist/components/content/Tree/use-load-data.js +22 -15
  96. package/dist/components/content/Tree/use-load-data.js.map +1 -1
  97. package/dist/components/content/highlightText.js +1 -1
  98. package/dist/components/content/use-auto-tooltip.js +1 -1
  99. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  100. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  101. package/dist/components/fields/Checkbox/context.js +1 -1
  102. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  103. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  104. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  105. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  106. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  107. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  108. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  109. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  110. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  111. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  112. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  113. package/dist/components/fields/DatePicker/intl.js +1 -1
  114. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  115. package/dist/components/fields/DatePicker/props.js +1 -1
  116. package/dist/components/fields/DatePicker/utils.js +1 -1
  117. package/dist/components/fields/FileInput/FileInput.js +1 -1
  118. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  119. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  120. package/dist/components/fields/Input/Input.js +1 -1
  121. package/dist/components/fields/ListBox/ListBox.js +1 -1
  122. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  123. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  124. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  125. package/dist/components/fields/Picker/Picker.js +1 -1
  126. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  127. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  128. package/dist/components/fields/RadioGroup/context.js +1 -1
  129. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  130. package/dist/components/fields/Select/Select.js +1 -1
  131. package/dist/components/fields/Slider/Gradation.js +1 -1
  132. package/dist/components/fields/Slider/HueSlider.js +1 -1
  133. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  134. package/dist/components/fields/Slider/Slider.js +1 -1
  135. package/dist/components/fields/Slider/SliderBase.js +1 -1
  136. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  137. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  138. package/dist/components/fields/Slider/elements.js +1 -1
  139. package/dist/components/fields/Slider/index.js +1 -1
  140. package/dist/components/fields/Switch/Switch.js +1 -1
  141. package/dist/components/fields/TextArea/TextArea.js +1 -1
  142. package/dist/components/fields/TextInput/TextInput.js +1 -1
  143. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  144. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  145. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  146. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  147. package/dist/components/form/Form/Field.js +1 -1
  148. package/dist/components/form/Form/Form.js +1 -1
  149. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  150. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  151. package/dist/components/form/Form/SubmitError.js +1 -1
  152. package/dist/components/form/Form/index.js +1 -1
  153. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  154. package/dist/components/form/Form/use-field/use-field.js +1 -1
  155. package/dist/components/form/Form/use-form.js +1 -1
  156. package/dist/components/form/Form/validation.js +1 -1
  157. package/dist/components/form/Label.js +1 -1
  158. package/dist/components/form/wrapper.js +1 -1
  159. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  160. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  161. package/dist/components/layout/Flex.js +1 -1
  162. package/dist/components/layout/Flow.js +1 -1
  163. package/dist/components/layout/Grid.js +1 -1
  164. package/dist/components/layout/Panel.js +1 -1
  165. package/dist/components/layout/Prefix.js +1 -1
  166. package/dist/components/layout/ResizablePanel.js +1 -1
  167. package/dist/components/layout/Space.js +1 -1
  168. package/dist/components/layout/Suffix.js +1 -1
  169. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  170. package/dist/components/navigation/Tabs/EditableTitle.js +1 -1
  171. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  172. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  173. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  174. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  175. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  176. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  177. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  178. package/dist/components/navigation/Tabs/styled.js +1 -1
  179. package/dist/components/navigation/Tabs/types.js +1 -1
  180. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  181. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  182. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  183. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  184. package/dist/components/other/Calendar/Calendar.js +1 -1
  185. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  186. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  187. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  188. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  189. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  190. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  191. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  192. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  193. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  194. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  195. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  196. package/dist/components/overlays/Dialog/context.js +1 -1
  197. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  198. package/dist/components/overlays/Modal/Modal.js +1 -1
  199. package/dist/components/overlays/Modal/OpenTransition.js +1 -1
  200. package/dist/components/overlays/Modal/Overlay.js +1 -1
  201. package/dist/components/overlays/Modal/Popover.js +1 -1
  202. package/dist/components/overlays/Modal/Tray.js +1 -1
  203. package/dist/components/overlays/Modal/Underlay.js +1 -1
  204. package/dist/components/overlays/Notifications/Notification.js +1 -1
  205. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  206. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  207. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  208. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  209. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  210. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  211. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  212. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  213. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  214. package/dist/components/overlays/Notifications/index.js +1 -1
  215. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  216. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  217. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  218. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  219. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  220. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  221. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  222. package/dist/components/overlays/Toast/index.js +1 -1
  223. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  224. package/dist/components/overlays/Toast/useToast.js +1 -1
  225. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  226. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  227. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  228. package/dist/components/overlays/Tooltip/context.js +1 -1
  229. package/dist/components/portal/Portal.js +1 -1
  230. package/dist/components/portal/PortalProvider.js +1 -1
  231. package/dist/components/portal/usePortal.js +1 -1
  232. package/dist/components/shared/InvalidIcon.js +1 -1
  233. package/dist/components/shared/ValidIcon.js +1 -1
  234. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  235. package/dist/components/status/Spin/Cube.js +1 -1
  236. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  237. package/dist/components/status/Spin/Spin.js +1 -1
  238. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  239. package/dist/data/item-themes.js +1 -1
  240. package/dist/data/themes.js +1 -1
  241. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  242. package/dist/icons/AdjustmentsIcon.js +1 -1
  243. package/dist/icons/AiIcon.js +1 -1
  244. package/dist/icons/AreaChartIcon.js +1 -1
  245. package/dist/icons/BackwardIcon.js +1 -1
  246. package/dist/icons/BarChartIcon.js +1 -1
  247. package/dist/icons/BellFilledIcon.js +1 -1
  248. package/dist/icons/BellIcon.js +1 -1
  249. package/dist/icons/BooleanIcon.js +1 -1
  250. package/dist/icons/CalendarEditIcon.js +1 -1
  251. package/dist/icons/CalendarIcon.js +1 -1
  252. package/dist/icons/CaretDownIcon.js +1 -1
  253. package/dist/icons/CaretUpIcon.js +1 -1
  254. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  255. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  256. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  257. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  258. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  259. package/dist/icons/ChartBarLineIcon.js +1 -1
  260. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  261. package/dist/icons/ChartBarStackedIcon.js +1 -1
  262. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  263. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  264. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  265. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  266. package/dist/icons/ChartBubbleIcon.js +1 -1
  267. package/dist/icons/ChartDonut2Icon.js +1 -1
  268. package/dist/icons/ChartFunnelIcon.js +1 -1
  269. package/dist/icons/ChartHeatmapIcon.js +1 -1
  270. package/dist/icons/ChartKPIIcon.js +1 -1
  271. package/dist/icons/ChartPie2Icon.js +1 -1
  272. package/dist/icons/ChartScatterIcon.js +1 -1
  273. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  274. package/dist/icons/CheckCircleIcon.js +1 -1
  275. package/dist/icons/CheckIcon.js +1 -1
  276. package/dist/icons/CircleFilledIcon.js +1 -1
  277. package/dist/icons/ClearIcon.js +1 -1
  278. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  279. package/dist/icons/CloseCircleIcon.js +1 -1
  280. package/dist/icons/CloseIcon.js +1 -1
  281. package/dist/icons/CodeIcon.js +1 -1
  282. package/dist/icons/ColumnTotalIcon.js +1 -1
  283. package/dist/icons/CopyIcon.js +1 -1
  284. package/dist/icons/CountIcon.js +1 -1
  285. package/dist/icons/CubeIcon.js +1 -1
  286. package/dist/icons/CubePauseIcon.js +1 -1
  287. package/dist/icons/CubePlayIcon.js +1 -1
  288. package/dist/icons/CurrencyDollarIcon.js +1 -1
  289. package/dist/icons/DangerIcon.js +1 -1
  290. package/dist/icons/DashboardIcon.js +1 -1
  291. package/dist/icons/DatabaseIcon.js +1 -1
  292. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  293. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  294. package/dist/icons/DirectionIcon.js +1 -1
  295. package/dist/icons/DonutIcon.js +1 -1
  296. package/dist/icons/DownIcon.js +1 -1
  297. package/dist/icons/EditIcon.js +1 -1
  298. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  299. package/dist/icons/ExclamationCircleIcon.js +1 -1
  300. package/dist/icons/ExclamationIcon.js +1 -1
  301. package/dist/icons/EyeIcon.js +1 -1
  302. package/dist/icons/EyeInvisibleIcon.js +1 -1
  303. package/dist/icons/FilterIcon.js +1 -1
  304. package/dist/icons/FolderFilledIcon.js +1 -1
  305. package/dist/icons/FolderIcon.js +1 -1
  306. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  307. package/dist/icons/FolderOpenIcon.js +1 -1
  308. package/dist/icons/ForwardIcon.js +1 -1
  309. package/dist/icons/HierarchyIcon.js +1 -1
  310. package/dist/icons/HierarchyOpenIcon.js +1 -1
  311. package/dist/icons/Icon.js +1 -1
  312. package/dist/icons/InfoCircleIcon.js +1 -1
  313. package/dist/icons/InfoIcon.js +1 -1
  314. package/dist/icons/KeyIcon.js +1 -1
  315. package/dist/icons/LeftIcon.js +1 -1
  316. package/dist/icons/LineChartIcon.js +1 -1
  317. package/dist/icons/LoadingIcon.js +1 -1
  318. package/dist/icons/LockFilledIcon.js +1 -1
  319. package/dist/icons/LockIcon.js +1 -1
  320. package/dist/icons/MoreIcon.js +1 -1
  321. package/dist/icons/NotAllowedIcon.js +1 -1
  322. package/dist/icons/Number123Icon.js +1 -1
  323. package/dist/icons/NumberIcon.js +1 -1
  324. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  325. package/dist/icons/PauseCircleIcon.js +1 -1
  326. package/dist/icons/PauseIcon.js +1 -1
  327. package/dist/icons/PercentageIcon.js +1 -1
  328. package/dist/icons/PieChartIcon.js +1 -1
  329. package/dist/icons/PlayCircleIcon.js +1 -1
  330. package/dist/icons/PlayIcon.js +1 -1
  331. package/dist/icons/PlusIcon.js +1 -1
  332. package/dist/icons/ProgressBarIcon.js +1 -1
  333. package/dist/icons/ReloadIcon.js +1 -1
  334. package/dist/icons/ReportIcon.js +1 -1
  335. package/dist/icons/ReturnIcon.js +1 -1
  336. package/dist/icons/RightIcon.js +1 -1
  337. package/dist/icons/RowTotalsIcon.js +1 -1
  338. package/dist/icons/SchemeIcon.js +1 -1
  339. package/dist/icons/SearchIcon.js +1 -1
  340. package/dist/icons/SemanticQueryIcon.js +1 -1
  341. package/dist/icons/SettingsIcon.js +1 -1
  342. package/dist/icons/ShieldFilledIcon.js +1 -1
  343. package/dist/icons/ShieldIcon.js +1 -1
  344. package/dist/icons/SlashIcon.js +1 -1
  345. package/dist/icons/SparklesIcon.js +1 -1
  346. package/dist/icons/SqlIcon.js +1 -1
  347. package/dist/icons/StatsIcon.js +1 -1
  348. package/dist/icons/StopIcon.js +1 -1
  349. package/dist/icons/StringIcon.js +1 -1
  350. package/dist/icons/SubtotalsIcon.js +1 -1
  351. package/dist/icons/SwitchIcon.js +1 -1
  352. package/dist/icons/TableIcon.js +1 -1
  353. package/dist/icons/ThumbsDownIcon.js +1 -1
  354. package/dist/icons/ThumbsUpIcon.js +1 -1
  355. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  356. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  357. package/dist/icons/ThunderboltIcon.js +1 -1
  358. package/dist/icons/TimeIcon.js +1 -1
  359. package/dist/icons/TrashIcon.js +1 -1
  360. package/dist/icons/UnlockIcon.js +1 -1
  361. package/dist/icons/UpIcon.js +1 -1
  362. package/dist/icons/UserGroupIcon.js +1 -1
  363. package/dist/icons/UserIcon.js +1 -1
  364. package/dist/icons/UserLockIcon.js +1 -1
  365. package/dist/icons/ViewIcon.js +1 -1
  366. package/dist/icons/WarningFilledIcon.js +1 -1
  367. package/dist/icons/WarningIcon.js +1 -1
  368. package/dist/icons/wrap-icon.js +1 -1
  369. package/dist/index.js +1 -1
  370. package/dist/provider.js +1 -1
  371. package/dist/providers/TrackingProvider.js +1 -1
  372. package/dist/providers/navigationAdapter.default.js +1 -1
  373. package/dist/tokens/base.js +1 -1
  374. package/dist/tokens/colors.js +1 -1
  375. package/dist/tokens/index.js +1 -1
  376. package/dist/tokens/layout.js +1 -1
  377. package/dist/tokens/shadows.js +1 -1
  378. package/dist/tokens/sizes.js +1 -1
  379. package/dist/tokens/spacing.js +1 -1
  380. package/dist/tokens/typography.js +1 -1
  381. package/dist/utils/ResizeSensor.js +1 -1
  382. package/dist/utils/is-dev-env.js +1 -1
  383. package/dist/utils/modules.js +1 -1
  384. package/dist/utils/promise.js +1 -1
  385. package/dist/utils/raf.js +1 -1
  386. package/dist/utils/random.js +1 -1
  387. package/dist/utils/range.js +1 -1
  388. package/dist/utils/react/RenderCache.js +1 -1
  389. package/dist/utils/react/Slots.js +1 -1
  390. package/dist/utils/react/chain.js +1 -1
  391. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  392. package/dist/utils/react/index.js +1 -1
  393. package/dist/utils/react/interactions.js +1 -1
  394. package/dist/utils/react/isTextOnly.js +1 -1
  395. package/dist/utils/react/mapProps.js +1 -1
  396. package/dist/utils/react/mergeProps.js +1 -1
  397. package/dist/utils/react/nullableValue.js +1 -1
  398. package/dist/utils/react/resolveIcon.js +1 -1
  399. package/dist/utils/react/sharedStore.js +1 -1
  400. package/dist/utils/react/useCombinedRefs.js +1 -1
  401. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  402. package/dist/utils/react/useEventBus.js +1 -1
  403. package/dist/utils/react/useId.js +1 -1
  404. package/dist/utils/react/useIsDarwin.js +1 -1
  405. package/dist/utils/react/useKeySymbols.js +1 -1
  406. package/dist/utils/react/useLayoutEffect.js +1 -1
  407. package/dist/utils/react/useLocalStorage.js +1 -1
  408. package/dist/utils/react/useMergeStyles.js +1 -1
  409. package/dist/utils/react/useQaProps.js +1 -1
  410. package/dist/utils/react/useViewportSize.js +1 -1
  411. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  412. package/dist/utils/selection.js +1 -1
  413. package/dist/utils/styles.js +1 -1
  414. package/dist/utils/tree.js +1 -1
  415. package/dist/utils/warnings.js +1 -1
  416. package/dist/version.js +2 -2
  417. package/docs/components/content/Tree.md +0 -9
  418. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ccca45d | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { mergeProps } from "../../../utils/react/mergeProps.js";
4
4
  import { wrapNodeIfPlain } from "../../../utils/react/wrapNodeIfPlain.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ccca45d | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
2
2
  import { Space } from "../../layout/Space.js";
3
3
  import { Grid } from "../../layout/Grid.js";
4
4
  import { Flow } from "../../layout/Flow.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ccca45d | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
2
2
  import { _Item } from "../Item/Item.js";
3
3
  import { CloseIcon } from "../../../icons/CloseIcon.js";
4
4
  import { tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ccca45d | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useSlotProps } from "../../utils/react/Slots.js";
4
4
  import { BASE_STYLES, COLOR_STYLES, TEXT_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ccca45d | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { TEXT_PROP_MAP, _Text } from "../Text.js";
4
4
  import { highlightText } from "../highlightText.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ccca45d | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useSlotProps } from "../../utils/react/Slots.js";
4
4
  import { TEXT_PROP_MAP } from "./Text.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ccca45d | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
4
4
  import { mergeRefs } from "../../../utils/react/useCombinedRefs.js";
@@ -18,16 +18,9 @@ import { Item, useTreeState } from "react-stately";
18
18
  /**
19
19
  * Render an `<Item>` for React Stately's collection builder.
20
20
  *
21
- * The visible row content is rendered by `TreeNode` via a
22
- * `nodesByKey` lookup, so the `<Item>`'s body is only used by
23
- * Stately to build the collection (`textValue` for keyboard nav,
24
- * `childItems` for nested traversal).
25
- *
26
- * For nested traversal to work, the `children` of the `<Tree>` must
27
- * be passed as a *function* together with the top-level `items`
28
- * array — see the `<Tree>` `useCollection` call below. Stately
29
- * propagates that renderer into `childItems` so nested arrays of
30
- * raw `CubeTreeNodeData` are turned back into `<Item>` elements.
21
+ * The visible content is rendered by `TreeNode` via `nodesByKey`,
22
+ * so `<Item>`'s body is only used by Stately for the collection
23
+ * (`textValue` for keyboard nav, `childItems` for nested traversal).
31
24
  */
32
25
  function renderItem(node) {
33
26
  return /* @__PURE__ */ jsx(Item, {
@@ -36,7 +29,6 @@ function renderItem(node) {
36
29
  children: node.title
37
30
  }, node.key);
38
31
  }
39
- /** Walk the treeData and collect all keys whose `isDisabled === true`. */
40
32
  function collectDisabledKeys(treeData, treeIsDisabled) {
41
33
  const keys = [];
42
34
  const visit = (nodes) => {
@@ -48,11 +40,7 @@ function collectDisabledKeys(treeData, treeIsDisabled) {
48
40
  visit(treeData);
49
41
  return keys;
50
42
  }
51
- /**
52
- * Expand the supplied keys with all of their ancestors. Used when
53
- * `autoExpandParent` is `true` so that the consumer can pass deep keys
54
- * (e.g. search matches) without having to manually walk parents.
55
- */
43
+ /** Expand the supplied keys with all of their ancestor keys. */
56
44
  function expandWithParents(keys, parentOf) {
57
45
  if (!keys || keys.length === 0) return keys;
58
46
  const set = new Set(keys);
@@ -66,48 +54,39 @@ function expandWithParents(keys, parentOf) {
66
54
  return Array.from(set);
67
55
  }
68
56
  /**
69
- * Coerce the public `selectionMode` / `isSelectable` pair into a single
70
- * `selectionMode` value for `useTreeState`.
71
- *
72
- * - `selectionMode` wins when both are passed.
73
- * - `isSelectable === false` is sugar for `selectionMode='none'`.
74
- * - `selectionMode` defaults to `'single'` (matches AntD's default).
57
+ * Diff two key sets to find the single key that was added or removed.
58
+ * Returns `null` when both sets are equal.
75
59
  */
60
+ function findToggledKey(previous, next) {
61
+ for (const k of next) if (!previous.has(k)) return {
62
+ key: k,
63
+ added: true
64
+ };
65
+ for (const k of previous) if (!next.has(k)) return {
66
+ key: k,
67
+ added: false
68
+ };
69
+ return null;
70
+ }
76
71
  function resolveSelectionMode(selectionMode, isSelectable) {
77
72
  if (selectionMode != null) return selectionMode;
78
73
  if (isSelectable === false) return "none";
79
74
  return "single";
80
75
  }
81
76
  function TreeBase(props, ref) {
82
- const { treeData, isCheckable = false, isSelectable, selectionMode: selectionModeProp, blockNode = false, isDisabled = false, defaultExpandedKeys, expandedKeys, autoExpandParent = false, defaultCheckedKeys, checkedKeys, defaultSelectedKeys, selectedKeys, height, loadData, onExpand, onCheck, onSelect, rowStyles, qa, ...otherProps } = props;
77
+ const { treeData, isCheckable = false, isSelectable, selectionMode: selectionModeProp, isDisabled = false, defaultExpandedKeys, expandedKeys, autoExpandParent = false, defaultCheckedKeys, checkedKeys, defaultSelectedKeys, selectedKeys, height, loadData, onExpand, onCheck, onSelect, rowStyles, ariaLabel, qa, ...otherProps } = props;
83
78
  const baseStyles = extractStyles(otherProps, OUTER_STYLES);
84
79
  const treeRef = useRef(null);
85
- /**
86
- * Single tree walk that produces `byKey`, `parentOf`, and `childrenOf`.
87
- * Shared with `useCheckboxTree` so a `treeData` change triggers exactly
88
- * one walk (instead of three) for these three maps.
89
- */
90
80
  const treeIndex = useMemo(() => buildTreeIndex(treeData), [treeData]);
91
81
  const nodesByKey = treeIndex.byKey;
92
82
  const parentOf = treeIndex.parentOf;
93
83
  const disabledKeys = useMemo(() => collectDisabledKeys(treeData, isDisabled), [treeData, isDisabled]);
94
84
  const selectionMode = resolveSelectionMode(selectionModeProp, isSelectable);
95
- /**
96
- * Apply `autoExpandParent` to the controlled `expandedKeys`. This is
97
- * a one-shot thing — once the consumer responds to `onExpand` and
98
- * sets `autoExpandParent` to `false`, we stop force-expanding parents.
99
- */
100
85
  const effectiveExpandedKeys = useMemo(() => autoExpandParent ? expandWithParents(expandedKeys, parentOf) : expandedKeys, [
101
86
  autoExpandParent,
102
87
  expandedKeys,
103
88
  parentOf
104
89
  ]);
105
- /**
106
- * Mirror the same logic for the uncontrolled `defaultExpandedKeys`.
107
- * `useTreeState` only reads it on mount, but we still need to expand
108
- * ancestors so consumers passing a deep key (e.g. a search match) get
109
- * the same behaviour as in the controlled mode.
110
- */
111
90
  const effectiveDefaultExpandedKeys = useMemo(() => autoExpandParent ? expandWithParents(defaultExpandedKeys, parentOf) : defaultExpandedKeys, [
112
91
  autoExpandParent,
113
92
  defaultExpandedKeys,
@@ -127,145 +106,103 @@ function TreeBase(props, ref) {
127
106
  initialExpandedKeys: effectiveExpandedKeys ?? effectiveDefaultExpandedKeys
128
107
  });
129
108
  /**
130
- * Tracks the previously-expanded set so we can diff against the next set
131
- * inside `handleExpandedChange`. In controlled mode the parent owns the
132
- * truth (read from `effectiveExpandedKeys`); in uncontrolled mode this
133
- * ref is the only source for the previous state — `effectiveExpandedKeys`
134
- * is `undefined` and would otherwise produce an empty `previous` set,
135
- * mis-identifying every toggle.
136
- *
137
- * Must mirror what `useTreeState` was initialized with (the *effective*
138
- * sets, which include `autoExpandParent` ancestors). Using the raw
139
- * `defaultExpandedKeys` here would make the first toggle in uncontrolled
140
- * mode diff against an undersized previous set, reporting auto-expanded
141
- * ancestors as newly expanded.
109
+ * In controlled mode, `previous` is read from `effectiveExpandedKeys`;
110
+ * in uncontrolled mode this ref is the only source. Initialized from
111
+ * the *effective* (ancestor-expanded) keys so the first toggle diffs
112
+ * correctly.
142
113
  */
143
114
  const previousExpandedRef = useRef(new Set(effectiveExpandedKeys ?? effectiveDefaultExpandedKeys ?? []));
144
- /**
145
- * Translate Stately's `Set<Key>` callbacks into the public AntD-flavoured
146
- * `Key[]` shape and dispatch the per-key load.
147
- */
148
115
  const handleExpandedChange = useEvent((nextSet) => {
149
116
  loadDataController.onExpandedChanged(nextSet);
150
117
  const previous = expandedKeys !== void 0 ? new Set(effectiveExpandedKeys ?? []) : previousExpandedRef.current;
151
118
  previousExpandedRef.current = new Set(nextSet);
152
119
  if (!onExpand) return;
153
- const nextArr = Array.from(nextSet);
154
- /**
155
- * Find the single key that toggled relative to the previous set.
156
- * Useful for `info.node` and `info.expanded` — matches AntD.
157
- */
158
- let toggledKey = null;
159
- let toggledExpanded = false;
160
- for (const k of nextArr) if (!previous.has(k)) {
161
- toggledKey = k;
162
- toggledExpanded = true;
163
- break;
164
- }
165
- if (toggledKey == null) {
166
- for (const k of previous) if (!nextSet.has(k)) {
167
- toggledKey = k;
168
- toggledExpanded = false;
169
- break;
170
- }
171
- }
172
- const node = toggledKey != null ? nodesByKey.get(String(toggledKey)) : void 0;
173
- onExpand(nextArr, {
174
- expanded: toggledExpanded,
175
- node: node ?? {}
176
- });
120
+ const toggled = findToggledKey(previous, nextSet);
121
+ if (!toggled) return;
122
+ const node = nodesByKey.get(String(toggled.key));
123
+ if (!node) return;
124
+ const info = {
125
+ expanded: toggled.added,
126
+ node
127
+ };
128
+ onExpand(Array.from(nextSet), info);
177
129
  });
130
+ /**
131
+ * Same pattern as `previousExpandedRef`: in controlled mode we read
132
+ * from `selectedKeys`; in uncontrolled mode this ref tracks state.
133
+ */
134
+ const previousSelectionRef = useRef(new Set(selectedKeys ?? defaultSelectedKeys ?? []));
135
+ /**
136
+ * `useEvent` captures the closure lazily, so `state` (declared below
137
+ * `ariaProps` / `useTreeState`) is safely accessible at call time.
138
+ */
178
139
  const handleSelectionChange = useEvent((selection) => {
179
140
  if (!onSelect) return;
180
- const arr = selection === "all" ? Array.from(nodesByKey.keys()) : Array.from(selection);
181
- /**
182
- * Stately's `onSelectionChange` hands us the *next* selection only —
183
- * we don't get a "toggled key" diff for free. For `single` mode we
184
- * can infer it cheaply (it's the only entry); for `multiple` we
185
- * report the most recent addition. Falls back to the first key.
186
- */
187
- let toggledKey = null;
188
- let toggledSelected = false;
189
- if (selectionMode === "single") {
190
- toggledKey = arr[0] ?? null;
191
- toggledSelected = arr.length > 0;
192
- } else if (selection !== "all") {
193
- toggledKey = arr.length > 0 ? arr[arr.length - 1] : null;
194
- toggledSelected = arr.length > 0;
195
- } else {
196
- toggledKey = arr[0] ?? null;
197
- toggledSelected = true;
198
- }
199
- const node = toggledKey != null ? nodesByKey.get(String(toggledKey)) : void 0;
141
+ let arr;
142
+ if (selection === "all") {
143
+ arr = [];
144
+ for (const key of state.collection.getKeys()) {
145
+ const node = state.collection.getItem(key);
146
+ if (node && node.type === "item") arr.push(key);
147
+ }
148
+ } else arr = Array.from(selection);
149
+ const nextSet = new Set(arr);
150
+ const previous = selectedKeys !== void 0 ? new Set(selectedKeys ?? []) : previousSelectionRef.current;
151
+ previousSelectionRef.current = nextSet;
152
+ const toggled = findToggledKey(previous, nextSet);
153
+ if (!toggled) return;
154
+ const node = nodesByKey.get(String(toggled.key));
155
+ if (!node) return;
200
156
  const selectedNodes = arr.map((k) => nodesByKey.get(String(k))).filter((n) => !!n);
201
- onSelect(arr, {
202
- selected: toggledSelected,
203
- node: node ?? {},
157
+ const info = {
158
+ selected: toggled.added,
159
+ node,
204
160
  selectedNodes
205
- });
161
+ };
162
+ onSelect(arr, info);
206
163
  });
207
- /**
208
- * Stately propagates the `children` function through `childItems`,
209
- * so a single render function recursively turns the entire
210
- * `treeData` array into `<Item>` elements.
211
- */
212
- const renderCollectionItem = useEvent((item) => renderItem(item));
164
+ const hasOnSelect = onSelect != null;
213
165
  const ariaProps = useMemo(() => ({
214
166
  selectionMode,
215
167
  selectedKeys,
216
168
  defaultSelectedKeys,
217
- onSelectionChange: onSelect && selectionMode !== "none" ? handleSelectionChange : void 0,
169
+ onSelectionChange: hasOnSelect && selectionMode !== "none" ? handleSelectionChange : void 0,
218
170
  expandedKeys: effectiveExpandedKeys,
219
171
  defaultExpandedKeys: effectiveDefaultExpandedKeys,
220
172
  onExpandedChange: handleExpandedChange,
221
173
  disabledKeys,
222
174
  disabledBehavior: "all",
223
175
  items: treeData,
224
- children: renderCollectionItem,
225
- "aria-label": "Tree"
176
+ children: renderItem,
177
+ "aria-label": ariaLabel ?? "Tree"
226
178
  }), [
227
179
  selectionMode,
228
180
  selectedKeys,
229
181
  defaultSelectedKeys,
230
- onSelect,
182
+ hasOnSelect,
231
183
  handleSelectionChange,
232
184
  effectiveExpandedKeys,
233
185
  effectiveDefaultExpandedKeys,
234
186
  handleExpandedChange,
235
187
  disabledKeys,
236
188
  treeData,
237
- renderCollectionItem
189
+ ariaLabel
238
190
  ]);
239
191
  const baseState = useTreeState(ariaProps);
240
- /**
241
- * The legacy `TreeCollection` returned by `useTreeState` doesn't
242
- * implement `getChildren`, but `@react-aria/tree`'s `useTree`
243
- * (via `useGridListItem`) calls it unguarded for any nested row
244
- * (`node.level > 0`). Patch it once so `useTree` works on top of
245
- * the legacy state without forking.
246
- */
247
192
  const state = useMemo(() => {
248
193
  const collection = baseState.collection;
249
194
  if (typeof collection.getChildren === "function") return baseState;
250
- const getChildren = (key) => {
251
- const result = [];
195
+ const patched = Object.create(collection);
196
+ patched.getChildren = (key) => {
252
197
  const node = collection.getItem(key);
253
- if (!node) return result;
254
- for (const child of node.childNodes) result.push(child);
255
- return result;
198
+ return node ? Array.from(node.childNodes) : [];
256
199
  };
257
- const patched = Object.assign(Object.create(Object.getPrototypeOf(collection)), collection, { getChildren });
258
200
  return {
259
201
  ...baseState,
260
202
  collection: patched
261
203
  };
262
204
  }, [baseState]);
263
205
  const { gridProps } = useTree(ariaProps, state, treeRef);
264
- /**
265
- * Iterate the collection in DOM order. The TreeCollection only walks
266
- * into expanded subtrees, so `getKeys()` already gives us *only*
267
- * visible rows — no manual filtering required.
268
- */
269
206
  const visibleNodes = useMemo(() => {
270
207
  const out = [];
271
208
  for (const key of state.collection.getKeys()) {
@@ -273,25 +210,18 @@ function TreeBase(props, ref) {
273
210
  if (node && node.type === "item") out.push(node);
274
211
  }
275
212
  return out;
276
- }, [state.collection, state.expandedKeys]);
213
+ }, [state.collection]);
277
214
  const heightStyle = useMemo(() => height != null ? { ["--tree-height"]: `${height}px` } : void 0, [height]);
278
215
  const mods = useMemo(() => ({ "has-height": height != null }), [height]);
279
- /**
280
- * Merge the consumer's forwarded ref with our internal `treeRef`. Both
281
- * must point at the same DOM node: `useTree` reads `treeRef.current` for
282
- * keyboard navigation/focus management, and consumers expect the
283
- * forwarded `ref` to receive the element too.
284
- */
285
- const mergedRef = useMemo(() => mergeRefs(ref, treeRef), [ref]);
286
216
  return /* @__PURE__ */ jsx(TreeElement, {
287
- ...mergeProps$1(gridProps, { ref: mergedRef }),
288
- ref: mergedRef,
217
+ ...mergeProps$1(gridProps, { ref: useMemo(() => mergeRefs(ref, treeRef), [ref, treeRef]) }),
289
218
  qa: qa ?? "Tree",
290
219
  mods,
291
220
  styles: baseStyles,
292
221
  style: heightStyle,
293
222
  children: visibleNodes.map((node) => {
294
- const data = nodesByKey.get(String(node.key));
223
+ const keyStr = String(node.key);
224
+ const data = nodesByKey.get(keyStr);
295
225
  if (!data) return null;
296
226
  return /* @__PURE__ */ jsx(TreeNode, {
297
227
  node,
@@ -299,10 +229,9 @@ function TreeBase(props, ref) {
299
229
  state,
300
230
  isCheckable,
301
231
  isExpanded: state.expandedKeys.has(node.key),
302
- isChecked: checkbox.checkedSet.has(String(node.key)),
303
- isIndeterminate: checkbox.halfCheckedSet.has(String(node.key)),
304
- isLoading: loadDataController.loadingKeys.has(String(node.key)),
305
- isBlockNode: blockNode,
232
+ isChecked: checkbox.checkedSet.has(keyStr),
233
+ isIndeterminate: checkbox.halfCheckedSet.has(keyStr),
234
+ isLoading: loadDataController.loadingKeys.has(keyStr),
306
235
  rowStyles,
307
236
  onToggleChecked: checkbox.toggle
308
237
  }, node.key);
@@ -310,6 +239,7 @@ function TreeBase(props, ref) {
310
239
  });
311
240
  }
312
241
  const _Tree = forwardRef(TreeBase);
242
+ _Tree.displayName = "Tree";
313
243
  /**
314
244
  * Hierarchical data display with optional checkboxes, single/multi
315
245
  * selection, async lazy loading, and keyboard navigation.
@@ -1 +1 @@
1
- {"version":3,"file":"Tree.js","names":["mergeProps"],"sources":["../../../../src/components/content/Tree/Tree.tsx"],"sourcesContent":["import { OUTER_STYLES } from '@tenphi/tasty';\nimport { forwardRef, useMemo, useRef } from 'react';\nimport { useTree } from 'react-aria';\nimport { Item, useTreeState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { mergeProps, mergeRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\n\nimport { TreeElement } from './styled';\nimport { buildTreeIndex } from './tree-index';\nimport { TreeNode } from './TreeNode';\nimport { useCheckboxTree } from './use-checkbox-tree';\nimport { useLoadData } from './use-load-data';\n\nimport type { Key, Node, Selection } from '@react-types/shared';\nimport type { CSSProperties, ForwardedRef, ReactElement } from 'react';\nimport type {\n CubeTreeNodeData,\n CubeTreeProps,\n TreeOnExpandInfo,\n TreeOnSelectInfo,\n TreeSelectionMode,\n} from './types';\n\n/**\n * Render an `<Item>` for React Stately's collection builder.\n *\n * The visible row content is rendered by `TreeNode` via a\n * `nodesByKey` lookup, so the `<Item>`'s body is only used by\n * Stately to build the collection (`textValue` for keyboard nav,\n * `childItems` for nested traversal).\n *\n * For nested traversal to work, the `children` of the `<Tree>` must\n * be passed as a *function* together with the top-level `items`\n * array — see the `<Tree>` `useCollection` call below. Stately\n * propagates that renderer into `childItems` so nested arrays of\n * raw `CubeTreeNodeData` are turned back into `<Item>` elements.\n */\nfunction renderItem(node: CubeTreeNodeData): ReactElement {\n const textValue =\n typeof node.title === 'string' ? node.title : String(node.key);\n return (\n <Item\n key={node.key}\n textValue={textValue}\n childItems={node.children as CubeTreeNodeData[] | undefined}\n >\n {node.title as any}\n </Item>\n );\n}\n\n/** Walk the treeData and collect all keys whose `isDisabled === true`. */\nfunction collectDisabledKeys(\n treeData: CubeTreeNodeData[],\n treeIsDisabled: boolean,\n): string[] {\n const keys: string[] = [];\n const visit = (nodes: CubeTreeNodeData[]) => {\n for (const node of nodes) {\n if (treeIsDisabled || node.isDisabled) keys.push(node.key);\n if (node.children) visit(node.children);\n }\n };\n visit(treeData);\n return keys;\n}\n\n/**\n * Expand the supplied keys with all of their ancestors. Used when\n * `autoExpandParent` is `true` so that the consumer can pass deep keys\n * (e.g. search matches) without having to manually walk parents.\n */\nfunction expandWithParents(\n keys: string[] | undefined,\n parentOf: Map<string, string | null>,\n): string[] | undefined {\n if (!keys || keys.length === 0) return keys;\n const set = new Set<string>(keys);\n for (const key of keys) {\n let parent = parentOf.get(key);\n while (parent) {\n set.add(parent);\n parent = parentOf.get(parent);\n }\n }\n return Array.from(set);\n}\n\n/**\n * Coerce the public `selectionMode` / `isSelectable` pair into a single\n * `selectionMode` value for `useTreeState`.\n *\n * - `selectionMode` wins when both are passed.\n * - `isSelectable === false` is sugar for `selectionMode='none'`.\n * - `selectionMode` defaults to `'single'` (matches AntD's default).\n */\nfunction resolveSelectionMode(\n selectionMode: TreeSelectionMode | undefined,\n isSelectable: boolean | undefined,\n): TreeSelectionMode {\n if (selectionMode != null) return selectionMode;\n if (isSelectable === false) return 'none';\n return 'single';\n}\n\nfunction TreeBase(props: CubeTreeProps, ref: ForwardedRef<HTMLDivElement>) {\n const {\n treeData,\n isCheckable = false,\n isSelectable,\n selectionMode: selectionModeProp,\n blockNode = false,\n isDisabled = false,\n defaultExpandedKeys,\n expandedKeys,\n autoExpandParent = false,\n defaultCheckedKeys,\n checkedKeys,\n defaultSelectedKeys,\n selectedKeys,\n height,\n loadData,\n onExpand,\n onCheck,\n onSelect,\n rowStyles,\n qa,\n ...otherProps\n } = props;\n\n const baseStyles = extractStyles(otherProps, OUTER_STYLES);\n\n const treeRef = useRef<HTMLDivElement>(null);\n\n /**\n * Single tree walk that produces `byKey`, `parentOf`, and `childrenOf`.\n * Shared with `useCheckboxTree` so a `treeData` change triggers exactly\n * one walk (instead of three) for these three maps.\n */\n const treeIndex = useMemo(() => buildTreeIndex(treeData), [treeData]);\n const nodesByKey = treeIndex.byKey;\n const parentOf = treeIndex.parentOf;\n\n const disabledKeys = useMemo(\n () => collectDisabledKeys(treeData, isDisabled),\n [treeData, isDisabled],\n );\n\n const selectionMode = resolveSelectionMode(selectionModeProp, isSelectable);\n\n /**\n * Apply `autoExpandParent` to the controlled `expandedKeys`. This is\n * a one-shot thing — once the consumer responds to `onExpand` and\n * sets `autoExpandParent` to `false`, we stop force-expanding parents.\n */\n const effectiveExpandedKeys = useMemo(\n () =>\n autoExpandParent\n ? expandWithParents(expandedKeys, parentOf)\n : expandedKeys,\n [autoExpandParent, expandedKeys, parentOf],\n );\n\n /**\n * Mirror the same logic for the uncontrolled `defaultExpandedKeys`.\n * `useTreeState` only reads it on mount, but we still need to expand\n * ancestors so consumers passing a deep key (e.g. a search match) get\n * the same behaviour as in the controlled mode.\n */\n const effectiveDefaultExpandedKeys = useMemo(\n () =>\n autoExpandParent\n ? expandWithParents(defaultExpandedKeys, parentOf)\n : defaultExpandedKeys,\n [autoExpandParent, defaultExpandedKeys, parentOf],\n );\n\n const checkbox = useCheckboxTree({\n treeData,\n index: treeIndex,\n isCheckable,\n defaultCheckedKeys,\n checkedKeys,\n onCheck,\n });\n\n const loadDataController = useLoadData({\n nodesByKey,\n loadData,\n initialExpandedKeys: effectiveExpandedKeys ?? effectiveDefaultExpandedKeys,\n });\n\n /**\n * Tracks the previously-expanded set so we can diff against the next set\n * inside `handleExpandedChange`. In controlled mode the parent owns the\n * truth (read from `effectiveExpandedKeys`); in uncontrolled mode this\n * ref is the only source for the previous state — `effectiveExpandedKeys`\n * is `undefined` and would otherwise produce an empty `previous` set,\n * mis-identifying every toggle.\n *\n * Must mirror what `useTreeState` was initialized with (the *effective*\n * sets, which include `autoExpandParent` ancestors). Using the raw\n * `defaultExpandedKeys` here would make the first toggle in uncontrolled\n * mode diff against an undersized previous set, reporting auto-expanded\n * ancestors as newly expanded.\n */\n const previousExpandedRef = useRef<Set<Key>>(\n new Set<Key>(effectiveExpandedKeys ?? effectiveDefaultExpandedKeys ?? []),\n );\n\n /**\n * Translate Stately's `Set<Key>` callbacks into the public AntD-flavoured\n * `Key[]` shape and dispatch the per-key load.\n */\n const handleExpandedChange = useEvent((nextSet: Set<Key>) => {\n loadDataController.onExpandedChanged(nextSet);\n\n const previous =\n expandedKeys !== undefined\n ? new Set<Key>(effectiveExpandedKeys ?? [])\n : previousExpandedRef.current;\n previousExpandedRef.current = new Set<Key>(nextSet);\n\n if (!onExpand) return;\n const nextArr: Key[] = Array.from(nextSet);\n\n /**\n * Find the single key that toggled relative to the previous set.\n * Useful for `info.node` and `info.expanded` — matches AntD.\n */\n let toggledKey: Key | null = null;\n let toggledExpanded = false;\n for (const k of nextArr) {\n if (!previous.has(k)) {\n toggledKey = k;\n toggledExpanded = true;\n break;\n }\n }\n if (toggledKey == null) {\n for (const k of previous) {\n if (!nextSet.has(k)) {\n toggledKey = k;\n toggledExpanded = false;\n break;\n }\n }\n }\n\n const node =\n toggledKey != null ? nodesByKey.get(String(toggledKey)) : undefined;\n const info: TreeOnExpandInfo = {\n expanded: toggledExpanded,\n node: node ?? ({} as CubeTreeNodeData),\n };\n onExpand(nextArr, info);\n });\n\n const handleSelectionChange = useEvent((selection: Selection) => {\n if (!onSelect) return;\n const arr: Key[] =\n selection === 'all'\n ? Array.from(nodesByKey.keys())\n : Array.from(selection);\n /**\n * Stately's `onSelectionChange` hands us the *next* selection only —\n * we don't get a \"toggled key\" diff for free. For `single` mode we\n * can infer it cheaply (it's the only entry); for `multiple` we\n * report the most recent addition. Falls back to the first key.\n */\n let toggledKey: Key | null = null;\n let toggledSelected = false;\n if (selectionMode === 'single') {\n toggledKey = arr[0] ?? null;\n toggledSelected = arr.length > 0;\n } else if (selection !== 'all') {\n toggledKey = arr.length > 0 ? arr[arr.length - 1] : null;\n toggledSelected = arr.length > 0;\n } else {\n toggledKey = arr[0] ?? null;\n toggledSelected = true;\n }\n\n const node =\n toggledKey != null ? nodesByKey.get(String(toggledKey)) : undefined;\n const selectedNodes = arr\n .map((k) => nodesByKey.get(String(k)))\n .filter((n): n is CubeTreeNodeData => !!n);\n\n const info: TreeOnSelectInfo = {\n selected: toggledSelected,\n node: node ?? ({} as CubeTreeNodeData),\n selectedNodes,\n };\n\n onSelect(arr, info);\n });\n\n /**\n * Stately propagates the `children` function through `childItems`,\n * so a single render function recursively turns the entire\n * `treeData` array into `<Item>` elements.\n */\n const renderCollectionItem = useEvent((item: CubeTreeNodeData) =>\n renderItem(item),\n );\n\n const ariaProps = useMemo(\n () => ({\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange:\n onSelect && selectionMode !== 'none'\n ? handleSelectionChange\n : undefined,\n expandedKeys: effectiveExpandedKeys,\n defaultExpandedKeys: effectiveDefaultExpandedKeys,\n onExpandedChange: handleExpandedChange,\n disabledKeys,\n disabledBehavior: 'all' as const,\n items: treeData,\n children: renderCollectionItem as any,\n 'aria-label': 'Tree',\n }),\n [\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n onSelect,\n handleSelectionChange,\n effectiveExpandedKeys,\n effectiveDefaultExpandedKeys,\n handleExpandedChange,\n disabledKeys,\n treeData,\n renderCollectionItem,\n ],\n );\n\n const baseState = useTreeState<CubeTreeNodeData>(ariaProps);\n\n /**\n * The legacy `TreeCollection` returned by `useTreeState` doesn't\n * implement `getChildren`, but `@react-aria/tree`'s `useTree`\n * (via `useGridListItem`) calls it unguarded for any nested row\n * (`node.level > 0`). Patch it once so `useTree` works on top of\n * the legacy state without forking.\n */\n const state = useMemo(() => {\n const collection = baseState.collection;\n if (typeof (collection as any).getChildren === 'function') {\n return baseState;\n }\n const getChildren = (key: Key): Iterable<Node<CubeTreeNodeData>> => {\n const result: Node<CubeTreeNodeData>[] = [];\n const node = collection.getItem(key);\n if (!node) return result;\n for (const child of node.childNodes) {\n result.push(child);\n }\n return result;\n };\n const patched = Object.assign(\n Object.create(Object.getPrototypeOf(collection)),\n collection,\n { getChildren },\n );\n return { ...baseState, collection: patched };\n }, [baseState]);\n\n const { gridProps } = useTree(ariaProps, state, treeRef);\n\n /**\n * Iterate the collection in DOM order. The TreeCollection only walks\n * into expanded subtrees, so `getKeys()` already gives us *only*\n * visible rows — no manual filtering required.\n */\n const visibleNodes: Node<CubeTreeNodeData>[] = useMemo(() => {\n const out: Node<CubeTreeNodeData>[] = [];\n for (const key of state.collection.getKeys()) {\n const node = state.collection.getItem(key);\n if (node && node.type === 'item') out.push(node);\n }\n return out;\n }, [state.collection, state.expandedKeys]);\n\n const heightStyle = useMemo<CSSProperties | undefined>(\n () =>\n height != null\n ? ({\n ['--tree-height' as keyof CSSProperties]: `${height}px`,\n } as CSSProperties)\n : undefined,\n [height],\n );\n\n const mods = useMemo(\n () => ({\n 'has-height': height != null,\n }),\n [height],\n );\n\n /**\n * Merge the consumer's forwarded ref with our internal `treeRef`. Both\n * must point at the same DOM node: `useTree` reads `treeRef.current` for\n * keyboard navigation/focus management, and consumers expect the\n * forwarded `ref` to receive the element too.\n */\n const mergedRef = useMemo(() => mergeRefs(ref, treeRef), [ref]);\n\n const elementProps = mergeProps(gridProps, {\n ref: mergedRef,\n });\n\n return (\n <TreeElement\n {...elementProps}\n ref={mergedRef}\n qa={qa ?? 'Tree'}\n mods={mods}\n styles={baseStyles}\n style={heightStyle}\n >\n {visibleNodes.map((node) => {\n const data = nodesByKey.get(String(node.key));\n if (!data) return null;\n const isExpanded = state.expandedKeys.has(node.key);\n return (\n <TreeNode\n key={node.key}\n node={node}\n data={data}\n state={state}\n isCheckable={isCheckable}\n isExpanded={isExpanded}\n isChecked={checkbox.checkedSet.has(String(node.key))}\n isIndeterminate={checkbox.halfCheckedSet.has(String(node.key))}\n isLoading={loadDataController.loadingKeys.has(String(node.key))}\n isBlockNode={blockNode}\n rowStyles={rowStyles}\n onToggleChecked={checkbox.toggle}\n />\n );\n })}\n </TreeElement>\n );\n}\n\nconst _Tree = forwardRef(TreeBase);\n\n/**\n * Hierarchical data display with optional checkboxes, single/multi\n * selection, async lazy loading, and keyboard navigation.\n *\n * Built on `useTree` / `useTreeState` (React Aria + React Stately) and\n * styled with Tasty.\n *\n * @example\n * ```tsx\n * <Tree\n * treeData={data}\n * isCheckable\n * selectionMode=\"none\"\n * defaultExpandedKeys={['root']}\n * onCheck={(keys) => console.log(keys)}\n * />\n * ```\n */\nexport const Tree = _Tree;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Tree.js","names":["mergeProps"],"sources":["../../../../src/components/content/Tree/Tree.tsx"],"sourcesContent":["import { OUTER_STYLES } from '@tenphi/tasty';\nimport { forwardRef, useMemo, useRef } from 'react';\nimport { useTree } from 'react-aria';\nimport { Item, useTreeState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { mergeProps, mergeRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\n\nimport { TreeElement } from './styled';\nimport { buildTreeIndex } from './tree-index';\nimport { TreeNode } from './TreeNode';\nimport { useCheckboxTree } from './use-checkbox-tree';\nimport { useLoadData } from './use-load-data';\n\nimport type { Key, Node, Selection } from '@react-types/shared';\nimport type {\n CSSProperties,\n ForwardedRef,\n ReactElement,\n ReactNode,\n} from 'react';\nimport type {\n CubeTreeNodeData,\n CubeTreeProps,\n TreeOnExpandInfo,\n TreeOnSelectInfo,\n TreeSelectionMode,\n} from './types';\n\n/**\n * Render an `<Item>` for React Stately's collection builder.\n *\n * The visible content is rendered by `TreeNode` via `nodesByKey`,\n * so `<Item>`'s body is only used by Stately for the collection\n * (`textValue` for keyboard nav, `childItems` for nested traversal).\n */\nfunction renderItem(node: CubeTreeNodeData): ReactElement {\n const textValue =\n typeof node.title === 'string' ? node.title : String(node.key);\n return (\n <Item\n key={node.key}\n textValue={textValue}\n childItems={node.children as CubeTreeNodeData[] | undefined}\n >\n {node.title as ReactNode}\n </Item>\n );\n}\n\nfunction collectDisabledKeys(\n treeData: CubeTreeNodeData[],\n treeIsDisabled: boolean,\n): string[] {\n const keys: string[] = [];\n const visit = (nodes: CubeTreeNodeData[]) => {\n for (const node of nodes) {\n if (treeIsDisabled || node.isDisabled) keys.push(node.key);\n if (node.children) visit(node.children);\n }\n };\n visit(treeData);\n return keys;\n}\n\n/** Expand the supplied keys with all of their ancestor keys. */\nfunction expandWithParents(\n keys: string[] | undefined,\n parentOf: Map<string, string | null>,\n): string[] | undefined {\n if (!keys || keys.length === 0) return keys;\n const set = new Set<string>(keys);\n for (const key of keys) {\n let parent = parentOf.get(key);\n while (parent) {\n set.add(parent);\n parent = parentOf.get(parent);\n }\n }\n return Array.from(set);\n}\n\n/**\n * Diff two key sets to find the single key that was added or removed.\n * Returns `null` when both sets are equal.\n */\nfunction findToggledKey(\n previous: Set<Key>,\n next: Set<Key>,\n): { key: Key; added: boolean } | null {\n for (const k of next) {\n if (!previous.has(k)) return { key: k, added: true };\n }\n for (const k of previous) {\n if (!next.has(k)) return { key: k, added: false };\n }\n return null;\n}\n\nfunction resolveSelectionMode(\n selectionMode: TreeSelectionMode | undefined,\n isSelectable: boolean | undefined,\n): TreeSelectionMode {\n if (selectionMode != null) return selectionMode;\n if (isSelectable === false) return 'none';\n return 'single';\n}\n\nfunction TreeBase(props: CubeTreeProps, ref: ForwardedRef<HTMLDivElement>) {\n const {\n treeData,\n isCheckable = false,\n isSelectable,\n selectionMode: selectionModeProp,\n isDisabled = false,\n defaultExpandedKeys,\n expandedKeys,\n autoExpandParent = false,\n defaultCheckedKeys,\n checkedKeys,\n defaultSelectedKeys,\n selectedKeys,\n height,\n loadData,\n onExpand,\n onCheck,\n onSelect,\n rowStyles,\n ariaLabel,\n qa,\n ...otherProps\n } = props;\n\n const baseStyles = extractStyles(otherProps, OUTER_STYLES);\n\n const treeRef = useRef<HTMLDivElement>(null);\n\n const treeIndex = useMemo(() => buildTreeIndex(treeData), [treeData]);\n const nodesByKey = treeIndex.byKey;\n const parentOf = treeIndex.parentOf;\n\n const disabledKeys = useMemo(\n () => collectDisabledKeys(treeData, isDisabled),\n [treeData, isDisabled],\n );\n\n const selectionMode = resolveSelectionMode(selectionModeProp, isSelectable);\n\n const effectiveExpandedKeys = useMemo(\n () =>\n autoExpandParent\n ? expandWithParents(expandedKeys, parentOf)\n : expandedKeys,\n [autoExpandParent, expandedKeys, parentOf],\n );\n\n const effectiveDefaultExpandedKeys = useMemo(\n () =>\n autoExpandParent\n ? expandWithParents(defaultExpandedKeys, parentOf)\n : defaultExpandedKeys,\n [autoExpandParent, defaultExpandedKeys, parentOf],\n );\n\n const checkbox = useCheckboxTree({\n treeData,\n index: treeIndex,\n isCheckable,\n defaultCheckedKeys,\n checkedKeys,\n onCheck,\n });\n\n const loadDataController = useLoadData({\n nodesByKey,\n loadData,\n initialExpandedKeys: effectiveExpandedKeys ?? effectiveDefaultExpandedKeys,\n });\n\n /**\n * In controlled mode, `previous` is read from `effectiveExpandedKeys`;\n * in uncontrolled mode this ref is the only source. Initialized from\n * the *effective* (ancestor-expanded) keys so the first toggle diffs\n * correctly.\n */\n const previousExpandedRef = useRef<Set<Key>>(\n new Set<Key>(effectiveExpandedKeys ?? effectiveDefaultExpandedKeys ?? []),\n );\n\n const handleExpandedChange = useEvent((nextSet: Set<Key>) => {\n loadDataController.onExpandedChanged(nextSet);\n\n const previous =\n expandedKeys !== undefined\n ? new Set<Key>(effectiveExpandedKeys ?? [])\n : previousExpandedRef.current;\n previousExpandedRef.current = new Set<Key>(nextSet);\n\n if (!onExpand) return;\n\n const toggled = findToggledKey(previous, nextSet);\n if (!toggled) return;\n\n const node = nodesByKey.get(String(toggled.key));\n if (!node) return;\n\n const info: TreeOnExpandInfo = {\n expanded: toggled.added,\n node,\n };\n onExpand(Array.from(nextSet), info);\n });\n\n /**\n * Same pattern as `previousExpandedRef`: in controlled mode we read\n * from `selectedKeys`; in uncontrolled mode this ref tracks state.\n */\n const previousSelectionRef = useRef<Set<Key>>(\n new Set<Key>(selectedKeys ?? defaultSelectedKeys ?? []),\n );\n\n /**\n * `useEvent` captures the closure lazily, so `state` (declared below\n * `ariaProps` / `useTreeState`) is safely accessible at call time.\n */\n const handleSelectionChange = useEvent((selection: Selection) => {\n if (!onSelect) return;\n let arr: Key[];\n if (selection === 'all') {\n // `nodesByKey` contains the full tree; use the collection's visible\n // keys so we don't leak keys under collapsed parents.\n arr = [];\n for (const key of state.collection.getKeys()) {\n const node = state.collection.getItem(key);\n if (node && node.type === 'item') arr.push(key);\n }\n } else {\n arr = Array.from(selection);\n }\n\n const nextSet = new Set<Key>(arr);\n const previous =\n selectedKeys !== undefined\n ? new Set<Key>(selectedKeys ?? [])\n : previousSelectionRef.current;\n previousSelectionRef.current = nextSet;\n\n const toggled = findToggledKey(previous, nextSet);\n if (!toggled) return;\n\n const node = nodesByKey.get(String(toggled.key));\n if (!node) return;\n\n const selectedNodes = arr\n .map((k) => nodesByKey.get(String(k)))\n .filter((n): n is CubeTreeNodeData => !!n);\n\n const info: TreeOnSelectInfo = {\n selected: toggled.added,\n node,\n selectedNodes,\n };\n\n onSelect(arr, info);\n });\n\n const hasOnSelect = onSelect != null;\n\n const ariaProps = useMemo(\n () => ({\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange:\n hasOnSelect && selectionMode !== 'none'\n ? handleSelectionChange\n : undefined,\n expandedKeys: effectiveExpandedKeys,\n defaultExpandedKeys: effectiveDefaultExpandedKeys,\n onExpandedChange: handleExpandedChange,\n disabledKeys,\n disabledBehavior: 'all' as const,\n items: treeData,\n children: renderItem as any,\n 'aria-label': ariaLabel ?? 'Tree',\n }),\n [\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n hasOnSelect,\n handleSelectionChange,\n effectiveExpandedKeys,\n effectiveDefaultExpandedKeys,\n handleExpandedChange,\n disabledKeys,\n treeData,\n ariaLabel,\n ],\n );\n\n const baseState = useTreeState<CubeTreeNodeData>(ariaProps);\n\n // The legacy `TreeCollection` from `useTreeState` lacks `getChildren`,\n // but `useTree` calls it for nested rows. Derive a patched state.\n // TODO: Remove this patch when upgrading to a react-stately version\n // that ships `getChildren` on TreeCollection natively.\n const state = useMemo(() => {\n const collection = baseState.collection;\n if (typeof (collection as any).getChildren === 'function') {\n return baseState;\n }\n const patched = Object.create(collection);\n patched.getChildren = (key: Key): Iterable<Node<CubeTreeNodeData>> => {\n const node = collection.getItem(key);\n return node ? Array.from(node.childNodes) : [];\n };\n return { ...baseState, collection: patched };\n }, [baseState]);\n\n const { gridProps } = useTree(ariaProps, state, treeRef);\n\n const visibleNodes: Node<CubeTreeNodeData>[] = useMemo(() => {\n const out: Node<CubeTreeNodeData>[] = [];\n for (const key of state.collection.getKeys()) {\n const node = state.collection.getItem(key);\n if (node && node.type === 'item') out.push(node);\n }\n return out;\n }, [state.collection]);\n\n const heightStyle = useMemo<CSSProperties | undefined>(\n () =>\n height != null\n ? ({\n ['--tree-height' as keyof CSSProperties]: `${height}px`,\n } as CSSProperties)\n : undefined,\n [height],\n );\n\n const mods = useMemo(\n () => ({\n 'has-height': height != null,\n }),\n [height],\n );\n\n // Both `useTree` and the consumer need the same DOM node.\n const mergedRef = useMemo(() => mergeRefs(ref, treeRef), [ref, treeRef]);\n\n const elementProps = mergeProps(gridProps, {\n ref: mergedRef,\n });\n\n return (\n <TreeElement\n {...elementProps}\n qa={qa ?? 'Tree'}\n mods={mods}\n styles={baseStyles}\n style={heightStyle}\n >\n {visibleNodes.map((node) => {\n const keyStr = String(node.key);\n const data = nodesByKey.get(keyStr);\n if (!data) return null;\n return (\n <TreeNode\n key={node.key}\n node={node}\n data={data}\n state={state}\n isCheckable={isCheckable}\n isExpanded={state.expandedKeys.has(node.key)}\n isChecked={checkbox.checkedSet.has(keyStr)}\n isIndeterminate={checkbox.halfCheckedSet.has(keyStr)}\n isLoading={loadDataController.loadingKeys.has(keyStr)}\n rowStyles={rowStyles}\n onToggleChecked={checkbox.toggle}\n />\n );\n })}\n </TreeElement>\n );\n}\n\nconst _Tree = forwardRef(TreeBase);\n_Tree.displayName = 'Tree';\n\n/**\n * Hierarchical data display with optional checkboxes, single/multi\n * selection, async lazy loading, and keyboard navigation.\n *\n * Built on `useTree` / `useTreeState` (React Aria + React Stately) and\n * styled with Tasty.\n *\n * @example\n * ```tsx\n * <Tree\n * treeData={data}\n * isCheckable\n * selectionMode=\"none\"\n * defaultExpandedKeys={['root']}\n * onCheck={(keys) => console.log(keys)}\n * />\n * ```\n */\nexport const Tree = _Tree;\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ccca45d | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
3
  import { useEvent } from "../../../_internal/hooks/use-event.js";
4
4
  import { LoadingIcon } from "../../../icons/LoadingIcon.js";
@@ -10,102 +10,55 @@ import { jsx } from "react/jsx-runtime";
10
10
  import { useHover, useTreeItem } from "react-aria";
11
11
 
12
12
  //#region src/components/content/Tree/TreeNode.tsx
13
- const ROW_LEVEL_OFFSET = 0;
13
+ const stopPropagation = (e) => {
14
+ e.stopPropagation();
15
+ };
14
16
  function TreeNodeInner(props) {
15
- const { node, data, state, isCheckable, isExpanded, isIndeterminate, isChecked, isLoading, isBlockNode, onToggleChecked, rowStyles } = props;
17
+ const { node, data, state, isCheckable, isExpanded, isIndeterminate, isChecked, isLoading, onToggleChecked, rowStyles } = props;
16
18
  const rowRef = useRef(null);
17
19
  const { rowProps, gridCellProps, expandButtonProps, isPressed } = useTreeItem({ node }, state, rowRef);
18
20
  const isDisabled = state.disabledKeys.has(node.key);
19
21
  const isSelected = state.selectionManager.isSelected(node.key);
20
- /**
21
- * `useTreeItem` doesn't track hover. The `Item` variant we extend
22
- * (`default.item`) uses the `hovered` mod (compiled to
23
- * `[data-hovered]`), so we run `useHover` ourselves and wire its
24
- * `hoverProps` into the row.
25
- */
26
22
  const { hoverProps, isHovered } = useHover({ isDisabled });
27
- /**
28
- * React Aria uses a roving-tabindex "virtual focus" model for treegrid:
29
- * only the row matching `selectionManager.focusedKey` is tabbable, and
30
- * arrow-key navigation updates that key instead of moving DOM focus
31
- * between every row. No `data-focused` / `:focus-visible` lands on the
32
- * row, so we mirror the focused key as a `focused` mod on the item
33
- * to make it stylable.
34
- */
35
23
  const isFocused = state.selectionManager.isFocused && state.selectionManager.focusedKey === node.key;
36
- /**
37
- * `useTreeItem` reports `aria-expanded` only on rows that *can* expand
38
- * (i.e. have child nodes in the collection). For lazy rows with no
39
- * children loaded yet but `isLeaf !== true`, we still want to render
40
- * a toggle so the consumer can fire `loadData`.
41
- */
42
24
  const isLeaf = data.isLeaf === true || data.isLeaf !== false && !node.hasChildNodes;
43
25
  const isRowCheckable = isCheckable && data.isCheckable !== false;
44
- const handleCheckboxClick = useEvent((e) => {
45
- e.stopPropagation();
46
- });
47
26
  const handleCheckboxChange = useEvent(() => {
48
27
  onToggleChecked(String(node.key));
49
28
  });
50
- const rowMods = useMemo(() => ({
29
+ const sharedMods = useMemo(() => ({
51
30
  checked: isChecked,
52
31
  indeterminate: isIndeterminate,
53
32
  expanded: isExpanded,
54
- disabled: isDisabled,
55
33
  loading: isLoading,
56
34
  leaf: isLeaf,
57
- "block-node": isBlockNode,
58
35
  "has-checkbox": isRowCheckable
59
36
  }), [
60
37
  isChecked,
61
38
  isIndeterminate,
62
39
  isExpanded,
63
- isDisabled,
64
40
  isLoading,
65
41
  isLeaf,
66
- isBlockNode,
67
42
  isRowCheckable
68
43
  ]);
44
+ const rowMods = useMemo(() => ({
45
+ ...sharedMods,
46
+ disabled: isDisabled
47
+ }), [sharedMods, isDisabled]);
69
48
  const itemMods = useMemo(() => ({
70
- checked: isChecked,
71
- indeterminate: isIndeterminate,
72
- expanded: isExpanded,
73
- loading: isLoading,
74
- leaf: isLeaf,
49
+ ...sharedMods,
75
50
  focused: isFocused,
76
51
  hovered: isHovered,
77
- pressed: isPressed,
78
- "has-checkbox": isRowCheckable
52
+ pressed: isPressed
79
53
  }), [
80
- isChecked,
81
- isIndeterminate,
82
- isExpanded,
83
- isLoading,
84
- isLeaf,
54
+ sharedMods,
85
55
  isFocused,
86
56
  isHovered,
87
- isPressed,
88
- isRowCheckable
57
+ isPressed
89
58
  ]);
90
- /**
91
- * Indent each row by its depth. `node.level` is 0-based at the root.
92
- * Pushed down via a CSS custom property so the styled element can
93
- * compute padding without re-extracting styles per row.
94
- */
95
- const levelStyle = useMemo(() => ({ ["--tree-level"]: String((node.level ?? ROW_LEVEL_OFFSET) - ROW_LEVEL_OFFSET) }), [node.level]);
96
- /**
97
- * `aria-checked` for treegrid rows that act as multi-state checkboxes.
98
- * Only set when the tree is checkable, so we don't pollute the row
99
- * with checkbox semantics in select-only mode.
100
- */
59
+ const levelStyle = useMemo(() => ({ ["--tree-level"]: String(node.level ?? 0) }), [node.level]);
101
60
  const ariaChecked = isRowCheckable ? isIndeterminate ? "mixed" : isChecked ? "true" : "false" : void 0;
102
61
  const finalRowProps = mergeProps$1(rowProps, hoverProps, { "aria-checked": ariaChecked });
103
- /**
104
- * Always render a toggle slot — even for leaf rows — so siblings
105
- * at the same indent level visually align. Leaves get a
106
- * non-interactive placeholder (a plain div) so user clicks can't
107
- * trigger anything.
108
- */
109
62
  const toggleNode = isLeaf ? /* @__PURE__ */ jsx(TreeNodeTogglePlaceholder, {
110
63
  "aria-hidden": true,
111
64
  "data-element": "Toggle"
@@ -118,8 +71,8 @@ function TreeNodeInner(props) {
118
71
  const checkboxNode = isRowCheckable ? /* @__PURE__ */ jsx(TreeNodeCheckboxWrapper, {
119
72
  "data-element": "Checkbox",
120
73
  role: "presentation",
121
- onClick: handleCheckboxClick,
122
- onKeyDown: handleCheckboxClick,
74
+ onClick: stopPropagation,
75
+ onKeyDown: stopPropagation,
123
76
  children: /* @__PURE__ */ jsx(__Checkbox, {
124
77
  isSelected: isChecked,
125
78
  isIndeterminate,