@cube-dev/ui-kit 0.200.1 → 0.202.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (717) hide show
  1. package/README.md +1 -1
  2. package/dist/CHANGELOG.md +50 -0
  3. package/dist/README.md +1 -1
  4. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  5. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  6. package/dist/_internal/hooks/use-event.js +1 -1
  7. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  8. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  9. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  10. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  11. package/dist/_internal/hooks/use-warn.js +1 -1
  12. package/dist/components/Block.js +1 -1
  13. package/dist/components/CollectionItem.js +1 -1
  14. package/dist/components/GlobalStyles.js +1 -1
  15. package/dist/components/GridProvider.js +1 -1
  16. package/dist/components/HiddenInput.js +2 -1
  17. package/dist/components/HiddenInput.js.map +1 -1
  18. package/dist/components/Root.js +1 -1
  19. package/dist/components/actions/Action/Action.js +1 -1
  20. package/dist/components/actions/Banner/Banner.js +1 -1
  21. package/dist/components/actions/Button/Button.js +1 -1
  22. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  23. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  24. package/dist/components/actions/ButtonSplit/context.js +1 -1
  25. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  26. package/dist/components/actions/CommandMenu/styled.js +1 -1
  27. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  28. package/dist/components/actions/ItemActionContext.js +1 -1
  29. package/dist/components/actions/ItemActionsWrapper.js +1 -1
  30. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  31. package/dist/components/actions/Link/Link.js +1 -1
  32. package/dist/components/actions/Menu/Menu.js +1 -1
  33. package/dist/components/actions/Menu/MenuCollectionItem.js +1 -1
  34. package/dist/components/actions/Menu/MenuItem.js +1 -1
  35. package/dist/components/actions/Menu/MenuSection.js +1 -1
  36. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  37. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  38. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  39. package/dist/components/actions/Menu/context.js +1 -1
  40. package/dist/components/actions/Menu/styled.js +1 -1
  41. package/dist/components/actions/actions-run.js +1 -1
  42. package/dist/components/actions/index.js +1 -1
  43. package/dist/components/actions/use-action.js +1 -1
  44. package/dist/components/actions/use-anchored-menu.js +1 -1
  45. package/dist/components/actions/use-context-menu.js +1 -1
  46. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  47. package/dist/components/content/Alert/Alert.js +1 -1
  48. package/dist/components/content/Alert/use-alert.js +1 -1
  49. package/dist/components/content/Avatar/Avatar.js +1 -1
  50. package/dist/components/content/Badge/Badge.js +1 -1
  51. package/dist/components/content/Card/Card.js +1 -1
  52. package/dist/components/content/Content.js +1 -1
  53. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  54. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  55. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  56. package/dist/components/content/Divider/Divider.d.ts +22 -0
  57. package/dist/components/content/Divider/Divider.js +159 -0
  58. package/dist/components/content/Divider/Divider.js.map +1 -0
  59. package/dist/components/content/Footer.js +1 -1
  60. package/dist/components/content/Header.js +1 -1
  61. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  62. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  63. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  64. package/dist/components/content/Item/Item.js +1 -1
  65. package/dist/components/content/Item/ItemWithNativeLinks.js +1 -1
  66. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  67. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  68. package/dist/components/content/Layout/GridLayout.js +1 -1
  69. package/dist/components/content/Layout/Layout.js +1 -1
  70. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  71. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  72. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  73. package/dist/components/content/Layout/LayoutContent.js +1 -1
  74. package/dist/components/content/Layout/LayoutContext.js +1 -1
  75. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  76. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  77. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  78. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  79. package/dist/components/content/Layout/LayoutPane.js +1 -1
  80. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  81. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  82. package/dist/components/content/Layout/LayoutPanelTransition.js +1 -1
  83. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  84. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  85. package/dist/components/content/Layout/index.js +1 -1
  86. package/dist/components/content/Layout/utils.js +1 -1
  87. package/dist/components/content/Paragraph.js +1 -1
  88. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  89. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  90. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  91. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  92. package/dist/components/content/Result/Result.js +1 -1
  93. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  94. package/dist/components/content/Tag/Tag.js +1 -1
  95. package/dist/components/content/Text.js +1 -1
  96. package/dist/components/content/TextItem/TextItem.d.ts +2 -1
  97. package/dist/components/content/TextItem/TextItem.js +134 -69
  98. package/dist/components/content/TextItem/TextItem.js.map +1 -1
  99. package/dist/components/content/Title.js +1 -1
  100. package/dist/components/content/Tree/Tree.js +39 -14
  101. package/dist/components/content/Tree/Tree.js.map +1 -1
  102. package/dist/components/content/Tree/TreeNode.js +8 -7
  103. package/dist/components/content/Tree/TreeNode.js.map +1 -1
  104. package/dist/components/content/Tree/checked-keys.js +158 -0
  105. package/dist/components/content/Tree/checked-keys.js.map +1 -0
  106. package/dist/components/content/Tree/rowId.js +16 -0
  107. package/dist/components/content/Tree/rowId.js.map +1 -0
  108. package/dist/components/content/Tree/styled.js +1 -1
  109. package/dist/components/content/Tree/tree-index.js +10 -2
  110. package/dist/components/content/Tree/tree-index.js.map +1 -1
  111. package/dist/components/content/Tree/types.d.ts +21 -1
  112. package/dist/components/content/Tree/use-checkbox-tree.js +17 -123
  113. package/dist/components/content/Tree/use-checkbox-tree.js.map +1 -1
  114. package/dist/components/content/Tree/use-load-data.js +1 -1
  115. package/dist/components/content/highlightText.js +1 -1
  116. package/dist/components/content/use-auto-tooltip.js +1 -1
  117. package/dist/components/data/DataTable/DataTable.js +1 -1
  118. package/dist/components/data/ItemTable/ItemTable.js +94 -66
  119. package/dist/components/data/ItemTable/ItemTable.js.map +1 -1
  120. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  121. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  122. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  123. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  124. package/dist/components/data/ItemTable/use-item-table-column-widths.js +1 -1
  125. package/dist/components/data/ItemTable/use-item-table-drag-drop.js +1 -1
  126. package/dist/components/data/ItemTable/use-item-table-pagination.js +1 -1
  127. package/dist/components/data/ItemTable/use-item-table-selection.js +1 -1
  128. package/dist/components/data/ItemTable/use-item-table-sort.js +1 -1
  129. package/dist/components/data/ItemTable/use-item-table-tree-model.js +1 -1
  130. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  131. package/dist/components/data/TableBase/RowCollection.js +1 -1
  132. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  133. package/dist/components/data/TableBase/TableRow.js +1 -1
  134. package/dist/components/data/TableBase/TableRowLink.js +88 -0
  135. package/dist/components/data/TableBase/TableRowLink.js.map +1 -0
  136. package/dist/components/data/TableBase/TableView.js +317 -69
  137. package/dist/components/data/TableBase/TableView.js.map +1 -1
  138. package/dist/components/data/TableBase/TreeGridTable.js +1 -1
  139. package/dist/components/data/TableBase/column-header.js +1 -1
  140. package/dist/components/data/TableBase/column-menu.js +1 -1
  141. package/dist/components/data/TableBase/column-styles.js +1 -1
  142. package/dist/components/data/TableBase/column-tint.js +1 -1
  143. package/dist/components/data/TableBase/row-menu.js +1 -1
  144. package/dist/components/data/TableBase/styled.js +33 -22
  145. package/dist/components/data/TableBase/styled.js.map +1 -1
  146. package/dist/components/data/TableBase/table-tree.js +1 -1
  147. package/dist/components/data/TableBase/types.d.ts +2 -1
  148. package/dist/components/data/TableBase/types.js +1 -1
  149. package/dist/components/data/TableBase/types.js.map +1 -1
  150. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  151. package/dist/components/data/TableBase/use-column-menu.js +1 -1
  152. package/dist/components/data/TableBase/use-column-order.js +1 -1
  153. package/dist/components/data/TableBase/use-column-window.js +1 -1
  154. package/dist/components/data/TableBase/use-container-width.js +1 -1
  155. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  156. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  157. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  158. package/dist/components/data/TableBase/use-table-search.js +1 -1
  159. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  160. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  161. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  162. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  163. package/dist/components/data/TableBase/use-table-tooltip-refresh.js +1 -1
  164. package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
  165. package/dist/components/fields/Checkbox/Checkbox.d.ts +3 -2
  166. package/dist/components/fields/Checkbox/Checkbox.js +21 -10
  167. package/dist/components/fields/Checkbox/Checkbox.js.map +1 -1
  168. package/dist/components/fields/Checkbox/CheckboxGroup.d.ts +3 -2
  169. package/dist/components/fields/Checkbox/CheckboxGroup.js +36 -42
  170. package/dist/components/fields/Checkbox/CheckboxGroup.js.map +1 -1
  171. package/dist/components/fields/Checkbox/context.js +1 -1
  172. package/dist/components/fields/ColorInput/ColorInput.d.ts +3 -2
  173. package/dist/components/fields/ColorInput/ColorInput.js +5 -3
  174. package/dist/components/fields/ColorInput/ColorInput.js.map +1 -1
  175. package/dist/components/fields/ColorPicker/ColorPicker.d.ts +9 -3
  176. package/dist/components/fields/ColorPicker/ColorPicker.js +182 -200
  177. package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -1
  178. package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
  179. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.d.ts +3 -2
  180. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +143 -171
  181. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js.map +1 -1
  182. package/dist/components/fields/ComboBox/ComboBox.d.ts +6 -4
  183. package/dist/components/fields/ComboBox/ComboBox.js +601 -574
  184. package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
  185. package/dist/components/fields/ComboBox/comboBoxOptions.js +1 -1
  186. package/dist/components/fields/CommandTextArea/CommandTextArea.js +5 -4
  187. package/dist/components/fields/CommandTextArea/CommandTextArea.js.map +1 -1
  188. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  189. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  190. package/dist/components/fields/DatePicker/DateInput.d.ts +3 -2
  191. package/dist/components/fields/DatePicker/DateInput.js +7 -5
  192. package/dist/components/fields/DatePicker/DateInput.js.map +1 -1
  193. package/dist/components/fields/DatePicker/DateInputBase.js +79 -76
  194. package/dist/components/fields/DatePicker/DateInputBase.js.map +1 -1
  195. package/dist/components/fields/DatePicker/DatePicker.d.ts +3 -2
  196. package/dist/components/fields/DatePicker/DatePicker.js +85 -173
  197. package/dist/components/fields/DatePicker/DatePicker.js.map +1 -1
  198. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  199. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  200. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  201. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  202. package/dist/components/fields/DatePicker/DateRangePicker.d.ts +3 -2
  203. package/dist/components/fields/DatePicker/DateRangePicker.js +117 -204
  204. package/dist/components/fields/DatePicker/DateRangePicker.js.map +1 -1
  205. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.d.ts +3 -2
  206. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +289 -434
  207. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js.map +1 -1
  208. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  209. package/dist/components/fields/DatePicker/PeriodPicker.d.ts +3 -2
  210. package/dist/components/fields/DatePicker/PeriodPicker.js +87 -113
  211. package/dist/components/fields/DatePicker/PeriodPicker.js.map +1 -1
  212. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  213. package/dist/components/fields/DatePicker/TimeInput.d.ts +3 -2
  214. package/dist/components/fields/DatePicker/TimeInput.js +7 -5
  215. package/dist/components/fields/DatePicker/TimeInput.js.map +1 -1
  216. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  217. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  218. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  219. package/dist/components/fields/DatePicker/period.js +1 -1
  220. package/dist/components/fields/DatePicker/props.js +1 -1
  221. package/dist/components/fields/DatePicker/utils.js +1 -1
  222. package/dist/components/fields/FileInput/FileInput.d.ts +3 -2
  223. package/dist/components/fields/FileInput/FileInput.js +114 -141
  224. package/dist/components/fields/FileInput/FileInput.js.map +1 -1
  225. package/dist/components/fields/FilterListBox/FilterListBox.js +10 -65
  226. package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
  227. package/dist/components/fields/FilterListBox/styled.js +66 -0
  228. package/dist/components/fields/FilterListBox/styled.js.map +1 -0
  229. package/dist/components/fields/FilterPicker/FilterPicker.d.ts +35 -3
  230. package/dist/components/fields/FilterPicker/FilterPicker.js +76 -15
  231. package/dist/components/fields/FilterPicker/FilterPicker.js.map +1 -1
  232. package/dist/components/fields/FilterPicker/FilterTree.js +413 -0
  233. package/dist/components/fields/FilterPicker/FilterTree.js.map +1 -0
  234. package/dist/components/fields/Input/Input.js +1 -1
  235. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  236. package/dist/components/fields/ListBox/ListBox.d.ts +3 -2
  237. package/dist/components/fields/ListBox/ListBox.js +7 -10
  238. package/dist/components/fields/ListBox/ListBox.js.map +1 -1
  239. package/dist/components/fields/ListBox/optionId.js +1 -1
  240. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  241. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  242. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  243. package/dist/components/fields/NumberInput/NumberInput.js +5 -3
  244. package/dist/components/fields/NumberInput/NumberInput.js.map +1 -1
  245. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  246. package/dist/components/fields/PasswordInput/PasswordInput.js +5 -3
  247. package/dist/components/fields/PasswordInput/PasswordInput.js.map +1 -1
  248. package/dist/components/fields/Picker/Picker.d.ts +9 -3
  249. package/dist/components/fields/Picker/Picker.js +12 -11
  250. package/dist/components/fields/Picker/Picker.js.map +1 -1
  251. package/dist/components/fields/RadioGroup/Radio.js +152 -154
  252. package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
  253. package/dist/components/fields/RadioGroup/RadioGroup.d.ts +3 -2
  254. package/dist/components/fields/RadioGroup/RadioGroup.js +85 -111
  255. package/dist/components/fields/RadioGroup/RadioGroup.js.map +1 -1
  256. package/dist/components/fields/RadioGroup/context.js +1 -1
  257. package/dist/components/fields/RadioGroup/context.js.map +1 -1
  258. package/dist/components/fields/SearchComboBox/SearchComboBox.d.ts +9 -4
  259. package/dist/components/fields/SearchComboBox/SearchComboBox.js +16 -23
  260. package/dist/components/fields/SearchComboBox/SearchComboBox.js.map +1 -1
  261. package/dist/components/fields/SearchInput/SearchInput.js +52 -48
  262. package/dist/components/fields/SearchInput/SearchInput.js.map +1 -1
  263. package/dist/components/fields/Select/Select.d.ts +3 -2
  264. package/dist/components/fields/Select/Select.js +8 -10
  265. package/dist/components/fields/Select/Select.js.map +1 -1
  266. package/dist/components/fields/Slider/Gradation.js +1 -1
  267. package/dist/components/fields/Slider/HueSlider.js +1 -1
  268. package/dist/components/fields/Slider/RangeSlider.js +19 -26
  269. package/dist/components/fields/Slider/RangeSlider.js.map +1 -1
  270. package/dist/components/fields/Slider/Slider.js +51 -58
  271. package/dist/components/fields/Slider/Slider.js.map +1 -1
  272. package/dist/components/fields/Slider/SliderBase.js +61 -60
  273. package/dist/components/fields/Slider/SliderBase.js.map +1 -1
  274. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  275. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  276. package/dist/components/fields/Slider/elements.js +1 -1
  277. package/dist/components/fields/Slider/index.js +1 -1
  278. package/dist/components/fields/Slider/types.d.ts +3 -2
  279. package/dist/components/fields/Switch/Switch.d.ts +12 -2
  280. package/dist/components/fields/Switch/Switch.js +97 -165
  281. package/dist/components/fields/Switch/Switch.js.map +1 -1
  282. package/dist/components/fields/TagInput/TagInput.d.ts +5 -2
  283. package/dist/components/fields/TagInput/TagInput.js +18 -13
  284. package/dist/components/fields/TagInput/TagInput.js.map +1 -1
  285. package/dist/components/fields/TagInput/TagList.js +1 -1
  286. package/dist/components/fields/TagInput/useActiveOption.js +1 -1
  287. package/dist/components/fields/TagInput/useTagError.js +1 -1
  288. package/dist/components/fields/TextArea/TextArea.js +5 -3
  289. package/dist/components/fields/TextArea/TextArea.js.map +1 -1
  290. package/dist/components/fields/TextInput/TextInput.js +5 -3
  291. package/dist/components/fields/TextInput/TextInput.js.map +1 -1
  292. package/dist/components/fields/TextInput/TextInputBase.d.ts +15 -4
  293. package/dist/components/fields/TextInput/TextInputBase.js +200 -104
  294. package/dist/components/fields/TextInput/TextInputBase.js.map +1 -1
  295. package/dist/components/fields/TextInput/displayed-validation.js +1 -1
  296. package/dist/components/fields/TextInput/index.d.ts +2 -2
  297. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
  298. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  299. package/dist/components/fields/TriggerActions.js +1 -1
  300. package/dist/components/fields/color/ColorPanel.js +1 -1
  301. package/dist/components/fields/color/channels.js +1 -1
  302. package/dist/components/fields/color/color.js +1 -1
  303. package/dist/components/fields/color/context.js +1 -1
  304. package/dist/components/fields/index.d.ts +2 -2
  305. package/dist/components/fields/option-origin-press.js +1 -1
  306. package/dist/components/form/FieldWrapper/FieldWrapper.js +120 -57
  307. package/dist/components/form/FieldWrapper/FieldWrapper.js.map +1 -1
  308. package/dist/components/form/FieldWrapper/field-description.js +1 -1
  309. package/dist/components/form/Form/Field.js +1 -1
  310. package/dist/components/form/Form/Form.js +1 -1
  311. package/dist/components/form/Form/ModernFormRoot.js +1 -1
  312. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  313. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  314. package/dist/components/form/Form/SubmitError.js +1 -1
  315. package/dist/components/form/Form/backend.js +1 -1
  316. package/dist/components/form/Form/index.js +1 -1
  317. package/dist/components/form/Form/modern/actions.js +1 -1
  318. package/dist/components/form/Form/modern/context.js +1 -1
  319. package/dist/components/form/Form/modern/controller.js +1 -1
  320. package/dist/components/form/Form/modern/field-binding.js +1 -1
  321. package/dist/components/form/Form/modern/field.js +1 -1
  322. package/dist/components/form/Form/modern/react.js +1 -1
  323. package/dist/components/form/Form/modern/store.js +1 -1
  324. package/dist/components/form/Form/modern/validation.js +1 -1
  325. package/dist/components/form/Form/modern/values.js +1 -1
  326. package/dist/components/form/Form/reset-unbound-controls.js +1 -1
  327. package/dist/components/form/Form/use-field/use-field-binding.js +1 -1
  328. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  329. package/dist/components/form/Form/use-field/use-field.js +1 -1
  330. package/dist/components/form/Form/use-form.js +1 -1
  331. package/dist/components/form/Form/validation.js +1 -1
  332. package/dist/components/form/Label.js +1 -1
  333. package/dist/components/form/field-chrome.js +1 -1
  334. package/dist/components/form/field-chrome.js.map +1 -1
  335. package/dist/components/form/field-layout.d.ts +10 -0
  336. package/dist/components/form/field-layout.js +96 -0
  337. package/dist/components/form/field-layout.js.map +1 -0
  338. package/dist/components/form/index.d.ts +2 -1
  339. package/dist/components/form/legacy-tooltip.js +15 -2
  340. package/dist/components/form/legacy-tooltip.js.map +1 -1
  341. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  342. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  343. package/dist/components/form/validation/use-validation-props.js +1 -1
  344. package/dist/components/form/wrapper.js +6 -2
  345. package/dist/components/form/wrapper.js.map +1 -1
  346. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  347. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  348. package/dist/components/layout/Flex.js +1 -1
  349. package/dist/components/layout/Flow.js +1 -1
  350. package/dist/components/layout/Grid.js +1 -1
  351. package/dist/components/layout/Panel.js +1 -1
  352. package/dist/components/layout/Prefix.js +1 -1
  353. package/dist/components/layout/ResizablePanel.js +1 -1
  354. package/dist/components/layout/Space.js +1 -1
  355. package/dist/components/layout/Suffix.js +1 -1
  356. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  357. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  358. package/dist/components/navigation/Tabs/BoardDragActiveProvider.js +1 -1
  359. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  360. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  361. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  362. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  363. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  364. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  365. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  366. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  367. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  368. package/dist/components/navigation/Tabs/styled.js +2 -1
  369. package/dist/components/navigation/Tabs/styled.js.map +1 -1
  370. package/dist/components/navigation/Tabs/types.js +1 -1
  371. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  372. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  373. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  374. package/dist/components/other/Calendar/Calendar.js +1 -1
  375. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  376. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  377. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  378. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  379. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  380. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  381. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  382. package/dist/components/other/Calendar/styled.js +1 -1
  383. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  384. package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
  385. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  386. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  387. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  388. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  389. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  390. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  391. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  392. package/dist/components/overlays/Dialog/ModernDialogForm.js +1 -1
  393. package/dist/components/overlays/Dialog/context.js +1 -1
  394. package/dist/components/overlays/Dialog/default-button-text.js +1 -1
  395. package/dist/components/overlays/Dialog/use-content-overflow.js +1 -1
  396. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  397. package/dist/components/overlays/Dialog/use-dialog-open-sync.js +1 -1
  398. package/dist/components/overlays/Dialog/use-retained-dialog-focus.js +1 -1
  399. package/dist/components/overlays/Modal/Modal.js +1 -1
  400. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  401. package/dist/components/overlays/Modal/Overlay.js +1 -1
  402. package/dist/components/overlays/Modal/Popover.js +1 -1
  403. package/dist/components/overlays/Modal/Tray.js +1 -1
  404. package/dist/components/overlays/Modal/Underlay.js +1 -1
  405. package/dist/components/overlays/Modal/modal-containment.js +1 -1
  406. package/dist/components/overlays/Notifications/Notification.js +1 -1
  407. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  408. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  409. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  410. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  411. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  412. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  413. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +2 -2
  414. package/dist/components/overlays/Notifications/PersistentNotificationsList.js.map +1 -1
  415. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  416. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  417. package/dist/components/overlays/Notifications/index.js +1 -1
  418. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  419. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  420. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  421. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  422. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  423. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  424. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  425. package/dist/components/overlays/Toast/index.js +1 -1
  426. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  427. package/dist/components/overlays/Toast/useToast.js +1 -1
  428. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  429. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  430. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  431. package/dist/components/overlays/Tooltip/context.js +1 -1
  432. package/dist/components/overlays/Tooltip/split-trigger-props.js +1 -1
  433. package/dist/components/portal/Portal.js +1 -1
  434. package/dist/components/portal/PortalProvider.js +1 -1
  435. package/dist/components/portal/usePortal.js +1 -1
  436. package/dist/components/shared/DraggableCollection.js +1 -1
  437. package/dist/components/shared/InvalidIcon.js +1 -1
  438. package/dist/components/shared/ValidIcon.js +1 -1
  439. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  440. package/dist/components/status/Spin/Cube.js +1 -1
  441. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  442. package/dist/components/status/Spin/Spin.js +1 -1
  443. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  444. package/dist/data/item-themes.js +116 -116
  445. package/dist/data/item-themes.js.map +1 -1
  446. package/dist/data/themes.js +1 -1
  447. package/dist/eslint-plugin/defaults.generated.js +1 -1
  448. package/dist/eslint-plugin/index.js +1 -1
  449. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  450. package/dist/i18n/I18nProvider.js +1 -1
  451. package/dist/i18n/createFormatter.js +1 -1
  452. package/dist/i18n/index.js +1 -1
  453. package/dist/i18n/instance.js +1 -1
  454. package/dist/i18n/locales/de-DE/uikit.js +1 -1
  455. package/dist/i18n/locales/en-US/uikit.js +1 -1
  456. package/dist/i18n/locales/es-ES/uikit.js +1 -1
  457. package/dist/i18n/locales/es-MX/uikit.js +1 -1
  458. package/dist/i18n/locales/fr-FR/uikit.js +1 -1
  459. package/dist/i18n/locales/it-IT/uikit.js +1 -1
  460. package/dist/i18n/locales/ja-JP/uikit.js +1 -1
  461. package/dist/i18n/locales/nb-NO/uikit.js +1 -1
  462. package/dist/i18n/locales/pt-BR/uikit.js +1 -1
  463. package/dist/i18n/locales/pt-PT/uikit.js +1 -1
  464. package/dist/i18n/locales/sv-SE/uikit.js +1 -1
  465. package/dist/i18n/locales/vi-VN/uikit.js +1 -1
  466. package/dist/i18n/locales.js +1 -1
  467. package/dist/i18n/namespace.js +1 -1
  468. package/dist/i18n/useFormatter.js +1 -1
  469. package/dist/i18n/useI18n.js +1 -1
  470. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  471. package/dist/icons/AdjustmentsIcon.js +1 -1
  472. package/dist/icons/AiIcon.js +1 -1
  473. package/dist/icons/AreaChartIcon.js +1 -1
  474. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  475. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  476. package/dist/icons/BackwardIcon.js +1 -1
  477. package/dist/icons/BarChartIcon.js +1 -1
  478. package/dist/icons/BellFilledIcon.js +1 -1
  479. package/dist/icons/BellIcon.js +1 -1
  480. package/dist/icons/BooleanIcon.js +1 -1
  481. package/dist/icons/CalendarEditIcon.js +1 -1
  482. package/dist/icons/CalendarIcon.js +1 -1
  483. package/dist/icons/CaretDownIcon.js +1 -1
  484. package/dist/icons/CaretUpIcon.js +1 -1
  485. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  486. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  487. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  488. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  489. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  490. package/dist/icons/ChartBarLineIcon.js +1 -1
  491. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  492. package/dist/icons/ChartBarStackedIcon.js +1 -1
  493. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  494. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  495. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  496. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  497. package/dist/icons/ChartBubbleIcon.js +1 -1
  498. package/dist/icons/ChartDonut2Icon.js +1 -1
  499. package/dist/icons/ChartFunnelIcon.js +1 -1
  500. package/dist/icons/ChartHeatmapIcon.js +1 -1
  501. package/dist/icons/ChartKPIIcon.js +1 -1
  502. package/dist/icons/ChartPie2Icon.js +1 -1
  503. package/dist/icons/ChartScatterIcon.js +1 -1
  504. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  505. package/dist/icons/CheckCircleIcon.js +1 -1
  506. package/dist/icons/CheckIcon.js +1 -1
  507. package/dist/icons/CircleFilledIcon.js +1 -1
  508. package/dist/icons/ClearIcon.js +1 -1
  509. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  510. package/dist/icons/CloseCircleIcon.js +1 -1
  511. package/dist/icons/CloseIcon.js +1 -1
  512. package/dist/icons/CodeIcon.js +1 -1
  513. package/dist/icons/ColumnTotalIcon.js +1 -1
  514. package/dist/icons/CopyIcon.js +1 -1
  515. package/dist/icons/CountIcon.js +1 -1
  516. package/dist/icons/CubeIcon.js +1 -1
  517. package/dist/icons/CubePauseIcon.js +1 -1
  518. package/dist/icons/CubePlayIcon.js +1 -1
  519. package/dist/icons/CurrencyDollarIcon.js +1 -1
  520. package/dist/icons/DangerIcon.js +1 -1
  521. package/dist/icons/DashboardIcon.js +1 -1
  522. package/dist/icons/DatabaseIcon.js +1 -1
  523. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  524. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  525. package/dist/icons/DirectionIcon.js +1 -1
  526. package/dist/icons/DonutIcon.js +1 -1
  527. package/dist/icons/DownIcon.js +1 -1
  528. package/dist/icons/EditIcon.js +1 -1
  529. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  530. package/dist/icons/ExclamationCircleIcon.js +1 -1
  531. package/dist/icons/ExclamationIcon.js +1 -1
  532. package/dist/icons/EyeIcon.js +1 -1
  533. package/dist/icons/EyeInvisibleIcon.js +1 -1
  534. package/dist/icons/FilterIcon.js +1 -1
  535. package/dist/icons/FolderFilledIcon.js +1 -1
  536. package/dist/icons/FolderIcon.js +1 -1
  537. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  538. package/dist/icons/FolderOpenIcon.js +1 -1
  539. package/dist/icons/ForwardIcon.js +1 -1
  540. package/dist/icons/GripVerticalIcon.js +1 -1
  541. package/dist/icons/HierarchyIcon.js +1 -1
  542. package/dist/icons/HierarchyOpenIcon.js +1 -1
  543. package/dist/icons/Icon.js +1 -1
  544. package/dist/icons/InfoCircleIcon.js +1 -1
  545. package/dist/icons/InfoIcon.js +1 -1
  546. package/dist/icons/KeyIcon.js +1 -1
  547. package/dist/icons/LeftIcon.js +1 -1
  548. package/dist/icons/LineChartIcon.js +1 -1
  549. package/dist/icons/LoadingIcon.js +1 -1
  550. package/dist/icons/LockFilledIcon.js +1 -1
  551. package/dist/icons/LockIcon.js +1 -1
  552. package/dist/icons/MoreIcon.js +1 -1
  553. package/dist/icons/NotAllowedIcon.js +1 -1
  554. package/dist/icons/Number123Icon.js +1 -1
  555. package/dist/icons/NumberIcon.js +1 -1
  556. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  557. package/dist/icons/PauseCircleIcon.js +1 -1
  558. package/dist/icons/PauseIcon.js +1 -1
  559. package/dist/icons/PercentageIcon.js +1 -1
  560. package/dist/icons/PieChartIcon.js +1 -1
  561. package/dist/icons/PipetteIcon.js +1 -1
  562. package/dist/icons/PlayCircleIcon.js +1 -1
  563. package/dist/icons/PlayIcon.js +1 -1
  564. package/dist/icons/PlusIcon.js +1 -1
  565. package/dist/icons/ProgressBarIcon.js +1 -1
  566. package/dist/icons/ReloadIcon.js +1 -1
  567. package/dist/icons/ReportIcon.js +1 -1
  568. package/dist/icons/ReturnIcon.js +1 -1
  569. package/dist/icons/RightIcon.js +1 -1
  570. package/dist/icons/RowTotalsIcon.js +1 -1
  571. package/dist/icons/SchemeIcon.js +1 -1
  572. package/dist/icons/SearchIcon.js +1 -1
  573. package/dist/icons/SemanticQueryIcon.js +1 -1
  574. package/dist/icons/SettingsIcon.js +1 -1
  575. package/dist/icons/ShieldFilledIcon.js +1 -1
  576. package/dist/icons/ShieldIcon.js +1 -1
  577. package/dist/icons/SlashIcon.js +1 -1
  578. package/dist/icons/SparklesIcon.js +1 -1
  579. package/dist/icons/SqlIcon.js +1 -1
  580. package/dist/icons/StatsIcon.js +1 -1
  581. package/dist/icons/StopIcon.js +1 -1
  582. package/dist/icons/StringIcon.js +1 -1
  583. package/dist/icons/SubtotalsIcon.js +1 -1
  584. package/dist/icons/SwitchIcon.js +1 -1
  585. package/dist/icons/TableIcon.js +1 -1
  586. package/dist/icons/ThumbsDownIcon.js +1 -1
  587. package/dist/icons/ThumbsUpIcon.js +1 -1
  588. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  589. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  590. package/dist/icons/ThunderboltIcon.js +1 -1
  591. package/dist/icons/TimeIcon.js +1 -1
  592. package/dist/icons/TrashIcon.js +1 -1
  593. package/dist/icons/UnlockIcon.js +1 -1
  594. package/dist/icons/UpIcon.js +1 -1
  595. package/dist/icons/UserGroupIcon.js +1 -1
  596. package/dist/icons/UserIcon.js +1 -1
  597. package/dist/icons/UserLockIcon.js +1 -1
  598. package/dist/icons/ViewIcon.js +1 -1
  599. package/dist/icons/WarningFilledIcon.js +1 -1
  600. package/dist/icons/WarningIcon.js +1 -1
  601. package/dist/icons/wrap-icon.js +1 -1
  602. package/dist/index.d.ts +4 -3
  603. package/dist/index.js +4 -4
  604. package/dist/index.js.map +1 -1
  605. package/dist/probe/canonicalize.js +1 -1
  606. package/dist/probe/css.js +1 -1
  607. package/dist/probe/index.js +1 -1
  608. package/dist/provider.d.ts +5 -0
  609. package/dist/provider.js +19 -7
  610. package/dist/provider.js.map +1 -1
  611. package/dist/providers/TrackingProvider.js +1 -1
  612. package/dist/providers/navigation-url.js +1 -1
  613. package/dist/providers/navigationAdapter.default.js +1 -1
  614. package/dist/providers/use-navigation.js +1 -1
  615. package/dist/shared/form.d.ts +3 -1
  616. package/dist/tokens/all-tokens.js +1 -1
  617. package/dist/tokens/base.js +1 -1
  618. package/dist/tokens/color-seed.js +1 -1
  619. package/dist/tokens/color-theme.js +1 -1
  620. package/dist/tokens/colors.js +1 -1
  621. package/dist/tokens/layout.js +1 -1
  622. package/dist/tokens/lazy-styles.js +1 -1
  623. package/dist/tokens/legacy-color.js +1 -1
  624. package/dist/tokens/palette-config.js +1 -1
  625. package/dist/tokens/palette.js +4 -4
  626. package/dist/tokens/palette.js.map +1 -1
  627. package/dist/tokens/resolve.js +1 -1
  628. package/dist/tokens/shadows.js +1 -1
  629. package/dist/tokens/sizes.js +1 -1
  630. package/dist/tokens/spacing.js +1 -1
  631. package/dist/tokens/typography.js +1 -1
  632. package/dist/utils/ResizeSensor.js +1 -1
  633. package/dist/utils/colors.js +1 -1
  634. package/dist/utils/dotize.js +1 -1
  635. package/dist/utils/is-dev-env.js +1 -1
  636. package/dist/utils/modules.js +1 -1
  637. package/dist/utils/promise.js +1 -1
  638. package/dist/utils/raf.js +1 -1
  639. package/dist/utils/random.js +1 -1
  640. package/dist/utils/range.js +1 -1
  641. package/dist/utils/react/RenderCache.js +1 -1
  642. package/dist/utils/react/Slots.js +1 -1
  643. package/dist/utils/react/chain.js +1 -1
  644. package/dist/utils/react/disabledProps.js +29 -2
  645. package/dist/utils/react/disabledProps.js.map +1 -1
  646. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  647. package/dist/utils/react/index.js +1 -1
  648. package/dist/utils/react/interactions.js +1 -1
  649. package/dist/utils/react/isTextOnly.js +1 -1
  650. package/dist/utils/react/mapProps.js +1 -1
  651. package/dist/utils/react/mergeProps.js +1 -1
  652. package/dist/utils/react/nullableValue.js +1 -1
  653. package/dist/utils/react/overlayKeyPropagation.js +44 -7
  654. package/dist/utils/react/overlayKeyPropagation.js.map +1 -1
  655. package/dist/utils/react/programmaticFocus.js +1 -1
  656. package/dist/utils/react/resolveIcon.js +1 -1
  657. package/dist/utils/react/sharedStore.js +1 -1
  658. package/dist/utils/react/useBufferedValue.js +1 -1
  659. package/dist/utils/react/useCombinedRefs.js +1 -1
  660. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  661. package/dist/utils/react/useEventBus.js +1 -1
  662. package/dist/utils/react/useId.js +1 -1
  663. package/dist/utils/react/useIsDarwin.js +1 -1
  664. package/dist/utils/react/useKeySymbols.js +1 -1
  665. package/dist/utils/react/useLayoutEffect.js +1 -1
  666. package/dist/utils/react/useLocalStorage.js +1 -1
  667. package/dist/utils/react/useMergeStyles.js +1 -1
  668. package/dist/utils/react/useOverlayEscapeGuard.js +1 -1
  669. package/dist/utils/react/usePopoverSync.js +1 -1
  670. package/dist/utils/react/useQaProps.js +1 -1
  671. package/dist/utils/react/useScheme.js +1 -1
  672. package/dist/utils/react/useViewportSize.js +1 -1
  673. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  674. package/dist/utils/selection.js +1 -1
  675. package/dist/utils/styles.js +1 -1
  676. package/dist/utils/tree.js +1 -1
  677. package/dist/utils/warnings.js +1 -1
  678. package/dist/version.js +3 -3
  679. package/docs/CreateComponent.md +1 -1
  680. package/docs/FieldProperties.md +17 -7
  681. package/docs/Usage.md +3 -0
  682. package/docs/components/content/Divider.md +103 -21
  683. package/docs/components/content/Tree.md +5 -4
  684. package/docs/components/data/ItemTable.md +9 -1
  685. package/docs/components/fields/Checkbox.md +7 -8
  686. package/docs/components/fields/ColorInput.md +11 -13
  687. package/docs/components/fields/ColorPicker.md +2 -2
  688. package/docs/components/fields/ColorSwatchGroup.md +2 -3
  689. package/docs/components/fields/ComboBox.md +2 -4
  690. package/docs/components/fields/CommandTextArea.md +3 -5
  691. package/docs/components/fields/DatePicker.md +1 -4
  692. package/docs/components/fields/FileInput.md +1 -5
  693. package/docs/components/fields/FilterListBox.md +0 -3
  694. package/docs/components/fields/FilterPicker.md +68 -5
  695. package/docs/components/fields/HueSlider.md +1 -2
  696. package/docs/components/fields/ListBox.md +0 -3
  697. package/docs/components/fields/NumberInput.md +5 -6
  698. package/docs/components/fields/PasswordInput.md +7 -8
  699. package/docs/components/fields/PeriodPicker.md +0 -4
  700. package/docs/components/fields/Picker.md +2 -4
  701. package/docs/components/fields/RadioGroup.md +4 -5
  702. package/docs/components/fields/SearchComboBox.md +2 -4
  703. package/docs/components/fields/SearchInput.md +3 -4
  704. package/docs/components/fields/Select.md +0 -3
  705. package/docs/components/fields/Slider.md +0 -1
  706. package/docs/components/fields/Switch.md +16 -3
  707. package/docs/components/fields/TagInput.md +3 -6
  708. package/docs/components/fields/TextArea.md +9 -8
  709. package/docs/components/fields/TextInput.md +39 -10
  710. package/docs/components/overlays/Tooltip.md +1 -1
  711. package/docs/tasty/ai-agents.md +1 -1
  712. package/docs/tasty/react-api.md +1 -1
  713. package/docs/tasty/styles.md +37 -3
  714. package/package.json +6 -4
  715. package/dist/components/content/Divider.d.ts +0 -7
  716. package/dist/components/content/Divider.js +0 -105
  717. package/dist/components/content/Divider.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Tree.js","names":["useVirtualizer","OUTER_STYLES","forwardRef","useLayoutEffect","useMemo","useRef","useTree","Item","useTreeState","useEvent","useI18n","SIZE_NAME_TO_KEY","SIZES","mergeRefs","extractStyles","TreeElement","TreeScrollContainer","TreeSizer","buildTreeIndex","TreeNode","useCheckboxTree","useLoadData","Key","Node","Selection","ForwardedRef","ReactElement","ReactNode","CubeTreeNodeData","CubeTreeProps","TreeOnExpandInfo","TreeOnSelectInfo","TreeSelectionMode","renderItem","node","textValue","title","String","key","children","collectDisabledKeys","treeData","treeIsDisabled","keys","visit","nodes","isDisabled","push","expandWithParents","parentOf","Map","length","set","Set","parent","get","add","Array","from","findToggledKey","previous","next","added","k","has","resolveSelectionMode","selectionMode","isSelectable","TreeBase","props","ref","HTMLDivElement","isCheckable","selectionModeProp","size","shape","containerPadding","defaultExpandedKeys","expandedKeys","autoExpandParent","defaultCheckedKeys","checkedKeys","defaultSelectedKeys","selectedKeys","height","loadData","onExpand","onCheck","onSelect","itemProps","rowStyles","ariaLabel","qa","menu","treeMenu","contextMenu","treeContextMenu","onAction","treeOnAction","menuTriggerProps","menuProps","otherProps","baseStyles","treeRef","scrollRef","treeIndex","nodesByKey","byKey","disabledKeys","effectiveExpandedKeys","effectiveDefaultExpandedKeys","checkbox","index","loadDataController","initialExpandedKeys","previousExpandedRef","handleExpandedChange","nextSet","onExpandedChanged","undefined","current","toggled","info","expanded","previousSelectionRef","handleSelectionChange","selection","arr","state","collection","getKeys","getItem","type","selectedNodes","map","filter","n","selected","hasOnSelect","t","treeLabel","ariaProps","onSelectionChange","onExpandedChange","disabledBehavior","const","items","baseState","getChildren","patched","Object","create","Iterable","childNodes","gridProps","visibleNodes","out","visibleNodesRef","rowVirtualizer","count","getScrollElement","getItemKey","estimateSize","gap","overscan","paddingStart","paddingEnd","treeTokens","totalSize","getTotalSize","lastFocusedScrollRef","lastSelectedScrollRef","focusedKey","selectionManager","findIndex","scrollToIndex","align","target","mods","mergedScrollRef","getVirtualItems","virtualItem","keyStr","data","checkedSet","halfCheckedSet","loadingKeys","start","measureElement","toggle","_Tree","displayName","Tree"],"sources":["../../../../src/components/content/Tree/Tree.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { OUTER_STYLES } from '@tenphi/tasty';\nimport { forwardRef, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useTree } from 'react-aria';\nimport { Item, useTreeState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useI18n } from '../../../i18n';\nimport { SIZE_NAME_TO_KEY, SIZES } from '../../../tokens/sizes';\nimport { mergeRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\n\nimport { TreeElement, TreeScrollContainer, TreeSizer } 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 { ForwardedRef, ReactElement, ReactNode } 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 size = 'medium',\n shape = 'default',\n containerPadding = 4,\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 itemProps,\n rowStyles,\n ariaLabel,\n qa,\n menu: treeMenu,\n contextMenu: treeContextMenu,\n onAction: treeOnAction,\n menuTriggerProps,\n menuProps,\n ...otherProps\n } = props;\n\n const baseStyles = extractStyles(otherProps, OUTER_STYLES);\n\n const treeRef = useRef<HTMLDivElement>(null);\n const scrollRef = 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 const { t } = useI18n();\n const treeLabel = ariaLabel ?? t('tree.ariaLabel', 'Tree');\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': treeLabel,\n }),\n [\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n hasOnSelect,\n handleSelectionChange,\n effectiveExpandedKeys,\n effectiveDefaultExpandedKeys,\n handleExpandedChange,\n disabledKeys,\n treeData,\n treeLabel,\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 visibleNodesRef = useRef(visibleNodes);\n visibleNodesRef.current = visibleNodes;\n\n // ----- Virtualization -----\n const rowVirtualizer = useVirtualizer({\n count: visibleNodes.length,\n getScrollElement: () => scrollRef.current,\n getItemKey: (index: number) => {\n const node = visibleNodesRef.current[index];\n return node?.key ?? index;\n },\n estimateSize: () => SIZES[SIZE_NAME_TO_KEY[size]],\n gap: 1,\n overscan: 10,\n paddingStart: containerPadding,\n paddingEnd: containerPadding,\n });\n\n const treeTokens = useMemo(\n () => ({\n '$tree-height': height == null ? undefined : `${height}px`,\n '$tree-padding': `${containerPadding}px`,\n }),\n [height, containerPadding],\n );\n\n const totalSize = rowVirtualizer.getTotalSize();\n\n /**\n * Each scroll effect tracks its own \"last scrolled\" target instead\n * of sharing one ref. A shared ref creates a feedback loop: keyboard\n * nav updates the focused-key ref to the new row, and any subsequent\n * `visibleNodes` change OR `selectedKeys` array-identity change\n * (very common — `selectedKeys={[value]}` allocates a fresh array\n * every parent render) re-runs the selectedKeys effect, which sees\n * the ref no longer matches `selectedKeys[0]` and yanks the viewport\n * back to the selected row. Two refs let each effect dedupe against\n * its own intent only; the cost is at most one duplicate\n * `scrollToIndex` call when click updates focus and selection in the\n * same render (idempotent — both target the same index).\n */\n const lastFocusedScrollRef = useRef<Key | null>(null);\n const lastSelectedScrollRef = useRef<string | null>(null);\n\n /**\n * Keep the focused row visible during keyboard navigation.\n *\n * Uses `rowVirtualizer.scrollToIndex` (instead of\n * `querySelector + scrollIntoView`) so the scroll lands even when the\n * target row is outside the virtualizer's currently rendered window.\n * `align: 'auto'` only scrolls when needed, matching the prior\n * `scrollIntoView({ block: 'nearest' })` behavior.\n */\n useLayoutEffect(() => {\n const focusedKey = state.selectionManager.focusedKey;\n if (focusedKey == null) return;\n if (lastFocusedScrollRef.current === focusedKey) return;\n\n const index = visibleNodesRef.current.findIndex(\n (n) => n.key === focusedKey,\n );\n if (index < 0) return;\n\n rowVirtualizer.scrollToIndex(index, { align: 'auto' });\n lastFocusedScrollRef.current = focusedKey;\n }, [state.selectionManager.focusedKey, rowVirtualizer]);\n\n /**\n * Scroll into view when controlled `selectedKeys` changes externally.\n *\n * Selection-manager `focusedKey` only updates on explicit user\n * interaction (click / keyboard) — it does NOT track controlled\n * `selectedKeys` prop changes. So when a parent updates the prop\n * (e.g. opening a file from elsewhere), we need a separate effect\n * to bring the row into view.\n *\n * Re-runs on `visibleNodes` so we retry once parents are expanded\n * (the row is invisible to the virtualizer until then).\n */\n useLayoutEffect(() => {\n if (selectedKeys == null) return;\n const target = selectedKeys[0];\n if (target == null) return;\n if (lastSelectedScrollRef.current === target) return;\n\n const index = visibleNodes.findIndex((n) => String(n.key) === target);\n if (index < 0) return;\n\n rowVirtualizer.scrollToIndex(index, { align: 'auto' });\n lastSelectedScrollRef.current = target;\n }, [selectedKeys, visibleNodes, rowVirtualizer]);\n\n const mods = useMemo(\n () => ({\n 'has-height': height != null,\n shape,\n }),\n [height, shape],\n );\n\n // The forwarded ref points at the inner scroll container so\n // consumers can drive `scrollTop` directly. `treeRef` (used by\n // `useTree` for keyboard handling and as the role=\"treegrid\"\n // anchor) stays internal on `TreeElement`.\n const mergedScrollRef = useMemo(\n () => mergeRefs(ref, scrollRef),\n [ref, scrollRef],\n );\n\n return (\n <TreeElement\n {...gridProps}\n ref={treeRef}\n qa={qa ?? 'Tree'}\n mods={mods}\n styles={baseStyles}\n tokens={treeTokens}\n >\n <TreeScrollContainer ref={mergedScrollRef}>\n <TreeSizer\n role=\"presentation\"\n tokens={{ '$tree-content-height': `${totalSize}px` }}\n >\n {rowVirtualizer.getVirtualItems().map((virtualItem) => {\n const node = visibleNodes[virtualItem.index];\n if (!node) return null;\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 size={size}\n itemProps={itemProps}\n rowStyles={rowStyles}\n virtualOffset={virtualItem.start}\n virtualRef={rowVirtualizer.measureElement}\n virtualIndex={virtualItem.index}\n menu={treeMenu}\n contextMenu={treeContextMenu}\n menuTriggerProps={menuTriggerProps}\n menuProps={menuProps}\n onToggleChecked={checkbox.toggle}\n onAction={treeOnAction}\n />\n );\n })}\n </TreeSizer>\n </TreeScrollContainer>\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
+ {"version":3,"file":"Tree.js","names":["useVirtualizer","OUTER_STYLES","forwardRef","useLayoutEffect","useMemo","useRef","useTree","Item","useTreeState","useEvent","useI18n","SIZE_NAME_TO_KEY","SIZES","mergeRefs","extractStyles","TreeElement","TreeScrollContainer","TreeSizer","buildTreeIndex","getTreeNodeText","TreeNode","useCheckboxTree","useLoadData","Key","Node","Selection","ForwardedRef","ReactElement","ReactNode","CubeTreeNodeData","CubeTreeProps","TreeOnExpandInfo","TreeOnSelectInfo","TreeSelectionMode","renderItem","node","key","children","title","collectDisabledKeys","treeData","treeIsDisabled","keys","visit","nodes","isDisabled","push","expandWithParents","parentOf","Map","length","set","Set","parent","get","add","Array","from","findToggledKey","previous","next","added","k","has","resolveSelectionMode","selectionMode","isSelectable","TreeBase","props","ref","HTMLDivElement","isCheckable","selectionModeProp","size","shape","containerPadding","defaultExpandedKeys","expandedKeys","autoExpandParent","defaultCheckedKeys","checkedKeys","defaultSelectedKeys","selectedKeys","height","loadData","onExpand","onCheck","onSelect","itemProps","rowStyles","ariaLabel","qa","menu","treeMenu","contextMenu","treeContextMenu","onAction","treeOnAction","menuTriggerProps","menuProps","id","_activeKey","activeKey","_onRowAction","onRowAction","otherProps","baseStyles","treeRef","scrollRef","treeIndex","nodesByKey","byKey","disabledKeys","effectiveExpandedKeys","effectiveDefaultExpandedKeys","checkbox","index","loadDataController","initialExpandedKeys","previousExpandedRef","handleExpandedChange","nextSet","onExpandedChanged","undefined","current","toggled","String","info","expanded","previousSelectionRef","handleSelectionChange","selection","arr","state","collection","getKeys","getItem","type","selectedNodes","map","filter","n","selected","hasOnSelect","t","treeLabel","ariaProps","onSelectionChange","onExpandedChange","disabledBehavior","const","items","baseState","getChildren","patched","Object","create","Iterable","childNodes","gridProps","visibleNodes","out","visibleNodesRef","rowVirtualizer","count","getScrollElement","getItemKey","estimateSize","gap","overscan","paddingStart","paddingEnd","treeTokens","totalSize","getTotalSize","lastFocusedScrollRef","lastSelectedScrollRef","focusedKey","selectionManager","findIndex","scrollToIndex","align","lastActiveScrollRef","target","mods","mergedScrollRef","tabIndex","getVirtualItems","virtualItem","keyStr","data","checkedSet","halfCheckedSet","loadingKeys","start","measureElement","toggle","_Tree","displayName","Tree"],"sources":["../../../../src/components/content/Tree/Tree.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { OUTER_STYLES } from '@tenphi/tasty';\nimport { forwardRef, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useTree } from 'react-aria';\nimport { Item, useTreeState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useI18n } from '../../../i18n';\nimport { SIZE_NAME_TO_KEY, SIZES } from '../../../tokens/sizes';\nimport { mergeRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\n\nimport { TreeElement, TreeScrollContainer, TreeSizer } from './styled';\nimport { buildTreeIndex, getTreeNodeText } 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 { ForwardedRef, ReactElement, ReactNode } 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 return (\n <Item\n key={node.key}\n textValue={getTreeNodeText(node)}\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 size = 'medium',\n shape = 'default',\n containerPadding = 4,\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 itemProps,\n rowStyles,\n ariaLabel,\n qa,\n menu: treeMenu,\n contextMenu: treeContextMenu,\n onAction: treeOnAction,\n menuTriggerProps,\n menuProps,\n id,\n _activeKey: activeKey,\n _onRowAction: onRowAction,\n ...otherProps\n } = props;\n\n const baseStyles = extractStyles(otherProps, OUTER_STYLES);\n\n const treeRef = useRef<HTMLDivElement>(null);\n const scrollRef = 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 const { t } = useI18n();\n const treeLabel = ariaLabel ?? t('tree.ariaLabel', 'Tree');\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': treeLabel,\n // Row ids derive from it (`<id>-<key>`), which is what lets a control\n // outside the tree point at a row with `aria-activedescendant`.\n id,\n onAction: onRowAction\n ? (key: Key) => onRowAction(String(key))\n : undefined,\n }),\n [\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n hasOnSelect,\n handleSelectionChange,\n effectiveExpandedKeys,\n effectiveDefaultExpandedKeys,\n handleExpandedChange,\n disabledKeys,\n treeData,\n treeLabel,\n id,\n onRowAction,\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 visibleNodesRef = useRef(visibleNodes);\n visibleNodesRef.current = visibleNodes;\n\n // ----- Virtualization -----\n const rowVirtualizer = useVirtualizer({\n count: visibleNodes.length,\n getScrollElement: () => scrollRef.current,\n getItemKey: (index: number) => {\n const node = visibleNodesRef.current[index];\n return node?.key ?? index;\n },\n estimateSize: () => SIZES[SIZE_NAME_TO_KEY[size]],\n gap: 1,\n overscan: 10,\n paddingStart: containerPadding,\n paddingEnd: containerPadding,\n });\n\n const treeTokens = useMemo(\n () => ({\n '$tree-height': height == null ? undefined : `${height}px`,\n '$tree-padding': `${containerPadding}px`,\n }),\n [height, containerPadding],\n );\n\n const totalSize = rowVirtualizer.getTotalSize();\n\n /**\n * Each scroll effect tracks its own \"last scrolled\" target instead\n * of sharing one ref. A shared ref creates a feedback loop: keyboard\n * nav updates the focused-key ref to the new row, and any subsequent\n * `visibleNodes` change OR `selectedKeys` array-identity change\n * (very common — `selectedKeys={[value]}` allocates a fresh array\n * every parent render) re-runs the selectedKeys effect, which sees\n * the ref no longer matches `selectedKeys[0]` and yanks the viewport\n * back to the selected row. Two refs let each effect dedupe against\n * its own intent only; the cost is at most one duplicate\n * `scrollToIndex` call when click updates focus and selection in the\n * same render (idempotent — both target the same index).\n */\n const lastFocusedScrollRef = useRef<Key | null>(null);\n const lastSelectedScrollRef = useRef<string | null>(null);\n\n /**\n * Keep the focused row visible during keyboard navigation.\n *\n * Uses `rowVirtualizer.scrollToIndex` (instead of\n * `querySelector + scrollIntoView`) so the scroll lands even when the\n * target row is outside the virtualizer's currently rendered window.\n * `align: 'auto'` only scrolls when needed, matching the prior\n * `scrollIntoView({ block: 'nearest' })` behavior.\n */\n useLayoutEffect(() => {\n const focusedKey = state.selectionManager.focusedKey;\n if (focusedKey == null) return;\n if (lastFocusedScrollRef.current === focusedKey) return;\n\n const index = visibleNodesRef.current.findIndex(\n (n) => n.key === focusedKey,\n );\n if (index < 0) return;\n\n rowVirtualizer.scrollToIndex(index, { align: 'auto' });\n lastFocusedScrollRef.current = focusedKey;\n }, [state.selectionManager.focusedKey, rowVirtualizer]);\n\n /**\n * Same for the row an outside control points at (`_activeKey`): that\n * control keeps DOM focus, so `focusedKey` never moves.\n */\n const lastActiveScrollRef = useRef<string | null>(null);\n\n useLayoutEffect(() => {\n if (activeKey == null) {\n lastActiveScrollRef.current = null;\n return;\n }\n if (lastActiveScrollRef.current === activeKey) return;\n\n const index = visibleNodes.findIndex((n) => String(n.key) === activeKey);\n if (index < 0) return;\n\n rowVirtualizer.scrollToIndex(index, { align: 'auto' });\n lastActiveScrollRef.current = activeKey;\n }, [activeKey, visibleNodes, rowVirtualizer]);\n\n /**\n * Scroll into view when controlled `selectedKeys` changes externally.\n *\n * Selection-manager `focusedKey` only updates on explicit user\n * interaction (click / keyboard) — it does NOT track controlled\n * `selectedKeys` prop changes. So when a parent updates the prop\n * (e.g. opening a file from elsewhere), we need a separate effect\n * to bring the row into view.\n *\n * Re-runs on `visibleNodes` so we retry once parents are expanded\n * (the row is invisible to the virtualizer until then).\n */\n useLayoutEffect(() => {\n if (selectedKeys == null) return;\n const target = selectedKeys[0];\n if (target == null) return;\n if (lastSelectedScrollRef.current === target) return;\n\n const index = visibleNodes.findIndex((n) => String(n.key) === target);\n if (index < 0) return;\n\n rowVirtualizer.scrollToIndex(index, { align: 'auto' });\n lastSelectedScrollRef.current = target;\n }, [selectedKeys, visibleNodes, rowVirtualizer]);\n\n const mods = useMemo(\n () => ({\n 'has-height': height != null,\n shape,\n }),\n [height, shape],\n );\n\n // The forwarded ref points at the inner scroll container so\n // consumers can drive `scrollTop` directly. `treeRef` (used by\n // `useTree` for keyboard handling and as the role=\"treegrid\"\n // anchor) stays internal on `TreeElement`.\n const mergedScrollRef = useMemo(\n () => mergeRefs(ref, scrollRef),\n [ref, scrollRef],\n );\n\n return (\n <TreeElement\n {...gridProps}\n // Driven from outside (`_activeKey`), the tree is no tab stop: the\n // control that points at its rows keeps focus.\n tabIndex={activeKey === undefined ? gridProps.tabIndex : -1}\n ref={treeRef}\n qa={qa ?? 'Tree'}\n mods={mods}\n styles={baseStyles}\n tokens={treeTokens}\n >\n <TreeScrollContainer ref={mergedScrollRef}>\n <TreeSizer\n role=\"presentation\"\n tokens={{ '$tree-content-height': `${totalSize}px` }}\n >\n {rowVirtualizer.getVirtualItems().map((virtualItem) => {\n const node = visibleNodes[virtualItem.index];\n if (!node) return null;\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 isActive={\n activeKey === undefined ? undefined : activeKey === keyStr\n }\n size={size}\n itemProps={itemProps}\n rowStyles={rowStyles}\n virtualOffset={virtualItem.start}\n virtualRef={rowVirtualizer.measureElement}\n virtualIndex={virtualItem.index}\n menu={treeMenu}\n contextMenu={treeContextMenu}\n menuTriggerProps={menuTriggerProps}\n menuProps={menuProps}\n onToggleChecked={checkbox.toggle}\n onAction={treeOnAction}\n />\n );\n })}\n </TreeSizer>\n </TreeScrollContainer>\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.200.1 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.202.0 | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
3
  import { mergeRefs } from "../../../utils/react/useCombinedRefs.js";
4
4
  import { useEvent } from "../../../_internal/hooks/use-event.js";
@@ -10,6 +10,7 @@ import { MenuTrigger as _MenuTrigger } from "../../actions/Menu/MenuTrigger.js";
10
10
  import { Menu as __Menu } from "../../actions/Menu/Menu.js";
11
11
  import { useContextMenu } from "../../actions/use-context-menu.js";
12
12
  import { TreeNodeCheckboxWrapper, TreeNodeRow, TreeNodeToggle, TreeNodeTogglePlaceholder, TreeRowItem } from "./styled.js";
13
+ import { getTreeNodeText } from "./tree-index.js";
13
14
  import { MoreIcon } from "../../../icons/MoreIcon.js";
14
15
  import { allowOverlayKeysToPropagate } from "../../../utils/react/overlayKeyPropagation.js";
15
16
  import { Checkbox as __Checkbox } from "../../fields/Checkbox/Checkbox.js";
@@ -24,7 +25,7 @@ function isMenuEmpty(menu) {
24
25
  }
25
26
  function TreeNodeInner(props) {
26
27
  const { t } = useI18n();
27
- const { node, data, state, isCheckable, isExpanded, isIndeterminate, isChecked, isLoading, onToggleChecked, size, itemProps, rowStyles, virtualOffset, virtualRef, virtualIndex, menu: treeMenu, contextMenu: treeContextMenu, onAction: treeOnAction, menuTriggerProps, menuProps } = props;
28
+ const { node, data, state, isCheckable, isExpanded, isIndeterminate, isChecked, isLoading, isActive, onToggleChecked, size, itemProps, rowStyles, virtualOffset, virtualRef, virtualIndex, menu: treeMenu, contextMenu: treeContextMenu, onAction: treeOnAction, menuTriggerProps, menuProps } = props;
28
29
  const rowRef = useRef(null);
29
30
  const isLeaf = data.isLeaf === true || data.isLeaf !== false && !node.hasChildNodes;
30
31
  const { rowProps, gridCellProps, expandButtonProps, isPressed } = useTreeItem({
@@ -34,7 +35,7 @@ function TreeNodeInner(props) {
34
35
  const isDisabled = state.disabledKeys.has(node.key);
35
36
  const isSelected = state.selectionManager.isSelected(node.key);
36
37
  const { hoverProps, isHovered } = useHover({ isDisabled });
37
- const isFocused = state.selectionManager.isFocused && state.selectionManager.focusedKey === node.key;
38
+ const isFocused = isActive ?? (state.selectionManager.isFocused && state.selectionManager.focusedKey === node.key);
38
39
  const isRowCheckable = isCheckable && data.isCheckable !== false;
39
40
  const nodeState = {
40
41
  isExpanded,
@@ -125,11 +126,10 @@ function TreeNodeInner(props) {
125
126
  "$tree-level": node.level ?? 0,
126
127
  "$tree-row-offset": virtualOffset == null ? void 0 : `${virtualOffset}px`
127
128
  }), [node.level, virtualOffset]);
128
- const ariaChecked = isRowCheckable ? isIndeterminate ? "mixed" : isChecked ? "true" : "false" : void 0;
129
129
  const finalRowProps = {
130
130
  ...mergeProps$1(rowProps, hoverProps),
131
- "aria-checked": ariaChecked,
132
- onKeyDown: composedKeyDown
131
+ onKeyDown: composedKeyDown,
132
+ ...isActive === void 0 ? null : { tabIndex: -1 }
133
133
  };
134
134
  const toggleNode = isLeaf ? /* @__PURE__ */ jsx(TreeNodeTogglePlaceholder, {
135
135
  "aria-hidden": true,
@@ -150,7 +150,8 @@ function TreeNodeInner(props) {
150
150
  isSelected: isChecked,
151
151
  isIndeterminate,
152
152
  isDisabled: isDisabled || data.isCheckboxDisabled,
153
- "aria-label": typeof data.title === "string" ? data.title : String(node.key),
153
+ "aria-label": getTreeNodeText(data),
154
+ excludeFromTabOrder: isActive !== void 0,
154
155
  onChange: handleCheckboxChange
155
156
  })
156
157
  }) : null;
@@ -1 +1 @@
1
- {"version":3,"file":"TreeNode.js","names":["Children","memo","useMemo","useRef","useState","useHover","useTreeItem","useEvent","useI18n","DirectionIcon","LoadingIcon","MoreIcon","mergeProps","mergeRefs","allowOverlayKeysToPropagate","CubeItemActionProps","ItemAction","CubeMenuProps","Menu","MenuTrigger","useContextMenu","Checkbox","TreeNodeCheckboxWrapper","TreeNodeRow","TreeNodeToggle","TreeNodeTogglePlaceholder","TreeRowItem","Key","Node","Styles","KeyboardEvent","MouseEvent","ReactNode","Ref","TreeState","CubeTreeNodeData","TreeContextMenu","TreeItemProps","TreeNodeState","isMenuEmpty","menu","undefined","toArray","length","TreeNodeProps","node","data","state","isCheckable","isExpanded","isIndeterminate","isChecked","isLoading","onToggleChecked","key","size","itemProps","rowStyles","virtualOffset","virtualRef","element","HTMLElement","virtualIndex","contextMenu","onAction","action","menuTriggerProps","Partial","menuProps","TreeNodeInner","props","t","treeMenu","treeContextMenu","treeOnAction","rowRef","HTMLDivElement","isLeaf","hasChildNodes","rowProps","gridCellProps","expandButtonProps","isPressed","hasChildItems","isDisabled","disabledKeys","has","isSelected","selectionManager","hoverProps","isHovered","isFocused","focusedKey","isRowCheckable","nodeState","effectiveMenuChildren","hasMenu","effectiveContextMenu","menuExposed","contextMenuOnly","isMenuOpen","setIsMenuOpen","handleMenuAction","actionStr","String","normalizedAction","startsWith","slice","rowContextMenu","placement","children","handleCheckboxChange","handleWrapperClick","e","stopPropagation","isCheckboxDisabled","target","closest","handleKeyDown","preventDefault","shiftKey","open","composedKeyDown","onKeyDown","sharedMods","checked","indeterminate","expanded","loading","leaf","rowMods","disabled","itemMods","focused","hovered","pressed","rowTokens","level","ariaChecked","finalRowProps","toggleNode","checkboxNode","title","resolvedItemProps","prefix","userPrefix","actions","userActions","restUserProps","composedPrefix","menuAction","composedActions","refs","list","push","targetRef","rendered","TreeNode","Menu","mergeProps","Checkbox","MenuTrigger"],"sources":["../../../../src/components/content/Tree/TreeNode.tsx"],"sourcesContent":["import { Children, memo, useMemo, useRef, useState } from 'react';\nimport { useHover, useTreeItem } from 'react-aria';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useI18n } from '../../../i18n';\nimport { DirectionIcon } from '../../../icons/DirectionIcon';\nimport { LoadingIcon } from '../../../icons/LoadingIcon';\nimport { MoreIcon } from '../../../icons/MoreIcon';\nimport { mergeProps, mergeRefs } from '../../../utils/react';\nimport { allowOverlayKeysToPropagate } from '../../../utils/react/overlayKeyPropagation';\nimport { CubeItemActionProps, ItemAction } from '../../actions/ItemAction';\nimport { CubeMenuProps, Menu, MenuTrigger } from '../../actions/Menu';\nimport { useContextMenu } from '../../actions/use-context-menu';\nimport { Checkbox } from '../../fields/Checkbox/Checkbox';\n\nimport {\n TreeNodeCheckboxWrapper,\n TreeNodeRow,\n TreeNodeToggle,\n TreeNodeTogglePlaceholder,\n TreeRowItem,\n} from './styled';\n\nimport type { Key, Node } from '@react-types/shared';\nimport type { Styles } from '@tenphi/tasty';\nimport type { KeyboardEvent, MouseEvent, ReactNode, Ref } from 'react';\nimport type { TreeState } from 'react-stately';\nimport type {\n CubeTreeNodeData,\n TreeContextMenu,\n TreeItemProps,\n TreeNodeState,\n} from './types';\n\n/** Check whether a `menu` ReactNode actually contains anything. */\nfunction isMenuEmpty(menu: ReactNode): boolean {\n if (menu === null || menu === undefined || menu === false) return true;\n return Children.toArray(menu).length === 0;\n}\n\nexport interface TreeNodeProps {\n node: Node<CubeTreeNodeData>;\n /** The original `CubeTreeNodeData` for this row, looked up by key. */\n data: CubeTreeNodeData;\n state: TreeState<CubeTreeNodeData>;\n\n /** Whether the tree as a whole renders checkboxes. */\n isCheckable: boolean;\n /** Whether this row is currently expanded. */\n isExpanded: boolean;\n /** Whether the row is in an indeterminate (half-checked) state. */\n isIndeterminate: boolean;\n /** Whether the row is fully checked. */\n isChecked: boolean;\n /** Whether `loadData` is currently fetching this row's children. */\n isLoading: boolean;\n\n /** Toggle this row's checkbox (cascades). */\n onToggleChecked: (key: string) => void;\n\n /** Row size passed to the underlying Item. */\n size?: string;\n\n /** Per-node Item customization (static object or callback). */\n itemProps?:\n | TreeItemProps\n | ((data: CubeTreeNodeData, state: TreeNodeState) => TreeItemProps);\n\n /** Styles applied to the visible row (`TreeRowItem`). */\n rowStyles?: Styles;\n\n /** The row's offset from the list's top, in pixels, from the virtualizer. */\n virtualOffset?: number;\n /** Ref callback from `@tanstack/react-virtual` to measure row height. */\n virtualRef?: (element: HTMLElement | null) => void;\n /** Virtual index for `data-index` attribute. */\n virtualIndex?: number;\n\n /** Tree-wide menu default (resolved against `data.menu`). */\n menu?:\n | ReactNode\n | ((data: CubeTreeNodeData, state: TreeNodeState) => ReactNode | null);\n /** Tree-wide `contextMenu` default. */\n contextMenu?: TreeContextMenu;\n /** Tree-wide `onAction` callback. */\n onAction?: (action: string, key: Key) => void;\n /** Forwarded to every per-row `MenuTrigger`. */\n menuTriggerProps?: Partial<CubeItemActionProps>;\n /** Forwarded to every per-row `Menu`. */\n menuProps?: Partial<CubeMenuProps<object>>;\n}\n\nfunction TreeNodeInner(props: TreeNodeProps) {\n const { t } = useI18n();\n const {\n node,\n data,\n state,\n isCheckable,\n isExpanded,\n isIndeterminate,\n isChecked,\n isLoading,\n onToggleChecked,\n size,\n itemProps,\n rowStyles,\n virtualOffset,\n virtualRef,\n virtualIndex,\n menu: treeMenu,\n contextMenu: treeContextMenu,\n onAction: treeOnAction,\n menuTriggerProps,\n menuProps,\n } = props;\n\n const rowRef = useRef<HTMLDivElement>(null);\n\n // For lazy rows with no children yet, still render a toggle unless\n // explicitly marked as leaf.\n const isLeaf =\n data.isLeaf === true || (data.isLeaf !== false && !node.hasChildNodes);\n\n // React Aria counts a row as a parent only with more than one child (it\n // expects the row's content first). `hasChildItems` makes single-child and\n // lazy rows expandable: `aria-expanded` and arrow-key expansion.\n const { rowProps, gridCellProps, expandButtonProps, isPressed } = useTreeItem(\n { node, hasChildItems: !isLeaf },\n state,\n rowRef,\n );\n\n const isDisabled = state.disabledKeys.has(node.key);\n const isSelected = state.selectionManager.isSelected(node.key);\n\n // `useTreeItem` doesn't track hover; we need it for the `hovered` mod.\n const { hoverProps, isHovered } = useHover({ isDisabled });\n // React Aria's treegrid uses roving tabindex, so no `data-focused`\n // attribute lands on the row — mirror it as a mod manually.\n const isFocused =\n state.selectionManager.isFocused &&\n state.selectionManager.focusedKey === node.key;\n const isRowCheckable = isCheckable && data.isCheckable !== false;\n\n const nodeState: TreeNodeState = {\n isExpanded,\n isSelected,\n isChecked,\n isIndeterminate,\n isLeaf,\n };\n\n // ---- Menu resolution (per-node override > tree-level) --------------------\n\n const effectiveMenuChildren: ReactNode =\n data.menu === null\n ? null\n : data.menu !== undefined\n ? data.menu\n : typeof treeMenu === 'function'\n ? treeMenu(data, nodeState)\n : (treeMenu ?? null);\n const hasMenu = !isMenuEmpty(effectiveMenuChildren);\n\n const effectiveContextMenu: TreeContextMenu =\n data.contextMenu ?? treeContextMenu ?? false;\n // The menu is exposed only when the consumer opts in via\n // `contextMenu`. When `contextMenu` is `false` (default) we render\n // nothing, even if `menu` is provided — this matches the plan and\n // keeps default rows visually clean.\n const menuExposed =\n hasMenu &&\n (effectiveContextMenu === true || effectiveContextMenu === 'context-only');\n const contextMenuOnly = effectiveContextMenu === 'context-only';\n\n // Controlled state for menu trigger (enables keyboard opening with Shift+F10)\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n const handleMenuAction = useEvent((action: Key) => {\n // Strip the \".$\" prefix that React adds via Children.toArray/map.\n const actionStr = String(action);\n const normalizedAction = actionStr.startsWith('.$')\n ? actionStr.slice(2)\n : actionStr;\n data.onAction?.(normalizedAction);\n treeOnAction?.(normalizedAction, node.key);\n // Forward to the consumer-supplied `menuProps.onAction` so users\n // who pass extra `Menu` props through `menuProps` still receive\n // the action stream alongside the tree-level callback.\n menuProps?.onAction?.(normalizedAction);\n });\n\n const rowContextMenu = useContextMenu<HTMLDivElement, CubeMenuProps<object>>(\n Menu,\n { placement: 'bottom start' },\n {\n ...menuProps,\n onAction: handleMenuAction,\n children: effectiveMenuChildren,\n },\n );\n\n // ---- Checkbox ------------------------------------------------------------\n\n const handleCheckboxChange = useEvent(() => {\n onToggleChecked(String(node.key));\n });\n\n const handleWrapperClick = useEvent((e: MouseEvent<HTMLElement>) => {\n e.stopPropagation();\n if (isDisabled || data.isCheckboxDisabled) return;\n // The inner <Checkbox> label toggles on direct click; skip to avoid a double toggle.\n if ((e.target as HTMLElement).closest('[data-qa=\"CheckboxWrapper\"]'))\n return;\n onToggleChecked(String(node.key));\n });\n\n // ---- Keyboard ------------------------------------------------------------\n\n // Composed keydown handler. Runs BEFORE `rowProps.onKeyDown` from\n // `useTreeItem` so we can short-circuit the default react-aria\n // behavior for our own shortcuts (Shift+F10 menu open, Space\n // checkbox toggle). Returns `true` when the event was handled and\n // react-aria's keydown must NOT run; returns `false` to chain to\n // react-aria's handler.\n const handleKeyDown = useEvent((e: KeyboardEvent) => {\n // Space toggles the checkbox first when checkable. We DON'T claim\n // the event (return `false`) so react-aria's onKeyDown still runs\n // afterwards and the focused row also selects — matching the\n // pre-refactor behavior when handlers were chained via\n // `mergeProps`. `preventDefault` is kept to suppress page scroll.\n if (\n e.key === ' ' &&\n isRowCheckable &&\n !isDisabled &&\n !data.isCheckboxDisabled\n ) {\n e.preventDefault();\n onToggleChecked(String(node.key));\n return false;\n }\n\n // Shift+F10 opens the row menu (standard accessibility shortcut).\n if (e.key === 'F10' && e.shiftKey && menuExposed) {\n e.preventDefault();\n e.stopPropagation();\n if (contextMenuOnly) {\n rowContextMenu.open();\n } else {\n setIsMenuOpen(true);\n }\n return true;\n }\n\n return false;\n });\n\n // Wrapper that delegates to react-aria's default keydown only when\n // our handler did not claim the event. Replaces (rather than\n // chains with) `rowProps.onKeyDown` so the order of handlers is\n // strictly: our shortcuts → react-aria default.\n const composedKeyDown = useEvent((e: KeyboardEvent<HTMLDivElement>) => {\n if (handleKeyDown(e)) return;\n rowProps.onKeyDown?.(e);\n });\n\n // ---- Mods ----------------------------------------------------------------\n\n const sharedMods = useMemo(\n () => ({\n checked: isChecked,\n indeterminate: isIndeterminate,\n expanded: isExpanded,\n loading: isLoading,\n leaf: isLeaf,\n 'has-checkbox': isRowCheckable,\n 'has-menu': menuExposed,\n }),\n [\n isChecked,\n isIndeterminate,\n isExpanded,\n isLoading,\n isLeaf,\n isRowCheckable,\n menuExposed,\n ],\n );\n\n const rowMods = useMemo(\n () => ({ ...sharedMods, disabled: isDisabled }),\n [sharedMods, isDisabled],\n );\n\n const itemMods = useMemo(\n () => ({\n ...sharedMods,\n focused: isFocused,\n hovered: isHovered,\n pressed: isPressed,\n }),\n [sharedMods, isFocused, isHovered, isPressed],\n );\n\n const rowTokens = useMemo(\n () => ({\n '$tree-level': node.level ?? 0,\n '$tree-row-offset':\n virtualOffset == null ? undefined : `${virtualOffset}px`,\n }),\n [node.level, virtualOffset],\n );\n\n // Only emit `aria-checked` when the tree is in checkable mode.\n const ariaChecked: 'mixed' | 'true' | 'false' | undefined = isRowCheckable\n ? isIndeterminate\n ? 'mixed'\n : isChecked\n ? 'true'\n : 'false'\n : undefined;\n\n // ---- Compose row props ---------------------------------------------------\n\n // Merge react-aria + hover props but EXCLUDE `onKeyDown` from the\n // chain — `composedKeyDown` already wraps `rowProps.onKeyDown` and\n // must run first so our Shift+F10 / Space-checkbox shortcuts can\n // short-circuit the default react-aria behavior.\n const finalRowProps = {\n ...mergeProps(rowProps, hoverProps),\n 'aria-checked': ariaChecked,\n onKeyDown: composedKeyDown,\n };\n\n // ---- Toggle (chevron) and checkbox slots --------------------------------\n\n // Leaf rows get a placeholder so sibling indents align.\n const toggleNode = isLeaf ? (\n <TreeNodeTogglePlaceholder aria-hidden data-element=\"Toggle\" />\n ) : (\n <TreeNodeToggle {...expandButtonProps} tabIndex={-1} data-element=\"Toggle\">\n {isLoading ? (\n <LoadingIcon />\n ) : (\n <DirectionIcon to={isExpanded ? 'bottom' : 'right'} />\n )}\n </TreeNodeToggle>\n );\n\n const checkboxNode = isRowCheckable ? (\n <TreeNodeCheckboxWrapper\n data-element=\"Checkbox\"\n role=\"presentation\"\n onClick={handleWrapperClick}\n // Hold the checkbox's keys here, but let Escape and Tab reach the tree and\n // a surrounding overlay.\n onKeyDown={allowOverlayKeysToPropagate}\n >\n <Checkbox\n isBare\n isSelected={isChecked}\n isIndeterminate={isIndeterminate}\n isDisabled={isDisabled || data.isCheckboxDisabled}\n aria-label={\n typeof data.title === 'string' ? data.title : String(node.key)\n }\n onChange={handleCheckboxChange}\n />\n </TreeNodeCheckboxWrapper>\n ) : null;\n\n // ---- Resolve user-supplied per-node Item props --------------------------\n\n const resolvedItemProps =\n typeof itemProps === 'function' ? itemProps(data, nodeState) : itemProps;\n const {\n prefix: userPrefix,\n actions: userActions,\n ...restUserProps\n } = resolvedItemProps ?? {};\n\n const composedPrefix =\n checkboxNode || userPrefix ? (\n <>\n {checkboxNode}\n {userPrefix}\n </>\n ) : null;\n\n // ---- Built-in overflow `⋮` action ---------------------------------------\n\n const menuAction =\n menuExposed && !contextMenuOnly ? (\n <MenuTrigger isOpen={isMenuOpen} onOpenChange={setIsMenuOpen}>\n <ItemAction\n tabIndex={-1}\n icon={<MoreIcon />}\n aria-label={t('tree.actions', 'Actions')}\n {...menuTriggerProps}\n />\n <Menu {...menuProps} onAction={handleMenuAction}>\n {effectiveMenuChildren}\n </Menu>\n </MenuTrigger>\n ) : null;\n\n // Compose with user-supplied actions (user actions render first).\n const composedActions =\n userActions || menuAction ? (\n <>\n {userActions}\n {menuAction}\n </>\n ) : undefined;\n\n // ---- Refs / context-menu wiring -----------------------------------------\n\n // When the context menu is enabled for this row, attach the hook's\n // `targetRef` to the row so right-clicks land on the correct anchor.\n const refs = useMemo(() => {\n const list: Ref<HTMLDivElement>[] = [rowRef];\n if (virtualRef) list.push(virtualRef);\n if (menuExposed) list.push(rowContextMenu.targetRef);\n return mergeRefs(...list);\n }, [virtualRef, menuExposed, rowContextMenu.targetRef]);\n\n return (\n <TreeNodeRow\n {...finalRowProps}\n ref={refs}\n mods={rowMods}\n tokens={rowTokens}\n data-element=\"Row\"\n data-qa-key={String(node.key)}\n data-index={virtualIndex}\n >\n <TreeRowItem\n {...gridCellProps}\n {...restUserProps}\n size={size}\n isSelected={isSelected}\n isDisabled={isDisabled}\n mods={itemMods}\n icon={toggleNode}\n prefix={composedPrefix}\n actions={composedActions}\n styles={rowStyles}\n >\n {data.title}\n </TreeRowItem>\n {menuExposed && rowContextMenu.rendered}\n </TreeNodeRow>\n );\n}\n\nexport const TreeNode = memo(TreeNodeInner);\n"],"mappings":"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"}
1
+ {"version":3,"file":"TreeNode.js","names":["Children","memo","useMemo","useRef","useState","useHover","useTreeItem","useEvent","useI18n","DirectionIcon","LoadingIcon","MoreIcon","mergeProps","mergeRefs","allowOverlayKeysToPropagate","CubeItemActionProps","ItemAction","CubeMenuProps","Menu","MenuTrigger","useContextMenu","Checkbox","TreeNodeCheckboxWrapper","TreeNodeRow","TreeNodeToggle","TreeNodeTogglePlaceholder","TreeRowItem","getTreeNodeText","Key","Node","Styles","KeyboardEvent","MouseEvent","ReactNode","Ref","TreeState","CubeTreeNodeData","TreeContextMenu","TreeItemProps","TreeNodeState","isMenuEmpty","menu","undefined","toArray","length","TreeNodeProps","node","data","state","isCheckable","isExpanded","isIndeterminate","isChecked","isLoading","isActive","onToggleChecked","key","size","itemProps","rowStyles","virtualOffset","virtualRef","element","HTMLElement","virtualIndex","contextMenu","onAction","action","menuTriggerProps","Partial","menuProps","TreeNodeInner","props","t","treeMenu","treeContextMenu","treeOnAction","rowRef","HTMLDivElement","isLeaf","hasChildNodes","rowProps","gridCellProps","expandButtonProps","isPressed","hasChildItems","isDisabled","disabledKeys","has","isSelected","selectionManager","hoverProps","isHovered","isFocused","focusedKey","isRowCheckable","nodeState","effectiveMenuChildren","hasMenu","effectiveContextMenu","menuExposed","contextMenuOnly","isMenuOpen","setIsMenuOpen","handleMenuAction","actionStr","String","normalizedAction","startsWith","slice","rowContextMenu","placement","children","handleCheckboxChange","handleWrapperClick","e","stopPropagation","isCheckboxDisabled","target","closest","handleKeyDown","preventDefault","shiftKey","open","composedKeyDown","onKeyDown","sharedMods","checked","indeterminate","expanded","loading","leaf","rowMods","disabled","itemMods","focused","hovered","pressed","rowTokens","level","finalRowProps","tabIndex","toggleNode","checkboxNode","resolvedItemProps","prefix","userPrefix","actions","userActions","restUserProps","composedPrefix","menuAction","composedActions","refs","list","push","targetRef","title","rendered","TreeNode","Menu","mergeProps","Checkbox","MenuTrigger"],"sources":["../../../../src/components/content/Tree/TreeNode.tsx"],"sourcesContent":["import { Children, memo, useMemo, useRef, useState } from 'react';\nimport { useHover, useTreeItem } from 'react-aria';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useI18n } from '../../../i18n';\nimport { DirectionIcon } from '../../../icons/DirectionIcon';\nimport { LoadingIcon } from '../../../icons/LoadingIcon';\nimport { MoreIcon } from '../../../icons/MoreIcon';\nimport { mergeProps, mergeRefs } from '../../../utils/react';\nimport { allowOverlayKeysToPropagate } from '../../../utils/react/overlayKeyPropagation';\nimport { CubeItemActionProps, ItemAction } from '../../actions/ItemAction';\nimport { CubeMenuProps, Menu, MenuTrigger } from '../../actions/Menu';\nimport { useContextMenu } from '../../actions/use-context-menu';\nimport { Checkbox } from '../../fields/Checkbox/Checkbox';\n\nimport {\n TreeNodeCheckboxWrapper,\n TreeNodeRow,\n TreeNodeToggle,\n TreeNodeTogglePlaceholder,\n TreeRowItem,\n} from './styled';\nimport { getTreeNodeText } from './tree-index';\n\nimport type { Key, Node } from '@react-types/shared';\nimport type { Styles } from '@tenphi/tasty';\nimport type { KeyboardEvent, MouseEvent, ReactNode, Ref } from 'react';\nimport type { TreeState } from 'react-stately';\nimport type {\n CubeTreeNodeData,\n TreeContextMenu,\n TreeItemProps,\n TreeNodeState,\n} from './types';\n\n/** Check whether a `menu` ReactNode actually contains anything. */\nfunction isMenuEmpty(menu: ReactNode): boolean {\n if (menu === null || menu === undefined || menu === false) return true;\n return Children.toArray(menu).length === 0;\n}\n\nexport interface TreeNodeProps {\n node: Node<CubeTreeNodeData>;\n /** The original `CubeTreeNodeData` for this row, looked up by key. */\n data: CubeTreeNodeData;\n state: TreeState<CubeTreeNodeData>;\n\n /** Whether the tree as a whole renders checkboxes. */\n isCheckable: boolean;\n /** Whether this row is currently expanded. */\n isExpanded: boolean;\n /** Whether the row is in an indeterminate (half-checked) state. */\n isIndeterminate: boolean;\n /** Whether the row is fully checked. */\n isChecked: boolean;\n /** Whether `loadData` is currently fetching this row's children. */\n isLoading: boolean;\n /**\n * Whether an outside control points at this row (`_activeKey`). When set,\n * it replaces DOM focus as the source of the `focused` look.\n */\n isActive?: boolean;\n\n /** Toggle this row's checkbox (cascades). */\n onToggleChecked: (key: string) => void;\n\n /** Row size passed to the underlying Item. */\n size?: string;\n\n /** Per-node Item customization (static object or callback). */\n itemProps?:\n | TreeItemProps\n | ((data: CubeTreeNodeData, state: TreeNodeState) => TreeItemProps);\n\n /** Styles applied to the visible row (`TreeRowItem`). */\n rowStyles?: Styles;\n\n /** The row's offset from the list's top, in pixels, from the virtualizer. */\n virtualOffset?: number;\n /** Ref callback from `@tanstack/react-virtual` to measure row height. */\n virtualRef?: (element: HTMLElement | null) => void;\n /** Virtual index for `data-index` attribute. */\n virtualIndex?: number;\n\n /** Tree-wide menu default (resolved against `data.menu`). */\n menu?:\n | ReactNode\n | ((data: CubeTreeNodeData, state: TreeNodeState) => ReactNode | null);\n /** Tree-wide `contextMenu` default. */\n contextMenu?: TreeContextMenu;\n /** Tree-wide `onAction` callback. */\n onAction?: (action: string, key: Key) => void;\n /** Forwarded to every per-row `MenuTrigger`. */\n menuTriggerProps?: Partial<CubeItemActionProps>;\n /** Forwarded to every per-row `Menu`. */\n menuProps?: Partial<CubeMenuProps<object>>;\n}\n\nfunction TreeNodeInner(props: TreeNodeProps) {\n const { t } = useI18n();\n const {\n node,\n data,\n state,\n isCheckable,\n isExpanded,\n isIndeterminate,\n isChecked,\n isLoading,\n isActive,\n onToggleChecked,\n size,\n itemProps,\n rowStyles,\n virtualOffset,\n virtualRef,\n virtualIndex,\n menu: treeMenu,\n contextMenu: treeContextMenu,\n onAction: treeOnAction,\n menuTriggerProps,\n menuProps,\n } = props;\n\n const rowRef = useRef<HTMLDivElement>(null);\n\n // For lazy rows with no children yet, still render a toggle unless\n // explicitly marked as leaf.\n const isLeaf =\n data.isLeaf === true || (data.isLeaf !== false && !node.hasChildNodes);\n\n // React Aria counts a row as a parent only with more than one child (it\n // expects the row's content first). `hasChildItems` makes single-child and\n // lazy rows expandable: `aria-expanded` and arrow-key expansion.\n const { rowProps, gridCellProps, expandButtonProps, isPressed } = useTreeItem(\n { node, hasChildItems: !isLeaf },\n state,\n rowRef,\n );\n\n const isDisabled = state.disabledKeys.has(node.key);\n const isSelected = state.selectionManager.isSelected(node.key);\n\n // `useTreeItem` doesn't track hover; we need it for the `hovered` mod.\n const { hoverProps, isHovered } = useHover({ isDisabled });\n // React Aria's treegrid uses roving tabindex, so no `data-focused`\n // attribute lands on the row — mirror it as a mod manually.\n const isFocused =\n isActive ??\n (state.selectionManager.isFocused &&\n state.selectionManager.focusedKey === node.key);\n const isRowCheckable = isCheckable && data.isCheckable !== false;\n\n const nodeState: TreeNodeState = {\n isExpanded,\n isSelected,\n isChecked,\n isIndeterminate,\n isLeaf,\n };\n\n // ---- Menu resolution (per-node override > tree-level) --------------------\n\n const effectiveMenuChildren: ReactNode =\n data.menu === null\n ? null\n : data.menu !== undefined\n ? data.menu\n : typeof treeMenu === 'function'\n ? treeMenu(data, nodeState)\n : (treeMenu ?? null);\n const hasMenu = !isMenuEmpty(effectiveMenuChildren);\n\n const effectiveContextMenu: TreeContextMenu =\n data.contextMenu ?? treeContextMenu ?? false;\n // The menu is exposed only when the consumer opts in via\n // `contextMenu`. When `contextMenu` is `false` (default) we render\n // nothing, even if `menu` is provided — this matches the plan and\n // keeps default rows visually clean.\n const menuExposed =\n hasMenu &&\n (effectiveContextMenu === true || effectiveContextMenu === 'context-only');\n const contextMenuOnly = effectiveContextMenu === 'context-only';\n\n // Controlled state for menu trigger (enables keyboard opening with Shift+F10)\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n const handleMenuAction = useEvent((action: Key) => {\n // Strip the \".$\" prefix that React adds via Children.toArray/map.\n const actionStr = String(action);\n const normalizedAction = actionStr.startsWith('.$')\n ? actionStr.slice(2)\n : actionStr;\n data.onAction?.(normalizedAction);\n treeOnAction?.(normalizedAction, node.key);\n // Forward to the consumer-supplied `menuProps.onAction` so users\n // who pass extra `Menu` props through `menuProps` still receive\n // the action stream alongside the tree-level callback.\n menuProps?.onAction?.(normalizedAction);\n });\n\n const rowContextMenu = useContextMenu<HTMLDivElement, CubeMenuProps<object>>(\n Menu,\n { placement: 'bottom start' },\n {\n ...menuProps,\n onAction: handleMenuAction,\n children: effectiveMenuChildren,\n },\n );\n\n // ---- Checkbox ------------------------------------------------------------\n\n const handleCheckboxChange = useEvent(() => {\n onToggleChecked(String(node.key));\n });\n\n const handleWrapperClick = useEvent((e: MouseEvent<HTMLElement>) => {\n e.stopPropagation();\n if (isDisabled || data.isCheckboxDisabled) return;\n // The inner <Checkbox> label toggles on direct click; skip to avoid a double toggle.\n if ((e.target as HTMLElement).closest('[data-qa=\"CheckboxWrapper\"]'))\n return;\n onToggleChecked(String(node.key));\n });\n\n // ---- Keyboard ------------------------------------------------------------\n\n // Composed keydown handler. Runs BEFORE `rowProps.onKeyDown` from\n // `useTreeItem` so we can short-circuit the default react-aria\n // behavior for our own shortcuts (Shift+F10 menu open, Space\n // checkbox toggle). Returns `true` when the event was handled and\n // react-aria's keydown must NOT run; returns `false` to chain to\n // react-aria's handler.\n const handleKeyDown = useEvent((e: KeyboardEvent) => {\n // Space toggles the checkbox first when checkable. We DON'T claim\n // the event (return `false`) so react-aria's onKeyDown still runs\n // afterwards and the focused row also selects — matching the\n // pre-refactor behavior when handlers were chained via\n // `mergeProps`. `preventDefault` is kept to suppress page scroll.\n if (\n e.key === ' ' &&\n isRowCheckable &&\n !isDisabled &&\n !data.isCheckboxDisabled\n ) {\n e.preventDefault();\n onToggleChecked(String(node.key));\n return false;\n }\n\n // Shift+F10 opens the row menu (standard accessibility shortcut).\n if (e.key === 'F10' && e.shiftKey && menuExposed) {\n e.preventDefault();\n e.stopPropagation();\n if (contextMenuOnly) {\n rowContextMenu.open();\n } else {\n setIsMenuOpen(true);\n }\n return true;\n }\n\n return false;\n });\n\n // Wrapper that delegates to react-aria's default keydown only when\n // our handler did not claim the event. Replaces (rather than\n // chains with) `rowProps.onKeyDown` so the order of handlers is\n // strictly: our shortcuts → react-aria default.\n const composedKeyDown = useEvent((e: KeyboardEvent<HTMLDivElement>) => {\n if (handleKeyDown(e)) return;\n rowProps.onKeyDown?.(e);\n });\n\n // ---- Mods ----------------------------------------------------------------\n\n const sharedMods = useMemo(\n () => ({\n checked: isChecked,\n indeterminate: isIndeterminate,\n expanded: isExpanded,\n loading: isLoading,\n leaf: isLeaf,\n 'has-checkbox': isRowCheckable,\n 'has-menu': menuExposed,\n }),\n [\n isChecked,\n isIndeterminate,\n isExpanded,\n isLoading,\n isLeaf,\n isRowCheckable,\n menuExposed,\n ],\n );\n\n const rowMods = useMemo(\n () => ({ ...sharedMods, disabled: isDisabled }),\n [sharedMods, isDisabled],\n );\n\n const itemMods = useMemo(\n () => ({\n ...sharedMods,\n focused: isFocused,\n hovered: isHovered,\n pressed: isPressed,\n }),\n [sharedMods, isFocused, isHovered, isPressed],\n );\n\n const rowTokens = useMemo(\n () => ({\n '$tree-level': node.level ?? 0,\n '$tree-row-offset':\n virtualOffset == null ? undefined : `${virtualOffset}px`,\n }),\n [node.level, virtualOffset],\n );\n\n // ---- Compose row props ---------------------------------------------------\n\n // Merge react-aria + hover props but EXCLUDE `onKeyDown` from the\n // chain — `composedKeyDown` already wraps `rowProps.onKeyDown` and\n // must run first so our Shift+F10 / Space-checkbox shortcuts can\n // short-circuit the default react-aria behavior.\n const finalRowProps = {\n // No `aria-checked` here: a `row` doesn't take it (axe aria-allowed-attr).\n // The row's checkbox carries checked and mixed; the row has `checked` and\n // `indeterminate` mods.\n ...mergeProps(rowProps, hoverProps),\n onKeyDown: composedKeyDown,\n // Under an outside control (`isActive` set) no row is a tab stop, not\n // even one a click focused.\n ...(isActive === undefined ? null : { tabIndex: -1 }),\n };\n\n // ---- Toggle (chevron) and checkbox slots --------------------------------\n\n // Leaf rows get a placeholder so sibling indents align.\n const toggleNode = isLeaf ? (\n <TreeNodeTogglePlaceholder aria-hidden data-element=\"Toggle\" />\n ) : (\n <TreeNodeToggle {...expandButtonProps} tabIndex={-1} data-element=\"Toggle\">\n {isLoading ? (\n <LoadingIcon />\n ) : (\n <DirectionIcon to={isExpanded ? 'bottom' : 'right'} />\n )}\n </TreeNodeToggle>\n );\n\n const checkboxNode = isRowCheckable ? (\n <TreeNodeCheckboxWrapper\n data-element=\"Checkbox\"\n role=\"presentation\"\n onClick={handleWrapperClick}\n // Hold the checkbox's keys here, but let Escape and Tab reach the tree and\n // a surrounding overlay.\n onKeyDown={allowOverlayKeysToPropagate}\n >\n <Checkbox\n isBare\n isSelected={isChecked}\n isIndeterminate={isIndeterminate}\n isDisabled={isDisabled || data.isCheckboxDisabled}\n aria-label={getTreeNodeText(data)}\n // Under an outside control the tree has no tab stops at all, so Tab\n // moves on from that control instead of into a row.\n excludeFromTabOrder={isActive !== undefined}\n onChange={handleCheckboxChange}\n />\n </TreeNodeCheckboxWrapper>\n ) : null;\n\n // ---- Resolve user-supplied per-node Item props --------------------------\n\n const resolvedItemProps =\n typeof itemProps === 'function' ? itemProps(data, nodeState) : itemProps;\n const {\n prefix: userPrefix,\n actions: userActions,\n ...restUserProps\n } = resolvedItemProps ?? {};\n\n const composedPrefix =\n checkboxNode || userPrefix ? (\n <>\n {checkboxNode}\n {userPrefix}\n </>\n ) : null;\n\n // ---- Built-in overflow `⋮` action ---------------------------------------\n\n const menuAction =\n menuExposed && !contextMenuOnly ? (\n <MenuTrigger isOpen={isMenuOpen} onOpenChange={setIsMenuOpen}>\n <ItemAction\n tabIndex={-1}\n icon={<MoreIcon />}\n aria-label={t('tree.actions', 'Actions')}\n {...menuTriggerProps}\n />\n <Menu {...menuProps} onAction={handleMenuAction}>\n {effectiveMenuChildren}\n </Menu>\n </MenuTrigger>\n ) : null;\n\n // Compose with user-supplied actions (user actions render first).\n const composedActions =\n userActions || menuAction ? (\n <>\n {userActions}\n {menuAction}\n </>\n ) : undefined;\n\n // ---- Refs / context-menu wiring -----------------------------------------\n\n // When the context menu is enabled for this row, attach the hook's\n // `targetRef` to the row so right-clicks land on the correct anchor.\n const refs = useMemo(() => {\n const list: Ref<HTMLDivElement>[] = [rowRef];\n if (virtualRef) list.push(virtualRef);\n if (menuExposed) list.push(rowContextMenu.targetRef);\n return mergeRefs(...list);\n }, [virtualRef, menuExposed, rowContextMenu.targetRef]);\n\n return (\n <TreeNodeRow\n {...finalRowProps}\n ref={refs}\n mods={rowMods}\n tokens={rowTokens}\n data-element=\"Row\"\n data-qa-key={String(node.key)}\n data-index={virtualIndex}\n >\n <TreeRowItem\n {...gridCellProps}\n {...restUserProps}\n size={size}\n isSelected={isSelected}\n isDisabled={isDisabled}\n mods={itemMods}\n icon={toggleNode}\n prefix={composedPrefix}\n actions={composedActions}\n styles={rowStyles}\n >\n {data.title}\n </TreeRowItem>\n {menuExposed && rowContextMenu.rendered}\n </TreeNodeRow>\n );\n}\n\nexport const TreeNode = memo(TreeNodeInner);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoCA,SAASwC,YAAYC,MAA0B;CAC7C,IAAIA,SAAS,QAAQA,SAASC,KAAAA,KAAaD,SAAS,OAAO,OAAO;CAClE,OAAOzC,SAAS2C,QAAQF,IAAI,CAAC,CAACG,WAAW;AAC3C;AA2DA,SAAS2B,cAAcC,OAAsB;CAC3C,MAAM,EAAEC,MAAMjE,QAAQ;CACtB,MAAM,EACJsC,MACAC,MACAC,OACAC,aACAC,YACAC,iBACAC,WACAC,WACAC,UACAC,iBACAE,MACAC,WACAC,WACAC,eACAC,YACAG,cACAvB,MAAMiC,UACNT,aAAaU,iBACbT,UAAUU,cACVR,kBACAE,cACEE;CAEJ,MAAMK,SAAS1E,OAAuB,IAAI;CAI1C,MAAM4E,SACJhC,KAAKgC,WAAW,QAAShC,KAAKgC,WAAW,SAAS,CAACjC,KAAKkC;CAK1D,MAAM,EAAEC,UAAUC,eAAeC,mBAAmBC,cAAc9E,YAChE;EAAEwC;EAAMuC,eAAe,CAACN;CAAO,GAC/B/B,OACA6B,MACF;CAEA,MAAMS,aAAatC,MAAMuC,aAAaC,IAAI1C,KAAKU,GAAG;CAClD,MAAMiC,aAAazC,MAAM0C,iBAAiBD,WAAW3C,KAAKU,GAAG;CAG7D,MAAM,EAAEmC,YAAYC,cAAcvF,SAAS,EAAEiF,WAAW,CAAC;CAGzD,MAAMO,YACJvC,aACCN,MAAM0C,iBAAiBG,aACtB7C,MAAM0C,iBAAiBI,eAAehD,KAAKU;CAC/C,MAAMuC,iBAAiB9C,eAAeF,KAAKE,gBAAgB;CAE3D,MAAM+C,YAA2B;EAC/B9C;EACAuC;EACArC;EACAD;EACA4B;CACF;CAIA,MAAMkB,wBACJlD,KAAKN,SAAS,OACV,OACAM,KAAKN,SAASC,KAAAA,IACZK,KAAKN,OACL,OAAOiC,aAAa,aAClBA,SAAS3B,MAAMiD,SAAS,IACvBtB,YAAY;CACvB,MAAMwB,UAAU,CAAC1D,YAAYyD,qBAAqB;CAElD,MAAME,uBACJpD,KAAKkB,eAAeU,mBAAmB;CAKzC,MAAMyB,cACJF,YACCC,yBAAyB,QAAQA,yBAAyB;CAC7D,MAAME,kBAAkBF,yBAAyB;CAGjD,MAAM,CAACG,YAAYC,iBAAiBnG,SAAS,KAAK;CAElD,MAAMoG,mBAAmBjG,UAAU4D,WAAgB;EAEjD,MAAMsC,YAAYC,OAAOvC,MAAM;EAC/B,MAAMwC,mBAAmBF,UAAUG,WAAW,IAAI,IAC9CH,UAAUI,MAAM,CAAC,IACjBJ;EACJ1D,KAAKmB,WAAWyC,gBAAgB;EAChC/B,eAAe+B,kBAAkB7D,KAAKU,GAAG;EAIzCc,WAAWJ,WAAWyC,gBAAgB;CACxC,CAAC;CAED,MAAMG,iBAAiB1F,eACrBF,QACA,EAAE6F,WAAW,eAAe,GAC5B;EACE,GAAGzC;EACHJ,UAAUsC;EACVQ,UAAUf;CACZ,CACF;CAIA,MAAMgB,uBAAuB1G,eAAe;EAC1CgD,gBAAgBmD,OAAO5D,KAAKU,GAAG,CAAC;CAClC,CAAC;CAED,MAAM0D,qBAAqB3G,UAAU4G,MAA+B;EAClEA,EAAEC,gBAAgB;EAClB,IAAI9B,cAAcvC,KAAKsE,oBAAoB;EAE3C,IAAKF,EAAEG,OAAuBC,QAAQ,+BAA6B,GACjE;EACFhE,gBAAgBmD,OAAO5D,KAAKU,GAAG,CAAC;CAClC,CAAC;CAUD,MAAMgE,gBAAgBjH,UAAU4G,QAAqB;EAMnD,IACEA,IAAE3D,QAAQ,OACVuC,kBACA,CAACT,cACD,CAACvC,KAAKsE,oBACN;GACAF,IAAEM,eAAe;GACjBlE,gBAAgBmD,OAAO5D,KAAKU,GAAG,CAAC;GAChC,OAAO;EACT;EAGA,IAAI2D,IAAE3D,QAAQ,SAAS2D,IAAEO,YAAYtB,aAAa;GAChDe,IAAEM,eAAe;GACjBN,IAAEC,gBAAgB;GAClB,IAAIf,iBACFS,eAAea,KAAK;QAEpBpB,cAAc,IAAI;GAEpB,OAAO;EACT;EAEA,OAAO;CACT,CAAC;CAMD,MAAMqB,kBAAkBrH,UAAU4G,QAAqC;EACrE,IAAIK,cAAcL,GAAC,GAAG;EACtBlC,SAAS4C,YAAYV,GAAC;CACxB,CAAC;CAID,MAAMW,aAAa5H,eACV;EACL6H,SAAS3E;EACT4E,eAAe7E;EACf8E,UAAU/E;EACVgF,SAAS7E;EACT8E,MAAMpD;EACN,gBAAgBgB;EAChB,YAAYK;CACd,IACA;EACEhD;EACAD;EACAD;EACAG;EACA0B;EACAgB;EACAK;CAAW,CAEf;CAEA,MAAMgC,UAAUlI,eACP;EAAE,GAAG4H;EAAYO,UAAU/C;CAAW,IAC7C,CAACwC,YAAYxC,UAAU,CACzB;CAEA,MAAMgD,WAAWpI,eACR;EACL,GAAG4H;EACHS,SAAS1C;EACT2C,SAAS5C;EACT6C,SAASrD;CACX,IACA;EAAC0C;EAAYjC;EAAWD;EAAWR;CAAS,CAC9C;CAEA,MAAMsD,YAAYxI,eACT;EACL,eAAe4C,KAAK6F,SAAS;EAC7B,oBACE/E,iBAAiB,OAAOlB,KAAAA,IAAY,GAAGkB,cAAa;CACxD,IACA,CAACd,KAAK6F,OAAO/E,aAAa,CAC5B;CAQA,MAAMgF,gBAAgB;EAIpB,GAAGhI,aAAWqE,UAAUU,UAAU;EAClCkC,WAAWD;EAGX,GAAItE,aAAaZ,KAAAA,IAAY,OAAO,EAAEmG,UAAU,GAAG;CACrD;CAKA,MAAMC,aAAa/D,SACjB,oBAAC,2BAAD;EAA2B,eAAA;EAAY,gBAAa;CAAQ,CAAA,IAE5D,oBAAC,gBAAD;EAAgB,GAAII;EAAmB,UAAU;EAAI,gBAAa;EAC/D9B,UAAAA,YACC,oBAAC,aAAD,CAAY,CAAA,IAEZ,oBAAC,eAAD,EAAe,IAAIH,aAAa,WAAW,QAAQ,CAAA;CAEvC,CAAA;CAGlB,MAAM6F,eAAehD,iBACnB,oBAAC,yBAAD;EACE,gBAAa;EACb,MAAK;EACL,SAASmB;EAGT,WAAWpG;EAEX,UAAA,oBAACoJ,YAAD;GACE,QAAA;GACA,YAAY9G;GACKD;GACjB,YAAYmC,cAAcvC,KAAKsE;GAC/B,cAAY1F,gBAAgBoB,IAAI;GAGhC,qBAAqBO,aAAaZ,KAAAA;GAClC,UAAUuE;EAAqB,CAAA;CAEV,CAAA,IACvB;CAMJ,MAAM,EACJgC,QAAQC,YACRC,SAASC,aACT,GAAGC,mBAJH,OAAO3F,cAAc,aAAaA,UAAUX,MAAMiD,SAAS,IAAItC,cAKxC,CAAC;CAE1B,MAAM4F,iBACJP,gBAAgBG,aACd,qBAAA,YAAA,EAAA,UAAA,CACGH,cACAG,UACH,EAAA,CAAA,IACE;CAIN,MAAMK,aACJnD,eAAe,CAACC,kBACd,qBAAC8D,cAAD;EAAa,QAAQ7D;EAAY,cAAcC;EAA/C,UAAA,CACE,oBAAC,YAAD;GACE,UAAU;GACV,MAAM,oBAAC,UAAD,CAAS,CAAA;GACf,cAAY9B,EAAE,gBAAgB,SAAS;GACvC,GAAIL;EAAiB,CAAA,GAEvB,oBAAC4F,QAAD;GAAM,GAAI1F;GAAW,UAAUkC;GAC5BP,UAAAA;EACG,CAAA,CACK;CACX,CAAA,IAAA;CAGN,MAAMuD,kBACJJ,eAAeG,aACb,qBAAA,YAAA,EAAA,UAAA,CACGH,aACAG,UACH,EAAA,CAAA,IACE7G,KAAAA;CAMN,MAAM+G,OAAOvJ,cAAc;EACzB,MAAMwJ,OAA8B,CAAC7E,MAAM;EAC3C,IAAIhB,YAAY6F,KAAKC,KAAK9F,UAAU;EACpC,IAAIuC,aAAasD,KAAKC,KAAK7C,eAAe8C,SAAS;EACnD,OAAO/I,UAAU,GAAG6I,IAAI;CAC1B,GAAG;EAAC7F;EAAYuC;EAAaU,eAAe8C;CAAS,CAAC;CAEtD,OACE,qBAAC,aAAD;EACE,GAAIhB;EACJ,KAAKa;EACL,MAAMrB;EACN,QAAQM;EACR,gBAAa;EACb,eAAahC,OAAO5D,KAAKU,GAAG;EAC5B,cAAYQ;EAPd,UAAA,CASE,oBAAC,aAAD;GACE,GAAIkB;GACJ,GAAImE;GACE5F;GACMgC;GACAH;GACZ,MAAMgD;GACN,MAAMQ;GACN,QAAQQ;GACR,SAASE;GACT,QAAQ7F;GAEPZ,UAAAA,KAAK8G;EACK,CAAA,GACZzD,eAAeU,eAAegD,QACpB;;AAEjB;AAEA,MAAaC,WAAW9J,KAAKsE,aAAa"}
@@ -0,0 +1,158 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.202.0 | Cube Dev Team */
2
+ //#region src/components/content/Tree/checked-keys.ts
3
+ /**
4
+ * Pure checkbox cascade for a tree: which keys are fully checked and which
5
+ * are half-checked, and what one toggle does to them.
6
+ *
7
+ * Shared by `Tree` (through `useCheckboxTree`) and `FilterPicker`'s tree
8
+ * mode. The picker renders a filtered copy of `treeData` but must conduct
9
+ * over the whole tree, so a search never reads a hidden node as unchecked.
10
+ */
11
+ /**
12
+ * Returns whether a node should be checkable (i.e. clicking the
13
+ * checkbox should affect it).
14
+ *
15
+ * Skips:
16
+ * - explicitly disabled nodes (`isDisabled === true`)
17
+ * - explicitly disabled checkboxes (`isCheckboxDisabled === true`)
18
+ * - nodes that opted out via `isCheckable === false`
19
+ */
20
+ function isNodeEligible(node) {
21
+ if (!node) return false;
22
+ if (node.isDisabled) return false;
23
+ if (node.isCheckboxDisabled) return false;
24
+ if (node.isCheckable === false) return false;
25
+ return true;
26
+ }
27
+ /**
28
+ * Recursively walk a subtree bottom-up, deriving which nodes are fully
29
+ * checked vs half-checked. Mutates `checked` and `half` in place.
30
+ */
31
+ function deriveCheckedState(node, index, checked, half) {
32
+ const childKeys = index.childrenOf.get(node.key) ?? [];
33
+ if (childKeys.length === 0) {
34
+ const eligible = isNodeEligible(node);
35
+ const isChecked = checked.has(node.key);
36
+ return {
37
+ allChecked: !eligible || isChecked,
38
+ anyChecked: isChecked,
39
+ anyEligible: eligible
40
+ };
41
+ }
42
+ let allChecked = true;
43
+ let anyChecked = false;
44
+ let anyEligible = false;
45
+ for (const childKey of childKeys) {
46
+ const child = index.byKey.get(childKey);
47
+ if (!child) continue;
48
+ const r = deriveCheckedState(child, index, checked, half);
49
+ if (r.anyEligible) anyEligible = true;
50
+ if (!r.allChecked) allChecked = false;
51
+ if (r.anyChecked) anyChecked = true;
52
+ }
53
+ const eligible = isNodeEligible(node);
54
+ if (!anyEligible) half.delete(node.key);
55
+ else if (allChecked) {
56
+ checked.add(node.key);
57
+ half.delete(node.key);
58
+ } else if (anyChecked) {
59
+ checked.delete(node.key);
60
+ half.add(node.key);
61
+ } else {
62
+ checked.delete(node.key);
63
+ half.delete(node.key);
64
+ }
65
+ return {
66
+ allChecked: !eligible ? allChecked : checked.has(node.key) && allChecked,
67
+ anyChecked: anyChecked || checked.has(node.key),
68
+ anyEligible: anyEligible || eligible
69
+ };
70
+ }
71
+ /**
72
+ * Derive `{ checked, halfChecked }` from a source-of-truth `checked` set,
73
+ * as AntD does:
74
+ *
75
+ * - First down: a checked key checks its eligible descendants, so a parent
76
+ * key stands for its subtree even when its children aren't listed, and
77
+ * even when the parent's own checkbox is disabled.
78
+ * - Then bottom-up: a parent is fully checked iff every eligible
79
+ * descendant leaf is checked, and half-checked iff at least one eligible
80
+ * descendant is checked or half-checked, but not all.
81
+ *
82
+ * Both passes look through ineligible nodes (disabled / opt-out): such a
83
+ * node neither forces a parent into the unchecked nor half state, nor
84
+ * stops a cascade from reaching the eligible nodes below it. A locked
85
+ * node with no eligible descendants keeps its own state.
86
+ */
87
+ function deriveCheckedSets(treeData, index, source) {
88
+ const checked = /* @__PURE__ */ new Set();
89
+ const halfChecked = /* @__PURE__ */ new Set();
90
+ const checkSubtree = (node) => {
91
+ if (isNodeEligible(node)) checked.add(node.key);
92
+ for (const ck of index.childrenOf.get(node.key) ?? []) {
93
+ const child = index.byKey.get(ck);
94
+ if (child) checkSubtree(child);
95
+ }
96
+ };
97
+ for (const key of source) {
98
+ checked.add(key);
99
+ for (const childKey of index.childrenOf.get(key) ?? []) {
100
+ const child = index.byKey.get(childKey);
101
+ if (child) checkSubtree(child);
102
+ }
103
+ }
104
+ for (const root of treeData) deriveCheckedState(root, index, checked, halfChecked);
105
+ return {
106
+ checked,
107
+ halfChecked
108
+ };
109
+ }
110
+ /**
111
+ * Toggle `key` against the derived `checked` set: propagate *down*
112
+ * through its subtree, looking through ineligible nodes as
113
+ * `deriveCheckedSets` does, and drop its ancestors. Returns the next
114
+ * source-of-truth set, or `null` when the node can't be toggled. Pass the
115
+ * result through `deriveCheckedSets`, which adds back the ancestors that
116
+ * end up fully checked.
117
+ *
118
+ * Seed it with the derived set, not the source one. The source set may
119
+ * only contain leaf keys (e.g. when `defaultCheckedKeys` is leaf-only, or
120
+ * a consumer in controlled-array mode passes only leaves), so it would
121
+ * read a fully checked parent as unchecked.
122
+ */
123
+ function toggleCheckedKey(index, checked, key) {
124
+ const node = index.byKey.get(key);
125
+ if (!node || !isNodeEligible(node)) return null;
126
+ const willCheck = !checked.has(key);
127
+ const next = new Set(checked);
128
+ const apply = (n) => {
129
+ let follows = false;
130
+ for (const ck of index.childrenOf.get(n.key) ?? []) {
131
+ const child = index.byKey.get(ck);
132
+ if (child && apply(child)) follows = true;
133
+ }
134
+ if (follows || isNodeEligible(n)) {
135
+ if (willCheck) next.add(n.key);
136
+ else next.delete(n.key);
137
+ }
138
+ return follows || isNodeEligible(n);
139
+ };
140
+ apply(node);
141
+ let parentKey = index.parentOf.get(key);
142
+ while (parentKey) {
143
+ next.delete(parentKey);
144
+ parentKey = index.parentOf.get(parentKey);
145
+ }
146
+ return next;
147
+ }
148
+ /** A checked set as an array in tree order; keys the tree lacks go last. */
149
+ function toOrderedKeys(index, checked) {
150
+ const set = new Set(checked);
151
+ const ordered = [...index.byKey.keys()].filter((key) => set.has(key));
152
+ for (const key of set) if (!index.byKey.has(key)) ordered.push(key);
153
+ return ordered;
154
+ }
155
+ //#endregion
156
+ export { deriveCheckedSets, isNodeEligible, toOrderedKeys, toggleCheckedKey };
157
+
158
+ //# sourceMappingURL=checked-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checked-keys.js","names":["TreeIndex","CubeTreeNodeData","isNodeEligible","node","isDisabled","isCheckboxDisabled","isCheckable","deriveCheckedState","index","checked","Set","half","allChecked","anyChecked","anyEligible","childKeys","childrenOf","get","key","length","eligible","isChecked","has","childKey","child","byKey","r","delete","add","deriveCheckedSets","treeData","source","Iterable","halfChecked","checkSubtree","ck","root","toggleCheckedKey","willCheck","next","apply","n","follows","parentKey","parentOf","toOrderedKeys","set","ordered","keys","filter","push"],"sources":["../../../../src/components/content/Tree/checked-keys.ts"],"sourcesContent":["import type { TreeIndex } from './tree-index';\nimport type { CubeTreeNodeData } from './types';\n\n/**\n * Pure checkbox cascade for a tree: which keys are fully checked and which\n * are half-checked, and what one toggle does to them.\n *\n * Shared by `Tree` (through `useCheckboxTree`) and `FilterPicker`'s tree\n * mode. The picker renders a filtered copy of `treeData` but must conduct\n * over the whole tree, so a search never reads a hidden node as unchecked.\n */\n\n/**\n * Returns whether a node should be checkable (i.e. clicking the\n * checkbox should affect it).\n *\n * Skips:\n * - explicitly disabled nodes (`isDisabled === true`)\n * - explicitly disabled checkboxes (`isCheckboxDisabled === true`)\n * - nodes that opted out via `isCheckable === false`\n */\nexport function isNodeEligible(node: CubeTreeNodeData | undefined): boolean {\n if (!node) return false;\n if (node.isDisabled) return false;\n if (node.isCheckboxDisabled) return false;\n if (node.isCheckable === false) return false;\n return true;\n}\n\n/**\n * Recursively walk a subtree bottom-up, deriving which nodes are fully\n * checked vs half-checked. Mutates `checked` and `half` in place.\n */\nfunction deriveCheckedState(\n node: CubeTreeNodeData,\n index: TreeIndex,\n checked: Set<string>,\n half: Set<string>,\n): { allChecked: boolean; anyChecked: boolean; anyEligible: boolean } {\n const childKeys = index.childrenOf.get(node.key) ?? [];\n\n if (childKeys.length === 0) {\n const eligible = isNodeEligible(node);\n const isChecked = checked.has(node.key);\n return {\n allChecked: !eligible || isChecked,\n anyChecked: isChecked,\n anyEligible: eligible,\n };\n }\n\n let allChecked = true;\n let anyChecked = false;\n let anyEligible = false;\n\n for (const childKey of childKeys) {\n const child = index.byKey.get(childKey);\n if (!child) continue;\n const r = deriveCheckedState(child, index, checked, half);\n if (r.anyEligible) anyEligible = true;\n if (!r.allChecked) allChecked = false;\n if (r.anyChecked) anyChecked = true;\n }\n\n const eligible = isNodeEligible(node);\n\n if (!anyEligible) {\n // No eligible descendants — this node behaves like a leaf for\n // checking purposes: its own checked state stands as-is.\n half.delete(node.key);\n } else if (allChecked) {\n checked.add(node.key);\n half.delete(node.key);\n } else if (anyChecked) {\n checked.delete(node.key);\n half.add(node.key);\n } else {\n checked.delete(node.key);\n half.delete(node.key);\n }\n\n return {\n allChecked: !eligible ? allChecked : checked.has(node.key) && allChecked,\n anyChecked: anyChecked || checked.has(node.key),\n anyEligible: anyEligible || eligible,\n };\n}\n\n/**\n * Derive `{ checked, halfChecked }` from a source-of-truth `checked` set,\n * as AntD does:\n *\n * - First down: a checked key checks its eligible descendants, so a parent\n * key stands for its subtree even when its children aren't listed, and\n * even when the parent's own checkbox is disabled.\n * - Then bottom-up: a parent is fully checked iff every eligible\n * descendant leaf is checked, and half-checked iff at least one eligible\n * descendant is checked or half-checked, but not all.\n *\n * Both passes look through ineligible nodes (disabled / opt-out): such a\n * node neither forces a parent into the unchecked nor half state, nor\n * stops a cascade from reaching the eligible nodes below it. A locked\n * node with no eligible descendants keeps its own state.\n */\nexport function deriveCheckedSets(\n treeData: CubeTreeNodeData[],\n index: TreeIndex,\n source: Iterable<string>,\n): { checked: Set<string>; halfChecked: Set<string> } {\n const checked = new Set<string>();\n const halfChecked = new Set<string>();\n\n const checkSubtree = (node: CubeTreeNodeData) => {\n if (isNodeEligible(node)) checked.add(node.key);\n for (const ck of index.childrenOf.get(node.key) ?? []) {\n const child = index.byKey.get(ck);\n if (child) checkSubtree(child);\n }\n };\n\n // A key stands for its subtree even when its own checkbox is off limits,\n // so a locked parent in the value keeps its checked children, and with\n // them its own key, through the bottom-up pass.\n for (const key of source) {\n checked.add(key);\n for (const childKey of index.childrenOf.get(key) ?? []) {\n const child = index.byKey.get(childKey);\n if (child) checkSubtree(child);\n }\n }\n\n for (const root of treeData) {\n deriveCheckedState(root, index, checked, halfChecked);\n }\n\n return { checked, halfChecked };\n}\n\n/**\n * Toggle `key` against the derived `checked` set: propagate *down*\n * through its subtree, looking through ineligible nodes as\n * `deriveCheckedSets` does, and drop its ancestors. Returns the next\n * source-of-truth set, or `null` when the node can't be toggled. Pass the\n * result through `deriveCheckedSets`, which adds back the ancestors that\n * end up fully checked.\n *\n * Seed it with the derived set, not the source one. The source set may\n * only contain leaf keys (e.g. when `defaultCheckedKeys` is leaf-only, or\n * a consumer in controlled-array mode passes only leaves), so it would\n * read a fully checked parent as unchecked.\n */\nexport function toggleCheckedKey(\n index: TreeIndex,\n checked: Set<string>,\n key: string,\n): Set<string> | null {\n const node = index.byKey.get(key);\n if (!node || !isNodeEligible(node)) return null;\n\n const willCheck = !checked.has(key);\n const next = new Set(checked);\n\n // Returns whether the subtree holds an eligible node. A locked node\n // above one follows it; a locked node with none keeps its own state.\n const apply = (n: CubeTreeNodeData): boolean => {\n let follows = false;\n for (const ck of index.childrenOf.get(n.key) ?? []) {\n const child = index.byKey.get(ck);\n if (child && apply(child)) follows = true;\n }\n if (follows || isNodeEligible(n)) {\n if (willCheck) next.add(n.key);\n else next.delete(n.key);\n }\n return follows || isNodeEligible(n);\n };\n\n apply(node);\n\n // The bottom-up pass decides the ancestors, locked siblings' subtrees\n // included. Dropping them here also keeps an ancestor from a set taken as\n // given (the object form) from conducting down onto untouched siblings.\n let parentKey = index.parentOf.get(key);\n while (parentKey) {\n next.delete(parentKey);\n parentKey = index.parentOf.get(parentKey);\n }\n\n return next;\n}\n\n/** A checked set as an array in tree order; keys the tree lacks go last. */\nexport function toOrderedKeys(\n index: TreeIndex,\n checked: Iterable<string>,\n): string[] {\n const set = new Set(checked);\n const ordered = [...index.byKey.keys()].filter((key) => set.has(key));\n\n for (const key of set) {\n if (!index.byKey.has(key)) ordered.push(key);\n }\n\n return ordered;\n}\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.202.0 | Cube Dev Team */
2
+ //#region src/components/content/Tree/rowId.ts
3
+ /**
4
+ * The DOM id of the row with `key` in the tree whose id is `treeId`, for the
5
+ * `aria-activedescendant` of an input that drives the tree with virtual
6
+ * focus. React Aria's `useGridListItem` assigns it, and `react-aria` does not
7
+ * re-export its `getRowId`, so this mirrors that format: the tree id, a dash,
8
+ * then the key with whitespace removed (see `ListBox/optionId.ts`).
9
+ */
10
+ function getTreeRowId(treeId, key) {
11
+ return `${treeId}-${key.replace(/\s*/g, "")}`;
12
+ }
13
+ //#endregion
14
+ export { getTreeRowId };
15
+
16
+ //# sourceMappingURL=rowId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rowId.js","names":["getTreeRowId","treeId","key","replace"],"sources":["../../../../src/components/content/Tree/rowId.ts"],"sourcesContent":["/**\n * The DOM id of the row with `key` in the tree whose id is `treeId`, for the\n * `aria-activedescendant` of an input that drives the tree with virtual\n * focus. React Aria's `useGridListItem` assigns it, and `react-aria` does not\n * re-export its `getRowId`, so this mirrors that format: the tree id, a dash,\n * then the key with whitespace removed (see `ListBox/optionId.ts`).\n */\nexport function getTreeRowId(treeId: string, key: string): string {\n return `${treeId}-${key.replace(/\\s*/g, '')}`;\n}\n"],"mappings":";;;;;;;;;AAOA,SAAgBA,aAAaC,QAAgBC,KAAqB;CAChE,OAAO,GAAGD,OAAM,GAAIC,IAAIC,QAAQ,QAAQ,EAAE;AAC5C"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.200.1 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.202.0 | Cube Dev Team */
2
2
  import { Item as _Item } from "../Item/Item.js";
3
3
  import { Action } from "../../actions/Action/Action.js";
4
4
  import { mergeStyles, tasty } from "@tenphi/tasty";
@@ -1,5 +1,13 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.200.1 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.202.0 | Cube Dev Team */
2
2
  //#region src/components/content/Tree/tree-index.ts
3
+ /**
4
+ * A node's plain-text label: its `textValue`, else its `title` when that
5
+ * is a string, else its key.
6
+ */
7
+ function getTreeNodeText(node) {
8
+ if (node.textValue != null) return node.textValue;
9
+ return typeof node.title === "string" ? node.title : node.key;
10
+ }
3
11
  function buildTreeIndex(treeData) {
4
12
  const byKey = /* @__PURE__ */ new Map();
5
13
  const parentOf = /* @__PURE__ */ new Map();
@@ -21,6 +29,6 @@ function buildTreeIndex(treeData) {
21
29
  };
22
30
  }
23
31
  //#endregion
24
- export { buildTreeIndex };
32
+ export { buildTreeIndex, getTreeNodeText };
25
33
 
26
34
  //# sourceMappingURL=tree-index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tree-index.js","names":["CubeTreeNodeData","TreeIndex","byKey","Map","parentOf","childrenOf","buildTreeIndex","treeData","visit","nodes","parent","node","set","key","childKeys","children","map","c"],"sources":["../../../../src/components/content/Tree/tree-index.ts"],"sourcesContent":["import type { CubeTreeNodeData } from './types';\n\n/**\n * Map of `key -> { node, parentKey, childKeys }` for fast cascading lookups.\n *\n * Built from the public `treeData` rather than from React Stately's\n * collection, because we need the consumer's original (controlled)\n * shape to derive parent/child relationships and to call back with the\n * actual `node` objects.\n *\n * Shared between `Tree.tsx` (for `nodesByKey` / `parentOf`) and\n * `useCheckboxTree` (cascading checked state) so a single tree walk\n * powers all three maps.\n */\nexport interface TreeIndex {\n byKey: Map<string, CubeTreeNodeData>;\n parentOf: Map<string, string | null>;\n childrenOf: Map<string, string[]>;\n}\n\nexport function buildTreeIndex(treeData: CubeTreeNodeData[]): TreeIndex {\n const byKey = new Map<string, CubeTreeNodeData>();\n const parentOf = new Map<string, string | null>();\n const childrenOf = new Map<string, string[]>();\n\n const visit = (nodes: CubeTreeNodeData[], parent: string | null) => {\n for (const node of nodes) {\n byKey.set(node.key, node);\n parentOf.set(node.key, parent);\n const childKeys = (node.children ?? []).map((c) => c.key);\n childrenOf.set(node.key, childKeys);\n if (node.children) {\n visit(node.children, node.key);\n }\n }\n };\n\n visit(treeData, null);\n\n return { byKey, parentOf, childrenOf };\n}\n"],"mappings":";;AAoBA,SAAgBM,eAAeC,UAAyC;CACtE,MAAML,wBAAQ,IAAIC,IAA8B;CAChD,MAAMC,2BAAW,IAAID,IAA2B;CAChD,MAAME,6BAAa,IAAIF,IAAsB;CAE7C,MAAMK,SAASC,OAA2BC,WAA0B;EAClE,KAAK,MAAMC,QAAQF,OAAO;GACxBP,MAAMU,IAAID,KAAKE,KAAKF,IAAI;GACxBP,SAASQ,IAAID,KAAKE,KAAKH,MAAM;GAC7B,MAAMI,aAAaH,KAAKI,YAAY,CAAA,EAAA,CAAIC,KAAKC,MAAMA,EAAEJ,GAAG;GACxDR,WAAWO,IAAID,KAAKE,KAAKC,SAAS;GAClC,IAAIH,KAAKI,UACPP,MAAMG,KAAKI,UAAUJ,KAAKE,GAAG;EAEjC;CACF;CAEAL,MAAMD,UAAU,IAAI;CAEpB,OAAO;EAAEL;EAAOE;EAAUC;CAAW;AACvC"}
1
+ {"version":3,"file":"tree-index.js","names":["CubeTreeNodeData","TreeIndex","byKey","Map","parentOf","childrenOf","getTreeNodeText","node","textValue","title","key","buildTreeIndex","treeData","visit","nodes","parent","set","childKeys","children","map","c"],"sources":["../../../../src/components/content/Tree/tree-index.ts"],"sourcesContent":["import type { CubeTreeNodeData } from './types';\n\n/**\n * Map of `key -> { node, parentKey, childKeys }` for fast cascading lookups.\n *\n * Built from the public `treeData` rather than from React Stately's\n * collection, because we need the consumer's original (controlled)\n * shape to derive parent/child relationships and to call back with the\n * actual `node` objects.\n *\n * Shared between `Tree.tsx` (for `nodesByKey` / `parentOf`) and\n * `useCheckboxTree` (cascading checked state) so a single tree walk\n * powers all three maps.\n */\nexport interface TreeIndex {\n byKey: Map<string, CubeTreeNodeData>;\n parentOf: Map<string, string | null>;\n childrenOf: Map<string, string[]>;\n}\n\n/**\n * A node's plain-text label: its `textValue`, else its `title` when that\n * is a string, else its key.\n */\nexport function getTreeNodeText(node: CubeTreeNodeData): string {\n if (node.textValue != null) return node.textValue;\n return typeof node.title === 'string' ? node.title : node.key;\n}\n\nexport function buildTreeIndex(treeData: CubeTreeNodeData[]): TreeIndex {\n const byKey = new Map<string, CubeTreeNodeData>();\n const parentOf = new Map<string, string | null>();\n const childrenOf = new Map<string, string[]>();\n\n const visit = (nodes: CubeTreeNodeData[], parent: string | null) => {\n for (const node of nodes) {\n byKey.set(node.key, node);\n parentOf.set(node.key, parent);\n const childKeys = (node.children ?? []).map((c) => c.key);\n childrenOf.set(node.key, childKeys);\n if (node.children) {\n visit(node.children, node.key);\n }\n }\n };\n\n visit(treeData, null);\n\n return { byKey, parentOf, childrenOf };\n}\n"],"mappings":";;;;;;AAwBA,SAAgBM,gBAAgBC,MAAgC;CAC9D,IAAIA,KAAKC,aAAa,MAAM,OAAOD,KAAKC;CACxC,OAAO,OAAOD,KAAKE,UAAU,WAAWF,KAAKE,QAAQF,KAAKG;AAC5D;AAEA,SAAgBC,eAAeC,UAAyC;CACtE,MAAMV,wBAAQ,IAAIC,IAA8B;CAChD,MAAMC,2BAAW,IAAID,IAA2B;CAChD,MAAME,6BAAa,IAAIF,IAAsB;CAE7C,MAAMU,SAASC,OAA2BC,WAA0B;EAClE,KAAK,MAAMR,QAAQO,OAAO;GACxBZ,MAAMc,IAAIT,KAAKG,KAAKH,IAAI;GACxBH,SAASY,IAAIT,KAAKG,KAAKK,MAAM;GAC7B,MAAME,aAAaV,KAAKW,YAAY,CAAA,EAAA,CAAIC,KAAKC,MAAMA,EAAEV,GAAG;GACxDL,WAAWW,IAAIT,KAAKG,KAAKO,SAAS;GAClC,IAAIV,KAAKW,UACPL,MAAMN,KAAKW,UAAUX,KAAKG,GAAG;EAEjC;CACF;CAEAG,MAAMD,UAAU,IAAI;CAEpB,OAAO;EAAEV;EAAOE;EAAUC;CAAW;AACvC"}
@@ -34,6 +34,11 @@ export interface CubeTreeNodeData {
34
34
  key: string;
35
35
  /** Visible label (any `ReactNode`). */
36
36
  title: ReactNode;
37
+ /**
38
+ * Plain-text label: what the checkbox is named and what a search or
39
+ * typeahead matches. Defaults to `title` when it is a string, else `key`.
40
+ */
41
+ textValue?: string;
37
42
  /** Children. Pass `undefined` together with `isLeaf={false}` for lazy nodes. */
38
43
  children?: CubeTreeNodeData[];
39
44
  /** Force leaf rendering (no expand toggle, no `loadData` call). */
@@ -144,12 +149,14 @@ export interface CubeTreeProps extends BaseProps, OuterStyleProps {
144
149
  * keep their parents expanded as well.
145
150
  */
146
151
  autoExpandParent?: boolean;
147
- /** Default checked keys (uncontrolled). */
152
+ /** Default checked keys (uncontrolled). A parent key checks its whole subtree, as in AntD. */
148
153
  defaultCheckedKeys?: string[];
149
154
  /**
150
155
  * Controlled checked keys.
151
156
  *
152
157
  * Accepts either an array of keys or AntD's `{ checked, halfChecked }` shape.
158
+ * In the array form a parent key checks its whole subtree, as in AntD; the
159
+ * object form is taken as given.
153
160
  */
154
161
  checkedKeys?: string[] | {
155
162
  checked: string[];
@@ -242,6 +249,19 @@ export interface CubeTreeProps extends BaseProps, OuterStyleProps {
242
249
  * override them) and receives the same normalized action key.
243
250
  */
244
251
  menuProps?: Partial<CubeMenuProps<object>>;
252
+ /**
253
+ * Row a control outside the tree points at with `aria-activedescendant`
254
+ * (FilterPicker's search input). It shows as focused and is scrolled
255
+ * into view; give the tree an `id` so its row ids are predictable.
256
+ * @internal
257
+ */
258
+ _activeKey?: string | null;
259
+ /**
260
+ * Called when a row is pressed or Enter is pressed on it, in place of
261
+ * row selection. Used by FilterPicker to toggle the row's checkbox.
262
+ * @internal
263
+ */
264
+ _onRowAction?: (key: string) => void;
245
265
  }
246
266
  //#endregion
247
267
  //# sourceMappingURL=types.d.ts.map