@cube-dev/ui-kit 0.199.2 → 0.200.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 (673) hide show
  1. package/dist/CHANGELOG.md +35 -0
  2. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  3. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  4. package/dist/_internal/hooks/use-event.js +1 -1
  5. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  6. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  7. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  8. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  9. package/dist/_internal/hooks/use-warn.js +1 -1
  10. package/dist/components/Block.js +1 -1
  11. package/dist/components/CollectionItem.js +1 -1
  12. package/dist/components/GlobalStyles.js +1 -1
  13. package/dist/components/GridProvider.d.ts +6 -4
  14. package/dist/components/GridProvider.js +14 -9
  15. package/dist/components/GridProvider.js.map +1 -1
  16. package/dist/components/HiddenInput.js +1 -1
  17. package/dist/components/Root.js +1 -1
  18. package/dist/components/Root.js.map +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 +2 -2
  22. package/dist/components/actions/Button/Button.js.map +1 -1
  23. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  24. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  25. package/dist/components/actions/ButtonSplit/context.js +1 -1
  26. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  27. package/dist/components/actions/CommandMenu/styled.js +1 -1
  28. package/dist/components/actions/ItemAction/ItemAction.js +7 -12
  29. package/dist/components/actions/ItemAction/ItemAction.js.map +1 -1
  30. package/dist/components/actions/ItemActionContext.js +1 -1
  31. package/dist/components/actions/ItemActionsWrapper.js +5 -6
  32. package/dist/components/actions/ItemActionsWrapper.js.map +1 -1
  33. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  34. package/dist/components/actions/Link/Link.js +1 -1
  35. package/dist/components/actions/Menu/Menu.js +1 -1
  36. package/dist/components/actions/Menu/MenuCollectionItem.js +1 -1
  37. package/dist/components/actions/Menu/MenuItem.js +1 -1
  38. package/dist/components/actions/Menu/MenuSection.js +1 -1
  39. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  40. package/dist/components/actions/Menu/MenuTrigger.js.map +1 -1
  41. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  42. package/dist/components/actions/Menu/SubMenuTrigger.js.map +1 -1
  43. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  44. package/dist/components/actions/Menu/context.js +1 -1
  45. package/dist/components/actions/Menu/styled.js +2 -2
  46. package/dist/components/actions/Menu/styled.js.map +1 -1
  47. package/dist/components/actions/actions-run.js +1 -1
  48. package/dist/components/actions/index.js +1 -1
  49. package/dist/components/actions/use-action.js +1 -1
  50. package/dist/components/actions/use-anchored-menu.js +1 -1
  51. package/dist/components/actions/use-context-menu.js +1 -1
  52. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  53. package/dist/components/content/Alert/Alert.js +1 -1
  54. package/dist/components/content/Alert/Alert.js.map +1 -1
  55. package/dist/components/content/Alert/use-alert.js +24 -27
  56. package/dist/components/content/Alert/use-alert.js.map +1 -1
  57. package/dist/components/content/Avatar/Avatar.js +1 -1
  58. package/dist/components/content/Badge/Badge.js +6 -2
  59. package/dist/components/content/Badge/Badge.js.map +1 -1
  60. package/dist/components/content/Card/Card.js +1 -1
  61. package/dist/components/content/Content.js +1 -1
  62. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +3 -3
  63. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js.map +1 -1
  64. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  65. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  66. package/dist/components/content/Divider.js +1 -1
  67. package/dist/components/content/Footer.js +1 -1
  68. package/dist/components/content/Header.js +1 -1
  69. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  70. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  71. package/dist/components/content/InlineInput/InlineInput.js +6 -13
  72. package/dist/components/content/InlineInput/InlineInput.js.map +1 -1
  73. package/dist/components/content/Item/Item.js +18 -18
  74. package/dist/components/content/Item/Item.js.map +1 -1
  75. package/dist/components/content/Item/ItemWithNativeLinks.js +1 -1
  76. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  77. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  78. package/dist/components/content/Layout/GridLayout.js +1 -1
  79. package/dist/components/content/Layout/Layout.js +1 -1
  80. package/dist/components/content/Layout/Layout.js.map +1 -1
  81. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  82. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  83. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  84. package/dist/components/content/Layout/LayoutContainer.js.map +1 -1
  85. package/dist/components/content/Layout/LayoutContent.js +5 -3
  86. package/dist/components/content/Layout/LayoutContent.js.map +1 -1
  87. package/dist/components/content/Layout/LayoutContext.js +1 -1
  88. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  89. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  90. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  91. package/dist/components/content/Layout/LayoutHeader.js +2 -2
  92. package/dist/components/content/Layout/LayoutHeader.js.map +1 -1
  93. package/dist/components/content/Layout/LayoutPane.js +16 -12
  94. package/dist/components/content/Layout/LayoutPane.js.map +1 -1
  95. package/dist/components/content/Layout/LayoutPanel.js +23 -19
  96. package/dist/components/content/Layout/LayoutPanel.js.map +1 -1
  97. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  98. package/dist/components/content/Layout/LayoutPanelTransition.js +1 -1
  99. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  100. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  101. package/dist/components/content/Layout/index.js +1 -1
  102. package/dist/components/content/Layout/utils.js +1 -1
  103. package/dist/components/content/Paragraph.js +1 -1
  104. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  105. package/dist/components/content/Placeholder/Placeholder.js.map +1 -1
  106. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  107. package/dist/components/content/PrismCode/PrismCode.js.map +1 -1
  108. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  109. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  110. package/dist/components/content/Result/Result.js +1 -1
  111. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  112. package/dist/components/content/Skeleton/Skeleton.js.map +1 -1
  113. package/dist/components/content/Tag/Tag.js +6 -2
  114. package/dist/components/content/Tag/Tag.js.map +1 -1
  115. package/dist/components/content/Text.js +1 -1
  116. package/dist/components/content/TextItem/TextItem.js +1 -1
  117. package/dist/components/content/Title.js +1 -1
  118. package/dist/components/content/Tree/Tree.js +9 -17
  119. package/dist/components/content/Tree/Tree.js.map +1 -1
  120. package/dist/components/content/Tree/TreeNode.js +6 -4
  121. package/dist/components/content/Tree/TreeNode.js.map +1 -1
  122. package/dist/components/content/Tree/styled.js +30 -11
  123. package/dist/components/content/Tree/styled.js.map +1 -1
  124. package/dist/components/content/Tree/tree-index.js +1 -1
  125. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  126. package/dist/components/content/Tree/use-load-data.js +1 -1
  127. package/dist/components/content/highlightText.js +1 -1
  128. package/dist/components/content/use-auto-tooltip.js +1 -1
  129. package/dist/components/data/DataTable/DataTable.js +1 -1
  130. package/dist/components/data/ItemTable/ItemTable.js +1 -1
  131. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  132. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  133. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  134. package/dist/components/data/ItemTable/ItemTableToolbar.js +2 -2
  135. package/dist/components/data/ItemTable/ItemTableToolbar.js.map +1 -1
  136. package/dist/components/data/ItemTable/use-item-table-column-widths.js +1 -1
  137. package/dist/components/data/ItemTable/use-item-table-drag-drop.js +1 -1
  138. package/dist/components/data/ItemTable/use-item-table-pagination.js +1 -1
  139. package/dist/components/data/ItemTable/use-item-table-selection.js +1 -1
  140. package/dist/components/data/ItemTable/use-item-table-sort.js +1 -1
  141. package/dist/components/data/ItemTable/use-item-table-tree-model.js +1 -1
  142. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  143. package/dist/components/data/TableBase/RowCollection.js +1 -1
  144. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  145. package/dist/components/data/TableBase/TableRow.js +1 -1
  146. package/dist/components/data/TableBase/TableRow.js.map +1 -1
  147. package/dist/components/data/TableBase/TableView.js +1 -1
  148. package/dist/components/data/TableBase/TableView.js.map +1 -1
  149. package/dist/components/data/TableBase/TreeGridTable.js +1 -1
  150. package/dist/components/data/TableBase/TreeGridTable.js.map +1 -1
  151. package/dist/components/data/TableBase/column-header.js +1 -1
  152. package/dist/components/data/TableBase/column-menu.js +1 -1
  153. package/dist/components/data/TableBase/column-styles.js +1 -1
  154. package/dist/components/data/TableBase/column-tint.js +1 -1
  155. package/dist/components/data/TableBase/row-menu.js +1 -1
  156. package/dist/components/data/TableBase/styled.js +26 -29
  157. package/dist/components/data/TableBase/styled.js.map +1 -1
  158. package/dist/components/data/TableBase/table-tree.js +1 -1
  159. package/dist/components/data/TableBase/types.js +1 -1
  160. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  161. package/dist/components/data/TableBase/use-column-menu.js +1 -1
  162. package/dist/components/data/TableBase/use-column-order.js +1 -1
  163. package/dist/components/data/TableBase/use-column-window.js +1 -1
  164. package/dist/components/data/TableBase/use-container-width.js +1 -1
  165. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  166. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  167. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  168. package/dist/components/data/TableBase/use-table-search.js +1 -1
  169. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  170. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  171. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  172. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  173. package/dist/components/data/TableBase/use-table-tooltip-refresh.js +1 -1
  174. package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
  175. package/dist/components/fields/Checkbox/Checkbox.js +3 -3
  176. package/dist/components/fields/Checkbox/Checkbox.js.map +1 -1
  177. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  178. package/dist/components/fields/Checkbox/context.js +1 -1
  179. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  180. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  181. package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
  182. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +6 -6
  183. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js.map +1 -1
  184. package/dist/components/fields/ComboBox/ComboBox.d.ts +1 -1
  185. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  186. package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
  187. package/dist/components/fields/ComboBox/comboBoxOptions.js +1 -1
  188. package/dist/components/fields/CommandTextArea/CommandTextArea.d.ts +1 -1
  189. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  190. package/dist/components/fields/CommandTextArea/CommandTextArea.js.map +1 -1
  191. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  192. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  193. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  194. package/dist/components/fields/DatePicker/DateInputBase.js +5 -9
  195. package/dist/components/fields/DatePicker/DateInputBase.js.map +1 -1
  196. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  197. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  198. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  199. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  200. package/dist/components/fields/DatePicker/DatePickerSegment.js +49 -39
  201. package/dist/components/fields/DatePicker/DatePickerSegment.js.map +1 -1
  202. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  203. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  204. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  205. package/dist/components/fields/DatePicker/PeriodPicker.js +5 -3
  206. package/dist/components/fields/DatePicker/PeriodPicker.js.map +1 -1
  207. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  208. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  209. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  210. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  211. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  212. package/dist/components/fields/DatePicker/period.js +1 -1
  213. package/dist/components/fields/DatePicker/props.js +1 -1
  214. package/dist/components/fields/DatePicker/utils.js +1 -1
  215. package/dist/components/fields/FileInput/FileInput.js +2 -2
  216. package/dist/components/fields/FileInput/FileInput.js.map +1 -1
  217. package/dist/components/fields/FilterListBox/FilterListBox.js +6 -8
  218. package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
  219. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  220. package/dist/components/fields/Input/Input.js +1 -1
  221. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  222. package/dist/components/fields/ListBox/ListBox.d.ts +1 -1
  223. package/dist/components/fields/ListBox/ListBox.js +49 -24
  224. package/dist/components/fields/ListBox/ListBox.js.map +1 -1
  225. package/dist/components/fields/ListBox/optionId.js +1 -1
  226. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  227. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js.map +1 -1
  228. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  229. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  230. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  231. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  232. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  233. package/dist/components/fields/Picker/Picker.js +1 -1
  234. package/dist/components/fields/RadioGroup/Radio.js +91 -96
  235. package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
  236. package/dist/components/fields/RadioGroup/RadioGroup.js +3 -3
  237. package/dist/components/fields/RadioGroup/RadioGroup.js.map +1 -1
  238. package/dist/components/fields/RadioGroup/context.js +1 -1
  239. package/dist/components/fields/SearchComboBox/SearchComboBox.d.ts +1 -1
  240. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  241. package/dist/components/fields/SearchComboBox/SearchComboBox.js.map +1 -1
  242. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  243. package/dist/components/fields/Select/Select.d.ts +1 -1
  244. package/dist/components/fields/Select/Select.js +3 -3
  245. package/dist/components/fields/Select/Select.js.map +1 -1
  246. package/dist/components/fields/Slider/Gradation.js +1 -1
  247. package/dist/components/fields/Slider/HueSlider.js +3 -3
  248. package/dist/components/fields/Slider/HueSlider.js.map +1 -1
  249. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  250. package/dist/components/fields/Slider/Slider.js +1 -1
  251. package/dist/components/fields/Slider/SliderBase.js +4 -6
  252. package/dist/components/fields/Slider/SliderBase.js.map +1 -1
  253. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  254. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  255. package/dist/components/fields/Slider/elements.js +7 -6
  256. package/dist/components/fields/Slider/elements.js.map +1 -1
  257. package/dist/components/fields/Slider/index.js +1 -1
  258. package/dist/components/fields/Switch/Switch.js +3 -3
  259. package/dist/components/fields/Switch/Switch.js.map +1 -1
  260. package/dist/components/fields/TagInput/TagInput.d.ts +1 -1
  261. package/dist/components/fields/TagInput/TagInput.js +1 -1
  262. package/dist/components/fields/TagInput/TagInput.js.map +1 -1
  263. package/dist/components/fields/TagInput/TagList.js +3 -3
  264. package/dist/components/fields/TagInput/TagList.js.map +1 -1
  265. package/dist/components/fields/TagInput/useActiveOption.js +1 -1
  266. package/dist/components/fields/TagInput/useTagError.js +1 -1
  267. package/dist/components/fields/TextArea/TextArea.js +1 -1
  268. package/dist/components/fields/TextInput/TextInput.js +1 -1
  269. package/dist/components/fields/TextInput/TextInputBase.js +3 -6
  270. package/dist/components/fields/TextInput/TextInputBase.js.map +1 -1
  271. package/dist/components/fields/TextInput/displayed-validation.js +1 -1
  272. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
  273. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  274. package/dist/components/fields/TriggerActions.js +1 -1
  275. package/dist/components/fields/color/ColorPanel.js +2 -2
  276. package/dist/components/fields/color/ColorPanel.js.map +1 -1
  277. package/dist/components/fields/color/channels.js +1 -1
  278. package/dist/components/fields/color/color.js +1 -1
  279. package/dist/components/fields/color/context.js +1 -1
  280. package/dist/components/fields/option-origin-press.js +1 -1
  281. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  282. package/dist/components/form/FieldWrapper/field-description.js +1 -1
  283. package/dist/components/form/Form/Field.js +1 -1
  284. package/dist/components/form/Form/Form.js +1 -1
  285. package/dist/components/form/Form/ModernFormRoot.js +1 -1
  286. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  287. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  288. package/dist/components/form/Form/SubmitError.js +1 -1
  289. package/dist/components/form/Form/backend.js +1 -1
  290. package/dist/components/form/Form/index.js +1 -1
  291. package/dist/components/form/Form/modern/actions.js +1 -1
  292. package/dist/components/form/Form/modern/context.js +1 -1
  293. package/dist/components/form/Form/modern/controller.js +1 -1
  294. package/dist/components/form/Form/modern/field-binding.js +1 -1
  295. package/dist/components/form/Form/modern/field.js +1 -1
  296. package/dist/components/form/Form/modern/react.js +1 -1
  297. package/dist/components/form/Form/modern/store.js +1 -1
  298. package/dist/components/form/Form/modern/validation.js +1 -1
  299. package/dist/components/form/Form/modern/values.js +1 -1
  300. package/dist/components/form/Form/reset-unbound-controls.js +1 -1
  301. package/dist/components/form/Form/use-field/use-field-binding.js +1 -1
  302. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  303. package/dist/components/form/Form/use-field/use-field.js +1 -1
  304. package/dist/components/form/Form/use-form.js +1 -1
  305. package/dist/components/form/Form/validation.js +1 -1
  306. package/dist/components/form/Label.js +1 -1
  307. package/dist/components/form/field-chrome.js +1 -1
  308. package/dist/components/form/legacy-tooltip.js +1 -1
  309. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  310. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  311. package/dist/components/form/validation/use-validation-props.js +1 -1
  312. package/dist/components/form/wrapper.js +1 -1
  313. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  314. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  315. package/dist/components/layout/Flex.js +1 -1
  316. package/dist/components/layout/Flow.js +1 -1
  317. package/dist/components/layout/Grid.js +1 -1
  318. package/dist/components/layout/Panel.js +13 -38
  319. package/dist/components/layout/Panel.js.map +1 -1
  320. package/dist/components/layout/Prefix.js +1 -1
  321. package/dist/components/layout/ResizablePanel.js +24 -20
  322. package/dist/components/layout/ResizablePanel.js.map +1 -1
  323. package/dist/components/layout/Space.js +1 -1
  324. package/dist/components/layout/Suffix.js +1 -1
  325. package/dist/components/navigation/Pagination/Pagination.js +2 -2
  326. package/dist/components/navigation/Pagination/Pagination.js.map +1 -1
  327. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  328. package/dist/components/navigation/Tabs/BoardDragActiveProvider.js +1 -1
  329. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  330. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  331. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  332. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  333. package/dist/components/navigation/Tabs/TabPicker.js +62 -68
  334. package/dist/components/navigation/Tabs/TabPicker.js.map +1 -1
  335. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  336. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  337. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  338. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  339. package/dist/components/navigation/Tabs/styled.js +13 -12
  340. package/dist/components/navigation/Tabs/styled.js.map +1 -1
  341. package/dist/components/navigation/Tabs/types.js +1 -1
  342. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  343. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  344. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  345. package/dist/components/other/Calendar/Calendar.js +1 -1
  346. package/dist/components/other/Calendar/CalendarCell.js +6 -6
  347. package/dist/components/other/Calendar/CalendarCell.js.map +1 -1
  348. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  349. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  350. package/dist/components/other/Calendar/CalendarPanel.js +3 -3
  351. package/dist/components/other/Calendar/CalendarPanel.js.map +1 -1
  352. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  353. package/dist/components/other/Calendar/PeriodGrid.js +6 -6
  354. package/dist/components/other/Calendar/PeriodGrid.js.map +1 -1
  355. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  356. package/dist/components/other/Calendar/styled.js +4 -4
  357. package/dist/components/other/Calendar/styled.js.map +1 -1
  358. package/dist/components/other/CubeLogo/CubeLogo.js +3 -4
  359. package/dist/components/other/CubeLogo/CubeLogo.js.map +1 -1
  360. package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
  361. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  362. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  363. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  364. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  365. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  366. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  367. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  368. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  369. package/dist/components/overlays/Dialog/DialogTrigger.js.map +1 -1
  370. package/dist/components/overlays/Dialog/ModernDialogForm.js +1 -1
  371. package/dist/components/overlays/Dialog/context.js +1 -1
  372. package/dist/components/overlays/Dialog/default-button-text.js +1 -1
  373. package/dist/components/overlays/Dialog/use-content-overflow.js +1 -1
  374. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  375. package/dist/components/overlays/Dialog/use-dialog-open-sync.js +1 -1
  376. package/dist/components/overlays/Dialog/use-retained-dialog-focus.js +1 -1
  377. package/dist/components/overlays/Modal/Modal.js +1 -1
  378. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  379. package/dist/components/overlays/Modal/Overlay.js +1 -1
  380. package/dist/components/overlays/Modal/Popover.js +1 -1
  381. package/dist/components/overlays/Modal/Popover.js.map +1 -1
  382. package/dist/components/overlays/Modal/Tray.js +4 -5
  383. package/dist/components/overlays/Modal/Tray.js.map +1 -1
  384. package/dist/components/overlays/Modal/Underlay.js +1 -1
  385. package/dist/components/overlays/Modal/modal-containment.js +1 -1
  386. package/dist/components/overlays/Notifications/Notification.js +1 -1
  387. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  388. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  389. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  390. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  391. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  392. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  393. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  394. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  395. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  396. package/dist/components/overlays/Notifications/index.js +1 -1
  397. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  398. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  399. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  400. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  401. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  402. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  403. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  404. package/dist/components/overlays/Toast/index.js +1 -1
  405. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  406. package/dist/components/overlays/Toast/useToast.js +1 -1
  407. package/dist/components/overlays/Tooltip/Tooltip.js +8 -6
  408. package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
  409. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  410. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  411. package/dist/components/overlays/Tooltip/context.js +1 -1
  412. package/dist/components/overlays/Tooltip/split-trigger-props.js +1 -1
  413. package/dist/components/portal/Portal.js +1 -1
  414. package/dist/components/portal/PortalProvider.js +1 -1
  415. package/dist/components/portal/usePortal.js +1 -1
  416. package/dist/components/shared/DraggableCollection.js +1 -1
  417. package/dist/components/shared/InvalidIcon.js +1 -1
  418. package/dist/components/shared/ValidIcon.js +1 -1
  419. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  420. package/dist/components/status/Spin/Cube.js +1 -1
  421. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  422. package/dist/components/status/Spin/Spin.js +1 -1
  423. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  424. package/dist/data/item-themes.js +27 -27
  425. package/dist/data/item-themes.js.map +1 -1
  426. package/dist/data/themes.js +1 -1
  427. package/dist/eslint-plugin/defaults.generated.js +2 -2
  428. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  429. package/dist/eslint-plugin/index.js +1 -1
  430. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  431. package/dist/i18n/I18nProvider.js +1 -1
  432. package/dist/i18n/createFormatter.js +1 -1
  433. package/dist/i18n/index.js +1 -1
  434. package/dist/i18n/instance.js +1 -1
  435. package/dist/i18n/locales/de-DE/uikit.js +1 -1
  436. package/dist/i18n/locales/en-US/uikit.js +1 -1
  437. package/dist/i18n/locales/es-ES/uikit.js +1 -1
  438. package/dist/i18n/locales/es-MX/uikit.js +1 -1
  439. package/dist/i18n/locales/fr-FR/uikit.js +1 -1
  440. package/dist/i18n/locales/it-IT/uikit.js +1 -1
  441. package/dist/i18n/locales/ja-JP/uikit.js +1 -1
  442. package/dist/i18n/locales/nb-NO/uikit.js +1 -1
  443. package/dist/i18n/locales/pt-BR/uikit.js +1 -1
  444. package/dist/i18n/locales/pt-PT/uikit.js +1 -1
  445. package/dist/i18n/locales/sv-SE/uikit.js +1 -1
  446. package/dist/i18n/locales/vi-VN/uikit.js +1 -1
  447. package/dist/i18n/locales.js +1 -1
  448. package/dist/i18n/namespace.js +1 -1
  449. package/dist/i18n/useFormatter.js +1 -1
  450. package/dist/i18n/useI18n.js +1 -1
  451. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  452. package/dist/icons/AdjustmentsIcon.js +1 -1
  453. package/dist/icons/AiIcon.js +1 -1
  454. package/dist/icons/AreaChartIcon.js +1 -1
  455. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  456. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  457. package/dist/icons/BackwardIcon.js +1 -1
  458. package/dist/icons/BarChartIcon.js +1 -1
  459. package/dist/icons/BellFilledIcon.js +1 -1
  460. package/dist/icons/BellIcon.js +1 -1
  461. package/dist/icons/BooleanIcon.js +1 -1
  462. package/dist/icons/CalendarEditIcon.js +1 -1
  463. package/dist/icons/CalendarIcon.js +1 -1
  464. package/dist/icons/CaretDownIcon.js +1 -1
  465. package/dist/icons/CaretUpIcon.js +1 -1
  466. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  467. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  468. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  469. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  470. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  471. package/dist/icons/ChartBarLineIcon.js +1 -1
  472. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  473. package/dist/icons/ChartBarStackedIcon.js +1 -1
  474. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  475. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  476. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  477. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  478. package/dist/icons/ChartBubbleIcon.js +1 -1
  479. package/dist/icons/ChartDonut2Icon.js +1 -1
  480. package/dist/icons/ChartFunnelIcon.js +1 -1
  481. package/dist/icons/ChartHeatmapIcon.js +1 -1
  482. package/dist/icons/ChartKPIIcon.js +1 -1
  483. package/dist/icons/ChartPie2Icon.js +1 -1
  484. package/dist/icons/ChartScatterIcon.js +1 -1
  485. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  486. package/dist/icons/CheckCircleIcon.js +1 -1
  487. package/dist/icons/CheckIcon.js +1 -1
  488. package/dist/icons/CircleFilledIcon.js +1 -1
  489. package/dist/icons/ClearIcon.js +1 -1
  490. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  491. package/dist/icons/CloseCircleIcon.js +1 -1
  492. package/dist/icons/CloseIcon.js +1 -1
  493. package/dist/icons/CodeIcon.js +1 -1
  494. package/dist/icons/ColumnTotalIcon.js +1 -1
  495. package/dist/icons/CopyIcon.js +1 -1
  496. package/dist/icons/CountIcon.js +1 -1
  497. package/dist/icons/CubeIcon.js +1 -1
  498. package/dist/icons/CubePauseIcon.js +1 -1
  499. package/dist/icons/CubePlayIcon.js +1 -1
  500. package/dist/icons/CurrencyDollarIcon.js +1 -1
  501. package/dist/icons/DangerIcon.js +1 -1
  502. package/dist/icons/DashboardIcon.js +1 -1
  503. package/dist/icons/DatabaseIcon.js +1 -1
  504. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  505. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  506. package/dist/icons/DirectionIcon.js +1 -1
  507. package/dist/icons/DonutIcon.js +1 -1
  508. package/dist/icons/DownIcon.js +1 -1
  509. package/dist/icons/EditIcon.js +1 -1
  510. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  511. package/dist/icons/ExclamationCircleIcon.js +1 -1
  512. package/dist/icons/ExclamationIcon.js +1 -1
  513. package/dist/icons/EyeIcon.js +1 -1
  514. package/dist/icons/EyeInvisibleIcon.js +1 -1
  515. package/dist/icons/FilterIcon.js +1 -1
  516. package/dist/icons/FolderFilledIcon.js +1 -1
  517. package/dist/icons/FolderIcon.js +1 -1
  518. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  519. package/dist/icons/FolderOpenIcon.js +1 -1
  520. package/dist/icons/ForwardIcon.js +1 -1
  521. package/dist/icons/GripVerticalIcon.js +1 -1
  522. package/dist/icons/HierarchyIcon.js +1 -1
  523. package/dist/icons/HierarchyOpenIcon.js +1 -1
  524. package/dist/icons/Icon.js +21 -38
  525. package/dist/icons/Icon.js.map +1 -1
  526. package/dist/icons/InfoCircleIcon.js +1 -1
  527. package/dist/icons/InfoIcon.js +1 -1
  528. package/dist/icons/KeyIcon.js +1 -1
  529. package/dist/icons/LeftIcon.js +1 -1
  530. package/dist/icons/LineChartIcon.js +1 -1
  531. package/dist/icons/LoadingIcon.js +1 -1
  532. package/dist/icons/LockFilledIcon.js +1 -1
  533. package/dist/icons/LockIcon.js +1 -1
  534. package/dist/icons/MoreIcon.js +1 -1
  535. package/dist/icons/NotAllowedIcon.js +1 -1
  536. package/dist/icons/Number123Icon.js +1 -1
  537. package/dist/icons/NumberIcon.js +1 -1
  538. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  539. package/dist/icons/PauseCircleIcon.js +1 -1
  540. package/dist/icons/PauseIcon.js +1 -1
  541. package/dist/icons/PercentageIcon.js +1 -1
  542. package/dist/icons/PieChartIcon.js +1 -1
  543. package/dist/icons/PipetteIcon.js +1 -1
  544. package/dist/icons/PlayCircleIcon.js +1 -1
  545. package/dist/icons/PlayIcon.js +1 -1
  546. package/dist/icons/PlusIcon.js +1 -1
  547. package/dist/icons/ProgressBarIcon.js +1 -1
  548. package/dist/icons/ReloadIcon.js +1 -1
  549. package/dist/icons/ReportIcon.js +1 -1
  550. package/dist/icons/ReturnIcon.js +1 -1
  551. package/dist/icons/RightIcon.js +1 -1
  552. package/dist/icons/RowTotalsIcon.js +1 -1
  553. package/dist/icons/SchemeIcon.js +1 -1
  554. package/dist/icons/SearchIcon.js +1 -1
  555. package/dist/icons/SemanticQueryIcon.js +1 -1
  556. package/dist/icons/SettingsIcon.js +1 -1
  557. package/dist/icons/ShieldFilledIcon.js +1 -1
  558. package/dist/icons/ShieldIcon.js +1 -1
  559. package/dist/icons/SlashIcon.js +1 -1
  560. package/dist/icons/SparklesIcon.js +1 -1
  561. package/dist/icons/SqlIcon.js +1 -1
  562. package/dist/icons/StatsIcon.js +1 -1
  563. package/dist/icons/StopIcon.js +1 -1
  564. package/dist/icons/StringIcon.js +1 -1
  565. package/dist/icons/SubtotalsIcon.js +1 -1
  566. package/dist/icons/SwitchIcon.js +1 -1
  567. package/dist/icons/TableIcon.js +1 -1
  568. package/dist/icons/ThumbsDownIcon.js +1 -1
  569. package/dist/icons/ThumbsUpIcon.js +1 -1
  570. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  571. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  572. package/dist/icons/ThunderboltIcon.js +1 -1
  573. package/dist/icons/TimeIcon.js +1 -1
  574. package/dist/icons/TrashIcon.js +1 -1
  575. package/dist/icons/UnlockIcon.js +1 -1
  576. package/dist/icons/UpIcon.js +1 -1
  577. package/dist/icons/UserGroupIcon.js +1 -1
  578. package/dist/icons/UserIcon.js +1 -1
  579. package/dist/icons/UserLockIcon.js +1 -1
  580. package/dist/icons/ViewIcon.js +1 -1
  581. package/dist/icons/WarningFilledIcon.js +1 -1
  582. package/dist/icons/WarningIcon.js +1 -1
  583. package/dist/icons/wrap-icon.js +1 -1
  584. package/dist/index.js +1 -1
  585. package/dist/probe/canonicalize.js +1 -1
  586. package/dist/probe/css.js +1 -1
  587. package/dist/probe/index.js +1 -1
  588. package/dist/provider.js +1 -1
  589. package/dist/providers/TrackingProvider.js +1 -1
  590. package/dist/providers/navigation-url.js +1 -1
  591. package/dist/providers/navigationAdapter.default.js +1 -1
  592. package/dist/providers/use-navigation.js +1 -1
  593. package/dist/tokens/all-tokens.js +1 -1
  594. package/dist/tokens/base.js +8 -2
  595. package/dist/tokens/base.js.map +1 -1
  596. package/dist/tokens/color-seed.js +1 -1
  597. package/dist/tokens/color-theme.js +1 -1
  598. package/dist/tokens/colors.js +1 -1
  599. package/dist/tokens/layout.js +1 -1
  600. package/dist/tokens/lazy-styles.js +1 -1
  601. package/dist/tokens/legacy-color.js +1 -1
  602. package/dist/tokens/palette-config.js +1 -1
  603. package/dist/tokens/palette.js +1 -1
  604. package/dist/tokens/resolve.js +1 -1
  605. package/dist/tokens/shadows.d.ts +0 -1
  606. package/dist/tokens/shadows.js +2 -3
  607. package/dist/tokens/shadows.js.map +1 -1
  608. package/dist/tokens/sizes.js +1 -1
  609. package/dist/tokens/spacing.js +1 -1
  610. package/dist/tokens/typography.js +1 -1
  611. package/dist/utils/ResizeSensor.js +1 -1
  612. package/dist/utils/colors.js +1 -1
  613. package/dist/utils/dotize.js +1 -1
  614. package/dist/utils/is-dev-env.js +1 -1
  615. package/dist/utils/modules.js +1 -1
  616. package/dist/utils/promise.js +1 -1
  617. package/dist/utils/raf.js +1 -1
  618. package/dist/utils/random.js +1 -1
  619. package/dist/utils/range.js +1 -1
  620. package/dist/utils/react/RenderCache.js +1 -1
  621. package/dist/utils/react/Slots.js +1 -1
  622. package/dist/utils/react/chain.js +1 -1
  623. package/dist/utils/react/disabledProps.js +1 -1
  624. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  625. package/dist/utils/react/index.js +1 -1
  626. package/dist/utils/react/interactions.js +1 -1
  627. package/dist/utils/react/isTextOnly.js +1 -1
  628. package/dist/utils/react/mapProps.js +1 -1
  629. package/dist/utils/react/mergeProps.js +1 -1
  630. package/dist/utils/react/nullableValue.js +1 -1
  631. package/dist/utils/react/overlayKeyPropagation.js +1 -1
  632. package/dist/utils/react/programmaticFocus.js +1 -1
  633. package/dist/utils/react/resolveIcon.js +1 -1
  634. package/dist/utils/react/sharedStore.js +1 -1
  635. package/dist/utils/react/useBufferedValue.js +1 -1
  636. package/dist/utils/react/useCombinedRefs.js +1 -1
  637. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  638. package/dist/utils/react/useEventBus.js +1 -1
  639. package/dist/utils/react/useId.js +1 -1
  640. package/dist/utils/react/useIsDarwin.js +1 -1
  641. package/dist/utils/react/useKeySymbols.js +1 -1
  642. package/dist/utils/react/useLayoutEffect.js +1 -1
  643. package/dist/utils/react/useLocalStorage.js +1 -1
  644. package/dist/utils/react/useMergeStyles.js +1 -1
  645. package/dist/utils/react/useOverlayEscapeGuard.js +1 -1
  646. package/dist/utils/react/usePopoverSync.js +1 -1
  647. package/dist/utils/react/useQaProps.js +1 -1
  648. package/dist/utils/react/useScheme.js +1 -1
  649. package/dist/utils/react/useViewportSize.js +1 -1
  650. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  651. package/dist/utils/selection.js +1 -1
  652. package/dist/utils/styles.js +1 -1
  653. package/dist/utils/tree.js +1 -1
  654. package/dist/utils/warnings.js +1 -1
  655. package/dist/version.js +3 -3
  656. package/docs/BaseProperties.md +2 -0
  657. package/docs/ComplexLayout.md +1 -1
  658. package/docs/Usage.md +45 -2
  659. package/docs/Utilities.md +5 -2
  660. package/docs/components/GridProvider.md +3 -3
  661. package/docs/components/content/Layout.md +1 -1
  662. package/docs/components/fields/ComboBox.md +1 -1
  663. package/docs/components/fields/CommandTextArea.md +1 -1
  664. package/docs/components/fields/FilterListBox.md +1 -1
  665. package/docs/components/fields/FilterPicker.md +1 -1
  666. package/docs/components/fields/ListBox.md +2 -2
  667. package/docs/components/fields/Picker.md +1 -1
  668. package/docs/components/fields/SearchComboBox.md +1 -1
  669. package/docs/components/fields/Select.md +1 -1
  670. package/docs/components/fields/TagInput.md +1 -1
  671. package/docs/tasty/react-api.md +1 -1
  672. package/package.json +3 -3
  673. package/tasty.config.ts +153 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Skeleton.js","names":["BaseProps","ContainerStyleProps","ReactNode","useI18n","Flow","CubeGridProps","Grid","Space","CubePlaceholderProps","Placeholder","PlaceholderGroupContext","LAYOUT_MAP","page","lines","children","isStatic","rootProps","CubeSkeletonLayoutProps","Array","fill","map","item","i","content","topbar","menu","stats","cards","tabs","table","rows","columns","j","chart","heightMap","const","CubeSkeletonProps","CubeSkeletonRootProps","Omit","layout","Skeleton","t0","props","t","qa","role"],"sources":["../../../../src/components/content/Skeleton/Skeleton.tsx"],"sourcesContent":["import { BaseProps, ContainerStyleProps } from '@tenphi/tasty';\nimport { ReactNode } from 'react';\n\nimport { useI18n } from '../../../i18n';\nimport { Flow } from '../../layout/Flow';\nimport { CubeGridProps, Grid } from '../../layout/Grid';\nimport { Space } from '../../layout/Space';\nimport {\n CubePlaceholderProps,\n Placeholder,\n PlaceholderGroupContext,\n} from '../Placeholder/Placeholder';\n\nconst LAYOUT_MAP = {\n page({\n lines,\n children,\n isStatic = false,\n rootProps,\n }: CubeSkeletonLayoutProps) {\n return (\n <Flow gap=\"4x\" {...rootProps}>\n <Space placeContent=\"space-between\">\n <Placeholder isStatic={isStatic} width=\"100px 25% 300px\" />\n <Placeholder isStatic={isStatic} width=\"50px 10% 150px\" />\n </Space>\n <Flow gap=\"2x\">\n {children ||\n Array(lines || 5)\n .fill(0)\n .map((item, i) => <Placeholder key={i} isStatic={isStatic} />)}\n </Flow>\n </Flow>\n );\n },\n content({\n children,\n lines,\n isStatic = false,\n rootProps,\n }: CubeSkeletonLayoutProps) {\n return (\n <Flow gap=\"2x\" {...rootProps}>\n {children ||\n Array(lines || 5)\n .fill(0)\n .map((item, i) => <Placeholder key={i} isStatic={isStatic} />)}\n </Flow>\n );\n },\n topbar({ isStatic = false, rootProps }: CubeSkeletonLayoutProps) {\n return (\n <Space\n gap=\"4x\"\n placeContent=\"space-between\"\n height=\"6x\"\n padding=\"1x\"\n border=\"bottom\"\n {...rootProps}\n >\n <Space>\n <Placeholder circle isStatic={isStatic} size=\"4x\" />\n <Placeholder isStatic={isStatic} width=\"20x\" />\n </Space>\n\n <Space>\n <Placeholder isStatic={isStatic} width=\"10x\" />\n <Placeholder circle isStatic={isStatic} size=\"4x\" />\n </Space>\n </Space>\n );\n },\n menu({ lines, isStatic = false, rootProps }: CubeSkeletonLayoutProps) {\n return (\n <Flow gap=\"3.25x\" padding=\"3x 1x\" {...rootProps}>\n {Array(lines || 5)\n .fill(0)\n .map((item, i) => (\n <Placeholder key={i} isStatic={isStatic} />\n ))}\n </Flow>\n );\n },\n stats({ cards, isStatic = false, rootProps }: CubeSkeletonLayoutProps) {\n return (\n <Space gap=\"4x\" {...rootProps}>\n {Array(cards || 3)\n .fill(0)\n .map((item, i) => (\n <Placeholder\n key={i}\n isStatic={isStatic}\n radius=\"1r\"\n width=\"20x\"\n height=\"12x\"\n flexGrow={1}\n />\n ))}\n </Space>\n );\n },\n tabs({\n tabs,\n children,\n lines,\n isStatic = false,\n rootProps,\n }: CubeSkeletonLayoutProps) {\n return (\n <Flow gap=\"4x\" {...rootProps}>\n <Space>\n {Array(tabs || 3)\n .fill(0)\n .map((item, i) => (\n <Placeholder key={i} isStatic={isStatic} width=\"15x\" />\n ))}\n </Space>\n <Flow gap=\"2x\">\n {children ||\n Array(lines || 5)\n .fill(0)\n .map((item, i) => <Placeholder key={i} isStatic={isStatic} />)}\n </Flow>\n </Flow>\n );\n },\n table({\n rows,\n columns,\n isStatic = false,\n rootProps,\n }: CubeSkeletonLayoutProps) {\n columns = columns || 5;\n rows = rows || 5;\n\n return (\n <Grid\n columns={`repeat(${columns}, 1fr)`}\n gap=\"3x\"\n padding=\"1x 0\"\n {...rootProps}\n >\n {Array(rows)\n .fill(0)\n .map((item, i) => {\n return Array(columns)\n .fill(0)\n .map((item, j) => {\n return (\n <Placeholder\n key={`${i}.${j}`}\n isStatic={isStatic}\n size={!i ? '3x' : '2x'}\n />\n );\n });\n })}\n </Grid>\n );\n },\n chart({ columns, isStatic = false, rootProps }: CubeSkeletonLayoutProps) {\n columns = columns || 12;\n\n const heightMap = [1, 4, 2, 5, 8, 9, 5, 3, 4, 2, 6, 7, 2];\n\n return (\n <Grid\n columns={`repeat(${columns}, 1fr)`}\n gap=\"3x\"\n padding=\"1x 0\"\n placeItems=\"end stretch\"\n height=\"40x\"\n {...rootProps}\n >\n {Array(columns)\n .fill(0)\n .map((item, i) => {\n return (\n <Placeholder\n key={i}\n isStatic={isStatic}\n height={`${heightMap[i % 12] * 10}%`}\n width=\"max 6x\"\n />\n );\n })}\n </Grid>\n );\n },\n} as const;\n\nexport interface CubeSkeletonProps\n extends CubeSkeletonRootProps, Omit<CubeSkeletonLayoutProps, 'rootProps'> {\n /** The type of the layout */\n layout?: keyof typeof LAYOUT_MAP;\n}\n\nexport interface CubeSkeletonRootProps\n extends\n Omit<CubeGridProps, 'columns' | 'rows'>,\n CubePlaceholderProps,\n BaseProps,\n ContainerStyleProps {}\n\nexport interface CubeSkeletonLayoutProps {\n /** The number of columns for the table layout */\n columns?: number;\n /** The number of rows for the table layout */\n rows?: number;\n /** The number of placeholder lines */\n lines?: number;\n /** The number of tabs */\n tabs?: number;\n /** The number of cards */\n cards?: number;\n /** The static mode */\n isStatic?: boolean;\n rootProps?: CubeSkeletonRootProps;\n children?: ReactNode;\n}\n\nexport function Skeleton({\n layout,\n isStatic,\n columns,\n rows,\n lines,\n tabs,\n cards,\n children,\n ...props\n}: CubeSkeletonProps) {\n const { t } = useI18n();\n\n layout = layout || 'page';\n\n // One \"Content is loading\" region for the whole layout, rather than one per\n // bar: a page skeleton would otherwise list a dozen identical landmarks.\n return LAYOUT_MAP[layout] ? (\n <PlaceholderGroupContext.Provider value>\n {LAYOUT_MAP[layout]({\n isStatic,\n columns,\n rows,\n lines,\n tabs,\n cards,\n children,\n rootProps: {\n qa: 'Skeleton',\n role: 'region',\n 'aria-label': t('placeholder.contentIsLoading', 'Content is loading'),\n ...props,\n },\n })}\n </PlaceholderGroupContext.Provider>\n ) : (\n <Placeholder qa=\"Skeleton\" isStatic={isStatic} {...props}>\n {children}\n </Placeholder>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Skeleton.js","names":["BaseProps","ContainerStyleProps","ReactNode","useI18n","Flow","CubeGridProps","Grid","Space","CubePlaceholderProps","Placeholder","PlaceholderGroupContext","LAYOUT_MAP","page","lines","children","isStatic","rootProps","CubeSkeletonLayoutProps","Array","fill","map","item","i","content","topbar","menu","stats","cards","tabs","table","rows","columns","j","chart","heightMap","const","CubeSkeletonProps","CubeSkeletonRootProps","Omit","layout","Skeleton","t0","props","t","qa","role"],"sources":["../../../../src/components/content/Skeleton/Skeleton.tsx"],"sourcesContent":["import { BaseProps, ContainerStyleProps } from '@tenphi/tasty';\nimport { ReactNode } from 'react';\n\nimport { useI18n } from '../../../i18n';\nimport { Flow } from '../../layout/Flow';\nimport { CubeGridProps, Grid } from '../../layout/Grid';\nimport { Space } from '../../layout/Space';\nimport {\n CubePlaceholderProps,\n Placeholder,\n PlaceholderGroupContext,\n} from '../Placeholder/Placeholder';\n\nconst LAYOUT_MAP = {\n page({\n lines,\n children,\n isStatic = false,\n rootProps,\n }: CubeSkeletonLayoutProps) {\n return (\n <Flow gap=\"4x\" {...rootProps}>\n <Space placeContent=\"space-between\">\n {/* oxlint-disable-next-line tasty/consistent-token-usage -- placeholder widths imitate text of varying length, not layout dimensions */}\n <Placeholder isStatic={isStatic} width=\"100px 25% 300px\" />\n {/* oxlint-disable-next-line tasty/consistent-token-usage -- placeholder widths imitate text of varying length, not layout dimensions */}\n <Placeholder isStatic={isStatic} width=\"50px 10% 150px\" />\n </Space>\n <Flow gap=\"2x\">\n {children ||\n Array(lines || 5)\n .fill(0)\n .map((item, i) => <Placeholder key={i} isStatic={isStatic} />)}\n </Flow>\n </Flow>\n );\n },\n content({\n children,\n lines,\n isStatic = false,\n rootProps,\n }: CubeSkeletonLayoutProps) {\n return (\n <Flow gap=\"2x\" {...rootProps}>\n {children ||\n Array(lines || 5)\n .fill(0)\n .map((item, i) => <Placeholder key={i} isStatic={isStatic} />)}\n </Flow>\n );\n },\n topbar({ isStatic = false, rootProps }: CubeSkeletonLayoutProps) {\n return (\n <Space\n gap=\"4x\"\n placeContent=\"space-between\"\n height=\"6x\"\n padding=\"1x\"\n border=\"bottom\"\n {...rootProps}\n >\n <Space>\n <Placeholder circle isStatic={isStatic} size=\"4x\" />\n <Placeholder isStatic={isStatic} width=\"20x\" />\n </Space>\n\n <Space>\n <Placeholder isStatic={isStatic} width=\"10x\" />\n <Placeholder circle isStatic={isStatic} size=\"4x\" />\n </Space>\n </Space>\n );\n },\n menu({ lines, isStatic = false, rootProps }: CubeSkeletonLayoutProps) {\n return (\n <Flow gap=\"3.25x\" padding=\"3x 1x\" {...rootProps}>\n {Array(lines || 5)\n .fill(0)\n .map((item, i) => (\n <Placeholder key={i} isStatic={isStatic} />\n ))}\n </Flow>\n );\n },\n stats({ cards, isStatic = false, rootProps }: CubeSkeletonLayoutProps) {\n return (\n <Space gap=\"4x\" {...rootProps}>\n {Array(cards || 3)\n .fill(0)\n .map((item, i) => (\n <Placeholder\n key={i}\n isStatic={isStatic}\n radius=\"1r\"\n width=\"20x\"\n height=\"12x\"\n flexGrow={1}\n />\n ))}\n </Space>\n );\n },\n tabs({\n tabs,\n children,\n lines,\n isStatic = false,\n rootProps,\n }: CubeSkeletonLayoutProps) {\n return (\n <Flow gap=\"4x\" {...rootProps}>\n <Space>\n {Array(tabs || 3)\n .fill(0)\n .map((item, i) => (\n <Placeholder key={i} isStatic={isStatic} width=\"15x\" />\n ))}\n </Space>\n <Flow gap=\"2x\">\n {children ||\n Array(lines || 5)\n .fill(0)\n .map((item, i) => <Placeholder key={i} isStatic={isStatic} />)}\n </Flow>\n </Flow>\n );\n },\n table({\n rows,\n columns,\n isStatic = false,\n rootProps,\n }: CubeSkeletonLayoutProps) {\n columns = columns || 5;\n rows = rows || 5;\n\n return (\n <Grid\n columns={`repeat(${columns}, 1fr)`}\n gap=\"3x\"\n padding=\"1x 0\"\n {...rootProps}\n >\n {Array(rows)\n .fill(0)\n .map((item, i) => {\n return Array(columns)\n .fill(0)\n .map((item, j) => {\n return (\n <Placeholder\n key={`${i}.${j}`}\n isStatic={isStatic}\n size={!i ? '3x' : '2x'}\n />\n );\n });\n })}\n </Grid>\n );\n },\n chart({ columns, isStatic = false, rootProps }: CubeSkeletonLayoutProps) {\n columns = columns || 12;\n\n const heightMap = [1, 4, 2, 5, 8, 9, 5, 3, 4, 2, 6, 7, 2];\n\n return (\n <Grid\n columns={`repeat(${columns}, 1fr)`}\n gap=\"3x\"\n padding=\"1x 0\"\n placeItems=\"end stretch\"\n height=\"40x\"\n {...rootProps}\n >\n {Array(columns)\n .fill(0)\n .map((item, i) => {\n return (\n <Placeholder\n key={i}\n isStatic={isStatic}\n height={`${heightMap[i % 12] * 10}%`}\n width=\"max 6x\"\n />\n );\n })}\n </Grid>\n );\n },\n} as const;\n\nexport interface CubeSkeletonProps\n extends CubeSkeletonRootProps, Omit<CubeSkeletonLayoutProps, 'rootProps'> {\n /** The type of the layout */\n layout?: keyof typeof LAYOUT_MAP;\n}\n\nexport interface CubeSkeletonRootProps\n extends\n Omit<CubeGridProps, 'columns' | 'rows'>,\n CubePlaceholderProps,\n BaseProps,\n ContainerStyleProps {}\n\nexport interface CubeSkeletonLayoutProps {\n /** The number of columns for the table layout */\n columns?: number;\n /** The number of rows for the table layout */\n rows?: number;\n /** The number of placeholder lines */\n lines?: number;\n /** The number of tabs */\n tabs?: number;\n /** The number of cards */\n cards?: number;\n /** The static mode */\n isStatic?: boolean;\n rootProps?: CubeSkeletonRootProps;\n children?: ReactNode;\n}\n\nexport function Skeleton({\n layout,\n isStatic,\n columns,\n rows,\n lines,\n tabs,\n cards,\n children,\n ...props\n}: CubeSkeletonProps) {\n const { t } = useI18n();\n\n layout = layout || 'page';\n\n // One \"Content is loading\" region for the whole layout, rather than one per\n // bar: a page skeleton would otherwise list a dozen identical landmarks.\n return LAYOUT_MAP[layout] ? (\n <PlaceholderGroupContext.Provider value>\n {LAYOUT_MAP[layout]({\n isStatic,\n columns,\n rows,\n lines,\n tabs,\n cards,\n children,\n rootProps: {\n qa: 'Skeleton',\n role: 'region',\n 'aria-label': t('placeholder.contentIsLoading', 'Content is loading'),\n ...props,\n },\n })}\n </PlaceholderGroupContext.Provider>\n ) : (\n <Placeholder qa=\"Skeleton\" isStatic={isStatic} {...props}>\n {children}\n </Placeholder>\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.199.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.200.0 | Cube Dev Team */
2
2
  import { mergeStyleLayers } from "../../../utils/styles.js";
3
3
  import { useI18n } from "../../../i18n/useI18n.js";
4
4
  import { Item as _Item } from "../Item/Item.js";
@@ -21,9 +21,13 @@ const TagElement = tasty(_Item, {
21
21
  },
22
22
  border: { "type=primary": "#clear" },
23
23
  "$min-inline-padding": ".5x",
24
+ overflow: {
25
+ "": "clip",
26
+ "has-end-content": "visible"
27
+ },
24
28
  Label: {
25
29
  textAlign: "center",
26
- placeSelf: "center"
30
+ placeSelf: "center stretch"
27
31
  }
28
32
  }
29
33
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Tag.js","names":["Styles","tasty","forwardRef","ItemVariant","useI18n","CloseIcon","mergeStyleLayers","CubeItemProps","Item","TagElement","qa","role","styles","padding","preset","border","Label","textAlign","placeSelf","CubeTagProps","theme","isClosable","onClose","closeButtonStyles","Tag","allProps","ref","$","_c","t","children","mods","props","t0","t1","size","undefined","type","t2","t3","color","t4","_Tag","displayName","Item","_c"],"sources":["../../../../src/components/content/Tag/Tag.tsx"],"sourcesContent":["import { Styles, tasty } from '@tenphi/tasty';\nimport { forwardRef } from 'react';\n\nimport { ItemVariant } from '../../../data/item-themes';\nimport { useI18n } from '../../../i18n';\nimport { CloseIcon } from '../../../icons/CloseIcon';\nimport { mergeStyleLayers } from '../../../utils/styles';\nimport { CubeItemProps, Item } from '../Item';\n\nconst TagElement = tasty(Item, {\n qa: 'Tag',\n role: 'status',\n styles: {\n padding: 0,\n preset: {\n '': 'tag',\n 'size=xsmall': 't4',\n 'size=small | size=medium': 't3',\n 'size=large | size=xlarge': 't2',\n },\n border: {\n // extend\n 'type=primary': '#clear',\n },\n\n '$min-inline-padding': '.5x',\n\n Label: {\n textAlign: 'center',\n placeSelf: 'center',\n },\n },\n});\n\nexport interface CubeTagProps extends CubeItemProps {\n /**\n * Visual theme. Every value but `special` is a soft card — pale fill, tinted\n * border, strong colored text. `primary` and `special` are the same brand\n * hue at two weights: `primary` is the soft card, `special` the solid fill.\n */\n theme?:\n | 'default'\n | 'primary'\n | 'danger'\n | 'success'\n | 'warning'\n | 'note'\n | 'special';\n isClosable?: boolean;\n onClose?: () => void;\n closeButtonStyles?: Styles;\n}\n\nfunction Tag(allProps: CubeTagProps, ref) {\n const { t } = useI18n();\n\n let {\n theme = 'default',\n isClosable,\n onClose,\n closeButtonStyles,\n children,\n size = 'inline',\n mods,\n ...props\n } = allProps;\n\n let type = 'card';\n\n // `special` is the SOLID brand chip, and it is spelled as the `default`\n // theme's `primary` type rather than as a theme of its own. Not a typo to be\n // tidied into `theme = 'primary'`: that is the SOFT brand card\n // (`primary.card`), which is a different weight and reachable under its own\n // name. The two are deliberately separate spellings of the same hue.\n if (theme === 'special') {\n theme = 'default';\n type = 'primary';\n }\n\n return (\n <TagElement\n ref={ref}\n size={size}\n data-type={type}\n variant={`${theme}.${type}` as ItemVariant}\n mods={mods}\n actions={\n isClosable ? (\n <Item.Action\n aria-label={t('tag.close', 'Close')}\n styles={mergeStyleLayers({ color: '#current' }, closeButtonStyles)}\n icon={<CloseIcon />}\n onPress={onClose}\n />\n ) : undefined\n }\n {...props}\n >\n {children}\n </TagElement>\n );\n}\n\nconst _Tag = forwardRef(Tag);\n\n_Tag.displayName = 'Tag';\n\nexport { _Tag as Tag };\n"],"mappings":";;;;;;;;;;AASA,MAAMS,aAAaR,MAAMO,OAAM;CAC7BE,IAAI;CACJC,MAAM;CACNC,QAAQ;EACNC,SAAS;EACTC,QAAQ;GACN,IAAI;GACJ,eAAe;GACf,4BAA4B;GAC5B,4BAA4B;EAC9B;EACAC,QAAQ,EAEN,gBAAgB,SAClB;EAEA,uBAAuB;EAEvBC,OAAO;GACLC,WAAW;GACXC,WAAW;EACb;CACF;AACF,CAAC;AAqBD,SAAAM,IAAAC,UAAAC,KAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CACE,MAAA,EAAAC,MAAczB,QAAQ;CAAE,IAAA0B;CAAA,IAAAP;CAAA,IAAAF;CAAA,IAAAU;CAAA,IAAAT;CAAA,IAAAU;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAP,EAAA,OAAAF,UAAA;EAExB,CAAA,CAAAL,OAAAa,IAAAZ,YAAAC,SAAAC,mBAAAO,UAAAK,MAAAD,IAAAH,MAAA,GAAAC,SASIP;EAASE,EAAA,KAAAF;EAAAE,EAAA,KAAAG;EAAAH,EAAA,KAAAJ;EAAAI,EAAA,KAAAN;EAAAM,EAAA,KAAAI;EAAAJ,EAAA,KAAAL;EAAAK,EAAA,KAAAK;EAAAL,EAAA,KAAAM;EAAAN,EAAA,KAAAO;CAAA,OAAA;EAAAJ,WAAAH,EAAA;EAAAJ,oBAAAI,EAAA;EAAAN,aAAAM,EAAA;EAAAI,OAAAJ,EAAA;EAAAL,UAAAK,EAAA;EAAAK,QAAAL,EAAA;EAAAM,KAAAN,EAAA;EAAAO,KAAAP,EAAA;CAAA;CARX,IAAAP,QAAAa,OAAAG,KAAAA,IAAA,YAAAH;CAKA,MAAAE,OAAAD,OAAAE,KAAAA,IAAA,WAAAF;CAKF,IAAAG,OAAW;CAOX,IAAIjB,UAAU,WAAS;EACrBA,QAAQA;EACRiB,OAAOA;CAAH;CAQO,MAAAC,KAAA,GAAGlB,MAAK,GAAIiB;CAAqB,IAAAE;CAAA,IAAAZ,EAAA,OAAAJ,qBAAAI,EAAA,QAAAN,cAAAM,EAAA,QAAAL,WAAAK,EAAA,QAAAE,GAAA;EAGxCU,KAAAlB,aACE,oBAAAuB,MAAA,QAAA;GACc,cAAAf,EAAE,aAAa,OAAO;GAC1B,QAAAvB,iBAAiB,EAAAkC,OAAS,WAAW,GAAGjB,iBAAiB;GAC3D,MAAA,oBAAC,WAAD,CAAU,CAAA;GACPD,SAAAA;EAAO,CAAA,IALpBc,KAAAA;EAOaT,EAAA,KAAAJ;EAAAI,EAAA,MAAAN;EAAAM,EAAA,MAAAL;EAAAK,EAAA,MAAAE;EAAAF,EAAA,MAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,QAAAG,YAAAH,EAAA,QAAAI,QAAAJ,EAAA,QAAAK,SAAAL,EAAA,QAAAD,OAAAC,EAAA,QAAAQ,QAAAR,EAAA,QAAAW,MAAAX,EAAA,QAAAY,MAAAZ,EAAA,QAAAU,MAAA;EAdjBI,KAAA,oBAAC,YAAD;GACOf;GACCS;GACKE,aAAAA;GACF,SAAAC;GACHP;GAEJ,SAAAQ;GAOa,GAEXP;GAEHF;EAlBQ,CAAA;EAmBEH,EAAA,MAAAG;EAAAH,EAAA,MAAAI;EAAAJ,EAAA,MAAAK;EAAAL,EAAA,MAAAD;EAAAC,EAAA,MAAAQ;EAAAR,EAAA,MAAAW;EAAAX,EAAA,MAAAY;EAAAZ,EAAA,MAAAU;EAAAV,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OAnBbc;AAmBa;AAIjB,MAAMC,OAAOxC,WAAWsB,GAAG;AAE3BkB,KAAKC,cAAc"}
1
+ {"version":3,"file":"Tag.js","names":["Styles","tasty","forwardRef","ItemVariant","useI18n","CloseIcon","mergeStyleLayers","CubeItemProps","Item","TagElement","qa","role","styles","padding","preset","border","overflow","Label","textAlign","placeSelf","CubeTagProps","theme","isClosable","onClose","closeButtonStyles","Tag","allProps","ref","$","_c","t","children","mods","props","t0","t1","size","undefined","type","t2","t3","color","t4","_Tag","displayName","Item","_c"],"sources":["../../../../src/components/content/Tag/Tag.tsx"],"sourcesContent":["import { Styles, tasty } from '@tenphi/tasty';\nimport { forwardRef } from 'react';\n\nimport { ItemVariant } from '../../../data/item-themes';\nimport { useI18n } from '../../../i18n';\nimport { CloseIcon } from '../../../icons/CloseIcon';\nimport { mergeStyleLayers } from '../../../utils/styles';\nimport { CubeItemProps, Item } from '../Item';\n\nconst TagElement = tasty(Item, {\n qa: 'Tag',\n role: 'status',\n styles: {\n padding: 0,\n preset: {\n '': 'tag',\n 'size=xsmall': 't4',\n 'size=small | size=medium': 't3',\n 'size=large | size=xlarge': 't2',\n },\n border: {\n // extend\n 'type=primary': '#clear',\n },\n\n '$min-inline-padding': '.5x',\n\n // Squeezed below its label, the label keeps its end padding as a box the\n // column can't hold: `stretch` keeps that box after the icon, and `clip`\n // hides the part past the edge. End content zeroes that padding, so then\n // only the content itself overflows, and it must stay visible.\n overflow: { '': 'clip', 'has-end-content': 'visible' },\n\n Label: {\n textAlign: 'center',\n placeSelf: 'center stretch',\n },\n },\n});\n\nexport interface CubeTagProps extends CubeItemProps {\n /**\n * Visual theme. Every value but `special` is a soft card — pale fill, tinted\n * border, strong colored text. `primary` and `special` are the same brand\n * hue at two weights: `primary` is the soft card, `special` the solid fill.\n */\n theme?:\n | 'default'\n | 'primary'\n | 'danger'\n | 'success'\n | 'warning'\n | 'note'\n | 'special';\n isClosable?: boolean;\n onClose?: () => void;\n closeButtonStyles?: Styles;\n}\n\nfunction Tag(allProps: CubeTagProps, ref) {\n const { t } = useI18n();\n\n let {\n theme = 'default',\n isClosable,\n onClose,\n closeButtonStyles,\n children,\n size = 'inline',\n mods,\n ...props\n } = allProps;\n\n let type = 'card';\n\n // `special` is the SOLID brand chip, and it is spelled as the `default`\n // theme's `primary` type rather than as a theme of its own. Not a typo to be\n // tidied into `theme = 'primary'`: that is the SOFT brand card\n // (`primary.card`), which is a different weight and reachable under its own\n // name. The two are deliberately separate spellings of the same hue.\n if (theme === 'special') {\n theme = 'default';\n type = 'primary';\n }\n\n return (\n <TagElement\n ref={ref}\n size={size}\n data-type={type}\n variant={`${theme}.${type}` as ItemVariant}\n mods={mods}\n actions={\n isClosable ? (\n <Item.Action\n aria-label={t('tag.close', 'Close')}\n styles={mergeStyleLayers({ color: '#current' }, closeButtonStyles)}\n icon={<CloseIcon />}\n onPress={onClose}\n />\n ) : undefined\n }\n {...props}\n >\n {children}\n </TagElement>\n );\n}\n\nconst _Tag = forwardRef(Tag);\n\n_Tag.displayName = 'Tag';\n\nexport { _Tag as Tag };\n"],"mappings":";;;;;;;;;;AASA,MAAMS,aAAaR,MAAMO,OAAM;CAC7BE,IAAI;CACJC,MAAM;CACNC,QAAQ;EACNC,SAAS;EACTC,QAAQ;GACN,IAAI;GACJ,eAAe;GACf,4BAA4B;GAC5B,4BAA4B;EAC9B;EACAC,QAAQ,EAEN,gBAAgB,SAClB;EAEA,uBAAuB;EAMvBC,UAAU;GAAE,IAAI;GAAQ,mBAAmB;EAAU;EAErDC,OAAO;GACLC,WAAW;GACXC,WAAW;EACb;CACF;AACF,CAAC;AAqBD,SAAAM,IAAAC,UAAAC,KAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CACE,MAAA,EAAAC,MAAc1B,QAAQ;CAAE,IAAA2B;CAAA,IAAAP;CAAA,IAAAF;CAAA,IAAAU;CAAA,IAAAT;CAAA,IAAAU;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAP,EAAA,OAAAF,UAAA;EAExB,CAAA,CAAAL,OAAAa,IAAAZ,YAAAC,SAAAC,mBAAAO,UAAAK,MAAAD,IAAAH,MAAA,GAAAC,SASIP;EAASE,EAAA,KAAAF;EAAAE,EAAA,KAAAG;EAAAH,EAAA,KAAAJ;EAAAI,EAAA,KAAAN;EAAAM,EAAA,KAAAI;EAAAJ,EAAA,KAAAL;EAAAK,EAAA,KAAAK;EAAAL,EAAA,KAAAM;EAAAN,EAAA,KAAAO;CAAA,OAAA;EAAAJ,WAAAH,EAAA;EAAAJ,oBAAAI,EAAA;EAAAN,aAAAM,EAAA;EAAAI,OAAAJ,EAAA;EAAAL,UAAAK,EAAA;EAAAK,QAAAL,EAAA;EAAAM,KAAAN,EAAA;EAAAO,KAAAP,EAAA;CAAA;CARX,IAAAP,QAAAa,OAAAG,KAAAA,IAAA,YAAAH;CAKA,MAAAE,OAAAD,OAAAE,KAAAA,IAAA,WAAAF;CAKF,IAAAG,OAAW;CAOX,IAAIjB,UAAU,WAAS;EACrBA,QAAQA;EACRiB,OAAOA;CAAH;CAQO,MAAAC,KAAA,GAAGlB,MAAK,GAAIiB;CAAqB,IAAAE;CAAA,IAAAZ,EAAA,OAAAJ,qBAAAI,EAAA,QAAAN,cAAAM,EAAA,QAAAL,WAAAK,EAAA,QAAAE,GAAA;EAGxCU,KAAAlB,aACE,oBAAAuB,MAAA,QAAA;GACc,cAAAf,EAAE,aAAa,OAAO;GAC1B,QAAAxB,iBAAiB,EAAAmC,OAAS,WAAW,GAAGjB,iBAAiB;GAC3D,MAAA,oBAAC,WAAD,CAAU,CAAA;GACPD,SAAAA;EAAO,CAAA,IALpBc,KAAAA;EAOaT,EAAA,KAAAJ;EAAAI,EAAA,MAAAN;EAAAM,EAAA,MAAAL;EAAAK,EAAA,MAAAE;EAAAF,EAAA,MAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,QAAAG,YAAAH,EAAA,QAAAI,QAAAJ,EAAA,QAAAK,SAAAL,EAAA,QAAAD,OAAAC,EAAA,QAAAQ,QAAAR,EAAA,QAAAW,MAAAX,EAAA,QAAAY,MAAAZ,EAAA,QAAAU,MAAA;EAdjBI,KAAA,oBAAC,YAAD;GACOf;GACCS;GACKE,aAAAA;GACF,SAAAC;GACHP;GAEJ,SAAAQ;GAOa,GAEXP;GAEHF;EAlBQ,CAAA;EAmBEH,EAAA,MAAAG;EAAAH,EAAA,MAAAI;EAAAJ,EAAA,MAAAK;EAAAL,EAAA,MAAAD;EAAAC,EAAA,MAAAQ;EAAAR,EAAA,MAAAW;EAAAX,EAAA,MAAAY;EAAAZ,EAAA,MAAAU;EAAAV,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OAnBbc;AAmBa;AAIjB,MAAMC,OAAOzC,WAAWuB,GAAG;AAE3BkB,KAAKC,cAAc"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.199.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.200.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useSlotProps } from "../../utils/react/Slots.js";
4
4
  import { c } from "react/compiler-runtime";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.199.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.200.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { TEXT_DEFAULT_STYLES, TEXT_PROP_MAP, useTextProps } from "../Text.js";
4
4
  import { highlightText } from "../highlightText.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.199.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.200.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useSlotProps } from "../../utils/react/Slots.js";
4
4
  import { TEXT_PROP_MAP } from "./Text.js";
@@ -1,10 +1,10 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.199.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.200.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { mergeRefs } from "../../../utils/react/useCombinedRefs.js";
4
4
  import { useEvent } from "../../../_internal/hooks/use-event.js";
5
5
  import { useI18n } from "../../../i18n/useI18n.js";
6
6
  import { SIZES, SIZE_NAME_TO_KEY } from "../../../tokens/sizes.js";
7
- import { TreeElement, TreeScrollContainer } from "./styled.js";
7
+ import { TreeElement, TreeScrollContainer, TreeSizer } from "./styled.js";
8
8
  import { buildTreeIndex } from "./tree-index.js";
9
9
  import { TreeNode } from "./TreeNode.js";
10
10
  import { useCheckboxTree } from "./use-checkbox-tree.js";
@@ -230,13 +230,11 @@ function TreeBase(props, ref) {
230
230
  paddingStart: containerPadding,
231
231
  paddingEnd: containerPadding
232
232
  });
233
- const treeTokens = useMemo(() => height == null ? void 0 : { "$tree-height": `${height}px` }, [height]);
233
+ const treeTokens = useMemo(() => ({
234
+ "$tree-height": height == null ? void 0 : `${height}px`,
235
+ "$tree-padding": `${containerPadding}px`
236
+ }), [height, containerPadding]);
234
237
  const totalSize = rowVirtualizer.getTotalSize();
235
- const sizerStyle = useMemo(() => ({
236
- position: "relative",
237
- width: "100%",
238
- height: `${totalSize}px`
239
- }), [totalSize]);
240
238
  /**
241
239
  * Each scroll effect tracks its own "last scrolled" target instead
242
240
  * of sharing one ref. A shared ref creates a feedback loop: keyboard
@@ -310,9 +308,9 @@ function TreeBase(props, ref) {
310
308
  tokens: treeTokens,
311
309
  children: /* @__PURE__ */ jsx(TreeScrollContainer, {
312
310
  ref: mergedScrollRef,
313
- children: /* @__PURE__ */ jsx("div", {
311
+ children: /* @__PURE__ */ jsx(TreeSizer, {
314
312
  role: "presentation",
315
- style: sizerStyle,
313
+ tokens: { "$tree-content-height": `${totalSize}px` },
316
314
  children: rowVirtualizer.getVirtualItems().map((virtualItem) => {
317
315
  const node_5 = visibleNodes[virtualItem.index];
318
316
  if (!node_5) return null;
@@ -331,13 +329,7 @@ function TreeBase(props, ref) {
331
329
  size,
332
330
  itemProps,
333
331
  rowStyles,
334
- virtualStyle: {
335
- position: "absolute",
336
- top: 0,
337
- left: containerPadding,
338
- right: containerPadding,
339
- transform: `translateY(${virtualItem.start}px)`
340
- },
332
+ virtualOffset: virtualItem.start,
341
333
  virtualRef: rowVirtualizer.measureElement,
342
334
  virtualIndex: virtualItem.index,
343
335
  menu: treeMenu,
@@ -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","buildTreeIndex","TreeNode","useCheckboxTree","useLoadData","Key","Node","Selection","CSSProperties","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","sizerStyle","position","width","lastFocusedScrollRef","lastSelectedScrollRef","focusedKey","selectionManager","findIndex","scrollToIndex","align","target","mods","mergedScrollRef","getVirtualItems","virtualItem","keyStr","data","checkedSet","halfCheckedSet","loadingKeys","top","left","right","transform","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 } from './styled';\nimport { buildTreeIndex } from './tree-index';\nimport { TreeNode } from './TreeNode';\nimport { useCheckboxTree } from './use-checkbox-tree';\nimport { useLoadData } from './use-load-data';\n\nimport type { Key, Node, Selection } from '@react-types/shared';\nimport type {\n CSSProperties,\n ForwardedRef,\n ReactElement,\n ReactNode,\n} from 'react';\nimport type {\n CubeTreeNodeData,\n CubeTreeProps,\n TreeOnExpandInfo,\n TreeOnSelectInfo,\n TreeSelectionMode,\n} from './types';\n\n/**\n * Render an `<Item>` for React Stately's collection builder.\n *\n * The visible content is rendered by `TreeNode` via `nodesByKey`,\n * so `<Item>`'s body is only used by Stately for the collection\n * (`textValue` for keyboard nav, `childItems` for nested traversal).\n */\nfunction renderItem(node: CubeTreeNodeData): ReactElement {\n const textValue =\n typeof node.title === 'string' ? node.title : String(node.key);\n return (\n <Item\n key={node.key}\n textValue={textValue}\n childItems={node.children as CubeTreeNodeData[] | undefined}\n >\n {node.title as ReactNode}\n </Item>\n );\n}\n\nfunction collectDisabledKeys(\n treeData: CubeTreeNodeData[],\n treeIsDisabled: boolean,\n): string[] {\n const keys: string[] = [];\n const visit = (nodes: CubeTreeNodeData[]) => {\n for (const node of nodes) {\n if (treeIsDisabled || node.isDisabled) keys.push(node.key);\n if (node.children) visit(node.children);\n }\n };\n visit(treeData);\n return keys;\n}\n\n/** Expand the supplied keys with all of their ancestor keys. */\nfunction expandWithParents(\n keys: string[] | undefined,\n parentOf: Map<string, string | null>,\n): string[] | undefined {\n if (!keys || keys.length === 0) return keys;\n const set = new Set<string>(keys);\n for (const key of keys) {\n let parent = parentOf.get(key);\n while (parent) {\n set.add(parent);\n parent = parentOf.get(parent);\n }\n }\n return Array.from(set);\n}\n\n/**\n * Diff two key sets to find the single key that was added or removed.\n * Returns `null` when both sets are equal.\n */\nfunction findToggledKey(\n previous: Set<Key>,\n next: Set<Key>,\n): { key: Key; added: boolean } | null {\n for (const k of next) {\n if (!previous.has(k)) return { key: k, added: true };\n }\n for (const k of previous) {\n if (!next.has(k)) return { key: k, added: false };\n }\n return null;\n}\n\nfunction resolveSelectionMode(\n selectionMode: TreeSelectionMode | undefined,\n isSelectable: boolean | undefined,\n): TreeSelectionMode {\n if (selectionMode != null) return selectionMode;\n if (isSelectable === false) return 'none';\n return 'single';\n}\n\nfunction TreeBase(props: CubeTreeProps, ref: ForwardedRef<HTMLDivElement>) {\n const {\n treeData,\n isCheckable = false,\n isSelectable,\n selectionMode: selectionModeProp,\n 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 () => (height == null ? undefined : { '$tree-height': `${height}px` }),\n [height],\n );\n\n const totalSize = rowVirtualizer.getTotalSize();\n const sizerStyle = useMemo<CSSProperties>(\n () => ({\n position: 'relative',\n width: '100%',\n height: `${totalSize}px`,\n }),\n [totalSize],\n );\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 {/* oxlint-disable-next-line react/forbid-dom-props -- the virtualizer measures the scroll height and row offsets */}\n <div role=\"presentation\" style={sizerStyle}>\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 virtualStyle={{\n position: 'absolute',\n top: 0,\n left: containerPadding,\n right: containerPadding,\n transform: `translateY(${virtualItem.start}px)`,\n }}\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 </div>\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","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,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.199.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.200.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";
@@ -24,7 +24,7 @@ function isMenuEmpty(menu) {
24
24
  }
25
25
  function TreeNodeInner(props) {
26
26
  const { t } = useI18n();
27
- const { node, data, state, isCheckable, isExpanded, isIndeterminate, isChecked, isLoading, onToggleChecked, size, itemProps, rowStyles, virtualStyle, virtualRef, virtualIndex, menu: treeMenu, contextMenu: treeContextMenu, onAction: treeOnAction, menuTriggerProps, menuProps } = props;
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
28
  const rowRef = useRef(null);
29
29
  const isLeaf = data.isLeaf === true || data.isLeaf !== false && !node.hasChildNodes;
30
30
  const { rowProps, gridCellProps, expandButtonProps, isPressed } = useTreeItem({
@@ -121,7 +121,10 @@ function TreeNodeInner(props) {
121
121
  isHovered,
122
122
  isPressed
123
123
  ]);
124
- const rowTokens = useMemo(() => ({ "$tree-level": node.level ?? 0 }), [node.level]);
124
+ const rowTokens = useMemo(() => ({
125
+ "$tree-level": node.level ?? 0,
126
+ "$tree-row-offset": virtualOffset == null ? void 0 : `${virtualOffset}px`
127
+ }), [node.level, virtualOffset]);
125
128
  const ariaChecked = isRowCheckable ? isIndeterminate ? "mixed" : isChecked ? "true" : "false" : void 0;
126
129
  const finalRowProps = {
127
130
  ...mergeProps$1(rowProps, hoverProps),
@@ -183,7 +186,6 @@ function TreeNodeInner(props) {
183
186
  ref: refs,
184
187
  mods: rowMods,
185
188
  tokens: rowTokens,
186
- style: virtualStyle,
187
189
  "data-element": "Row",
188
190
  "data-qa-key": String(node.key),
189
191
  "data-index": virtualIndex,
@@ -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","CSSProperties","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","virtualStyle","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 {\n CSSProperties,\n KeyboardEvent,\n MouseEvent,\n ReactNode,\n Ref,\n} 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 /** Inline style for virtualizer absolute positioning. */\n virtualStyle?: CSSProperties;\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 virtualStyle,\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 () => ({ '$tree-level': node.level ?? 0 }),\n [node.level],\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 // oxlint-disable-next-line react/forbid-component-props -- the virtualizer positions the row\n style={virtualStyle}\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","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,7 +1,7 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.199.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.200.0 | Cube Dev Team */
2
2
  import { Item as _Item } from "../Item/Item.js";
3
3
  import { Action } from "../../actions/Action/Action.js";
4
- import { tasty } from "@tenphi/tasty";
4
+ import { mergeStyles, tasty } from "@tenphi/tasty";
5
5
  //#region src/components/content/Tree/styled.ts
6
6
  /**
7
7
  * Tree root.
@@ -15,6 +15,9 @@ import { tasty } from "@tenphi/tasty";
15
15
  * Tree-wide modifiers (set on `TreeElement` itself):
16
16
  * - `has-height` — paired with the `$tree-height` token
17
17
  * when the consumer passes a numeric `height` prop.
18
+ *
19
+ * It also sets `$tree-padding`, the `containerPadding` that insets the
20
+ * rows (`TreeNodeRow`).
18
21
  */
19
22
  const TreeElement = tasty({
20
23
  qa: "Tree",
@@ -55,7 +58,7 @@ const TreeElement = tasty({
55
58
  });
56
59
  /**
57
60
  * Inner scroll viewport. Block-level on purpose — placing the
58
- * virtualizer's sizer (`height: ${totalSize}px`) directly inside the
61
+ * virtualizer's sizer (`TreeSizer`) directly inside the
59
62
  * flex `TreeElement` lets `flex-shrink: 1` collapse it, which makes
60
63
  * the scroll area visibly grow as `@tanstack/react-virtual`
61
64
  * re-measures rows during scroll.
@@ -74,18 +77,35 @@ const TreeScrollContainer = tasty({
74
77
  }
75
78
  });
76
79
  /**
80
+ * The virtualizer's sizer: as tall as every row, measured or estimated
81
+ * (`$tree-content-height`), and the box the rows are placed in.
82
+ */
83
+ const TreeSizer = tasty({
84
+ qa: "TreeSizer",
85
+ styles: {
86
+ position: "relative",
87
+ width: "100%",
88
+ height: "$tree-content-height"
89
+ }
90
+ });
91
+ /**
77
92
  * Per-row wrapper carrying `role="row"`, `rowProps` from
78
93
  * `useTreeItem`, and the `--tree-level` CSS custom property used by
79
94
  * `TreeRowItem` to compute its left padding.
80
95
  *
81
- * Has no visual styles of its own — the row's appearance lives on
82
- * the inner `TreeRowItem` (which extends `Item`).
96
+ * It places the row at the virtualizer's offset (`--tree-row-offset`),
97
+ * inset by `--tree-padding`. Otherwise it has no visual styles of its
98
+ * own — the row's appearance lives on the inner `TreeRowItem` (which
99
+ * extends `Item`).
83
100
  */
84
101
  const TreeNodeRow = tasty({
85
102
  qa: "TreeRow",
86
103
  styles: {
87
104
  display: "block",
88
- outline: 0
105
+ outline: 0,
106
+ position: "absolute",
107
+ inset: "0 $tree-padding top dock",
108
+ transform: "translateY($tree-row-offset)"
89
109
  }
90
110
  });
91
111
  /**
@@ -108,7 +128,7 @@ const TreeRowItem = tasty(_Item, {
108
128
  * `Item` is `inline-grid` by default, which leaves baseline
109
129
  * descender space below the row inside the block-level
110
130
  * `TreeNodeRow` and visually inflates the gap between rows
111
- * past the intended `1bw`. Force block-level grid here.
131
+ * past the intended hairline. Force block-level grid here.
112
132
  */
113
133
  display: "grid",
114
134
  width: "100%",
@@ -164,8 +184,7 @@ const TOGGLE_BASE_STYLES = {
164
184
  */
165
185
  const TreeNodeToggle = tasty(Action, {
166
186
  qa: "TreeNodeToggle",
167
- styles: {
168
- ...TOGGLE_BASE_STYLES,
187
+ styles: mergeStyles(TOGGLE_BASE_STYLES, {
169
188
  color: {
170
189
  "": "#dark-02",
171
190
  ":hover": "#dark"
@@ -174,7 +193,7 @@ const TreeNodeToggle = tasty(Action, {
174
193
  "": "#clear",
175
194
  ":hover": "#dark.04"
176
195
  }
177
- }
196
+ })
178
197
  });
179
198
  /**
180
199
  * Non-interactive placeholder that occupies the same footprint as
@@ -183,6 +202,6 @@ const TreeNodeToggle = tasty(Action, {
183
202
  */
184
203
  const TreeNodeTogglePlaceholder = tasty({ styles: TOGGLE_BASE_STYLES });
185
204
  //#endregion
186
- export { TreeElement, TreeNodeCheckboxWrapper, TreeNodeRow, TreeNodeToggle, TreeNodeTogglePlaceholder, TreeRowItem, TreeScrollContainer };
205
+ export { TreeElement, TreeNodeCheckboxWrapper, TreeNodeRow, TreeNodeToggle, TreeNodeTogglePlaceholder, TreeRowItem, TreeScrollContainer, TreeSizer };
187
206
 
188
207
  //# sourceMappingURL=styled.js.map