@cube-dev/ui-kit 0.193.2 → 0.194.1
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.
- package/dist/CHANGELOG.md +34 -0
- package/dist/_internal/hooks/use-debounced-value.js +1 -1
- package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
- package/dist/_internal/hooks/use-event.js +1 -1
- package/dist/_internal/hooks/use-is-first-render.js +1 -1
- package/dist/_internal/hooks/use-sync-ref.js +1 -1
- package/dist/_internal/hooks/use-timer/timer.js +1 -1
- package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
- package/dist/_internal/hooks/use-warn.js +1 -1
- package/dist/components/Block.js +1 -1
- package/dist/components/CollectionItem.d.ts +25 -12
- package/dist/components/CollectionItem.js +59 -4
- package/dist/components/CollectionItem.js.map +1 -1
- package/dist/components/GlobalStyles.js +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.js +2 -2
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.d.ts +1 -1
- package/dist/components/actions/Banner/Banner.js +6 -6
- package/dist/components/actions/Banner/Banner.js.map +1 -1
- package/dist/components/actions/Button/Button.js +2 -2
- package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/components/actions/ButtonSplit/ButtonSplit.js +28 -25
- package/dist/components/actions/ButtonSplit/ButtonSplit.js.map +1 -1
- package/dist/components/actions/ButtonSplit/context.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.d.ts +7 -7
- package/dist/components/actions/CommandMenu/CommandMenu.js +232 -239
- package/dist/components/actions/CommandMenu/CommandMenu.js.map +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +27 -23
- package/dist/components/actions/ItemAction/ItemAction.js.map +1 -1
- package/dist/components/actions/ItemActionContext.d.ts +3 -0
- package/dist/components/actions/ItemActionContext.js +15 -13
- package/dist/components/actions/ItemActionContext.js.map +1 -1
- package/dist/components/actions/ItemActionsWrapper.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.d.ts +2 -2
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.d.ts +9 -9
- package/dist/components/actions/Menu/Menu.js +88 -64
- package/dist/components/actions/Menu/Menu.js.map +1 -1
- package/dist/components/actions/Menu/MenuCollectionItem.d.ts +18 -0
- package/dist/components/actions/Menu/MenuCollectionItem.js +36 -0
- package/dist/components/actions/Menu/MenuCollectionItem.js.map +1 -0
- package/dist/components/actions/Menu/MenuItem.d.ts +5 -0
- package/dist/components/actions/Menu/MenuItem.js +402 -116
- package/dist/components/actions/Menu/MenuItem.js.map +1 -1
- package/dist/components/actions/Menu/MenuSection.d.ts +3 -1
- package/dist/components/actions/Menu/MenuSection.js +31 -33
- package/dist/components/actions/Menu/MenuSection.js.map +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.d.ts +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +2 -2
- package/dist/components/actions/Menu/SubMenuTrigger.js.map +1 -1
- package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/dist/components/actions/Menu/context.js +1 -1
- package/dist/components/actions/Menu/index.d.ts +1 -0
- package/dist/components/actions/Menu/styled.js +1 -1
- package/dist/components/actions/actions-run.js +1 -1
- package/dist/components/actions/index.d.ts +3 -2
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +60 -36
- package/dist/components/actions/use-action.js.map +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +2 -2
- package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
- package/dist/components/content/Alert/Alert.js +1 -1
- package/dist/components/content/Alert/use-alert.js +1 -1
- package/dist/components/content/Avatar/Avatar.js +1 -1
- package/dist/components/content/Badge/Badge.js +1 -1
- package/dist/components/content/Card/Card.js +1 -1
- package/dist/components/content/Content.js +1 -1
- package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.d.ts +45 -45
- package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +44 -33
- package/dist/components/content/HotKeys/HotKeys.js.map +1 -1
- package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
- package/dist/components/content/InlineInput/InlineInput.js +1 -1
- package/dist/components/content/Item/Item.d.ts +7 -7
- package/dist/components/content/Item/Item.js +207 -69
- package/dist/components/content/Item/Item.js.map +1 -1
- package/dist/components/content/Item/ItemWithNativeLinks.js +314 -0
- package/dist/components/content/Item/ItemWithNativeLinks.js.map +1 -0
- package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
- package/dist/components/content/ItemCard/ItemCard.d.ts +1 -1
- package/dist/components/content/ItemCard/ItemCard.js +1 -1
- package/dist/components/content/Layout/GridLayout.js +1 -1
- package/dist/components/content/Layout/Layout.js +1 -1
- package/dist/components/content/Layout/LayoutBlock.js +1 -1
- package/dist/components/content/Layout/LayoutCenter.js +1 -1
- package/dist/components/content/Layout/LayoutContainer.js +1 -1
- package/dist/components/content/Layout/LayoutContent.js +1 -1
- package/dist/components/content/Layout/LayoutContext.js +1 -1
- package/dist/components/content/Layout/LayoutFlex.js +1 -1
- package/dist/components/content/Layout/LayoutFooter.js +1 -1
- package/dist/components/content/Layout/LayoutGrid.js +1 -1
- package/dist/components/content/Layout/LayoutHeader.js +1 -1
- package/dist/components/content/Layout/LayoutPane.js +113 -107
- package/dist/components/content/Layout/LayoutPane.js.map +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +44 -48
- package/dist/components/content/Layout/LayoutPanel.js.map +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js +2 -2
- package/dist/components/content/Layout/LayoutPanelTransition.js +1 -1
- package/dist/components/content/Layout/LayoutToolbar.js +1 -1
- package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/dist/components/content/Layout/index.js +1 -1
- package/dist/components/content/Layout/utils.js +1 -1
- package/dist/components/content/Paragraph.js +1 -1
- package/dist/components/content/Placeholder/Placeholder.js +77 -70
- package/dist/components/content/Placeholder/Placeholder.js.map +1 -1
- package/dist/components/content/PrismCode/PrismCode.js +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +5 -5
- package/dist/components/content/Result/Result.js.map +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +18 -19
- package/dist/components/content/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/content/Tag/Tag.js +2 -2
- package/dist/components/content/Text.d.ts +57 -57
- package/dist/components/content/Text.js +61 -77
- package/dist/components/content/Text.js.map +1 -1
- package/dist/components/content/TextItem/TextItem.js +158 -29
- package/dist/components/content/TextItem/TextItem.js.map +1 -1
- package/dist/components/content/Title.js +66 -48
- package/dist/components/content/Title.js.map +1 -1
- package/dist/components/content/Tree/Tree.js +6 -3
- package/dist/components/content/Tree/Tree.js.map +1 -1
- package/dist/components/content/Tree/TreeNode.js +1 -1
- package/dist/components/content/Tree/styled.js +1 -1
- package/dist/components/content/Tree/tree-index.js +1 -1
- package/dist/components/content/Tree/types.d.ts +2 -2
- package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
- package/dist/components/content/Tree/use-load-data.js +1 -1
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.js +3 -2
- package/dist/components/content/use-auto-tooltip.js.map +1 -1
- package/dist/components/data/DataTable/DataTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTableBulkBar.js +2 -2
- package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
- package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
- package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
- package/dist/components/data/ItemTable/use-item-table-column-widths.js +1 -1
- package/dist/components/data/ItemTable/use-item-table-drag-drop.js +1 -1
- package/dist/components/data/ItemTable/use-item-table-pagination.js +1 -1
- package/dist/components/data/ItemTable/use-item-table-selection.js +1 -1
- package/dist/components/data/ItemTable/use-item-table-sort.js +1 -1
- package/dist/components/data/ItemTable/use-item-table-tree-model.js +1 -1
- package/dist/components/data/TableBase/ColumnResizer.js +1 -1
- package/dist/components/data/TableBase/RowCollection.js +1 -1
- package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
- package/dist/components/data/TableBase/TableRow.js +1 -1
- package/dist/components/data/TableBase/TableView.js +8 -5
- package/dist/components/data/TableBase/TableView.js.map +1 -1
- package/dist/components/data/TableBase/TreeGridTable.js +1 -1
- package/dist/components/data/TableBase/column-header.js +89 -25
- package/dist/components/data/TableBase/column-header.js.map +1 -1
- package/dist/components/data/TableBase/column-menu.js +1 -1
- package/dist/components/data/TableBase/column-styles.js +1 -1
- package/dist/components/data/TableBase/column-tint.js +1 -1
- package/dist/components/data/TableBase/row-menu.js +1 -1
- package/dist/components/data/TableBase/styled.d.ts +1 -1
- package/dist/components/data/TableBase/styled.js +1 -1
- package/dist/components/data/TableBase/table-tree.js +1 -1
- package/dist/components/data/TableBase/types.js +1 -1
- package/dist/components/data/TableBase/use-cell-selection.js +0 -0
- package/dist/components/data/TableBase/use-column-menu.js +1 -1
- package/dist/components/data/TableBase/use-column-order.js +1 -1
- package/dist/components/data/TableBase/use-column-window.js +119 -57
- package/dist/components/data/TableBase/use-column-window.js.map +1 -1
- package/dist/components/data/TableBase/use-container-width.js +1 -1
- package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
- package/dist/components/data/TableBase/use-scrollability.js +1 -1
- package/dist/components/data/TableBase/use-table-columns.js +1 -1
- package/dist/components/data/TableBase/use-table-search.js +1 -1
- package/dist/components/data/TableBase/use-table-selection.js +1 -1
- package/dist/components/data/TableBase/use-table-sort.js +1 -1
- package/dist/components/data/TableBase/use-table-sorts.js +1 -1
- package/dist/components/data/TableBase/use-table-storage.js +1 -1
- package/dist/components/data/TableBase/use-table-tooltip-refresh.js +19 -17
- package/dist/components/data/TableBase/use-table-tooltip-refresh.js.map +1 -1
- package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +3 -1
- package/dist/components/fields/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +13 -13
- package/dist/components/fields/Checkbox/CheckboxGroup.js.map +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ColorInput/ColorInput.js +32 -29
- package/dist/components/fields/ColorInput/ColorInput.js.map +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.d.ts +2 -0
- package/dist/components/fields/ColorPicker/ColorPicker.js +9 -6
- package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -1
- package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +6 -3
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js.map +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +41 -30
- package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
- package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
- package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
- package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
- package/dist/components/fields/DatePicker/DateInput.js +1 -1
- package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
- package/dist/components/fields/DatePicker/DatePicker.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js +2 -2
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +246 -238
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js.map +1 -1
- package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
- package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
- package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
- package/dist/components/fields/DatePicker/YearPicker.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/period.js +1 -1
- package/dist/components/fields/DatePicker/props.js +1 -1
- package/dist/components/fields/DatePicker/utils.js +1 -1
- package/dist/components/fields/FileInput/FileInput.js +22 -2
- package/dist/components/fields/FileInput/FileInput.js.map +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +5 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.d.ts +4 -2
- package/dist/components/fields/FilterPicker/FilterPicker.js +4 -3
- package/dist/components/fields/FilterPicker/FilterPicker.js.map +1 -1
- package/dist/components/fields/Input/Input.js +1 -1
- package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
- package/dist/components/fields/ListBox/ListBox.js +8 -7
- package/dist/components/fields/ListBox/ListBox.js.map +1 -1
- package/dist/components/fields/ListBox/optionId.js +1 -1
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +36 -32
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js.map +1 -1
- package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
- package/dist/components/fields/NumberInput/NumberInput.js +1 -1
- package/dist/components/fields/NumberInput/StepButton.js +1 -1
- package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/dist/components/fields/Picker/Picker.d.ts +4 -2
- package/dist/components/fields/Picker/Picker.js +4 -3
- package/dist/components/fields/Picker/Picker.js.map +1 -1
- package/dist/components/fields/RadioGroup/Radio.d.ts +40 -40
- package/dist/components/fields/RadioGroup/Radio.js +2 -2
- package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +1 -1
- package/dist/components/fields/Select/Select.d.ts +4 -4
- package/dist/components/fields/Select/Select.js +36 -33
- package/dist/components/fields/Select/Select.js.map +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +1 -1
- package/dist/components/fields/Slider/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/TagInput/TagInput.js +1 -1
- package/dist/components/fields/TagInput/TagList.js +1 -1
- package/dist/components/fields/TagInput/useActiveOption.js +1 -1
- package/dist/components/fields/TagInput/useTagError.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +13 -5
- package/dist/components/fields/TextInputMapper/TextInputMapper.js.map +1 -1
- package/dist/components/fields/TriggerActions.js +1 -1
- package/dist/components/fields/color/ColorPanel.js +62 -53
- package/dist/components/fields/color/ColorPanel.js.map +1 -1
- package/dist/components/fields/color/channels.js +1 -1
- package/dist/components/fields/color/color.js +1 -1
- package/dist/components/fields/color/context.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.d.ts +1 -0
- package/dist/components/form/FieldWrapper/FieldWrapper.js +134 -110
- package/dist/components/form/FieldWrapper/FieldWrapper.js.map +1 -1
- package/dist/components/form/FieldWrapper/field-description.js +102 -0
- package/dist/components/form/FieldWrapper/field-description.js.map +1 -0
- package/dist/components/form/FieldWrapper/types.d.ts +6 -1
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/ModernFormRoot.js +1 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/backend.js +1 -1
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/modern/actions.js +1 -1
- package/dist/components/form/Form/modern/context.js +1 -1
- package/dist/components/form/Form/modern/controller.js +1 -1
- package/dist/components/form/Form/modern/field-binding.js +1 -1
- package/dist/components/form/Form/modern/field.js +1 -1
- package/dist/components/form/Form/modern/react.js +1 -1
- package/dist/components/form/Form/modern/store.js +1 -1
- package/dist/components/form/Form/modern/validation.js +1 -1
- package/dist/components/form/Form/modern/values.js +1 -1
- package/dist/components/form/Form/reset-unbound-controls.js +1 -1
- package/dist/components/form/Form/use-field/use-field-binding.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +17 -4
- package/dist/components/form/Form/use-field/use-field-props.js.map +1 -1
- package/dist/components/form/Form/use-field/use-field.js +1 -1
- package/dist/components/form/Form/use-form.js +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +27 -24
- package/dist/components/form/Label.js.map +1 -1
- package/dist/components/form/legacy-tooltip.js +1 -1
- package/dist/components/form/validation/ValidationIndicator.js +1 -1
- package/dist/components/form/validation/resolve-validation-props.js +1 -1
- package/dist/components/form/validation/use-validation-props.js +1 -1
- package/dist/components/form/wrapper.js +2 -1
- package/dist/components/form/wrapper.js.map +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/dist/components/layout/Flex.js +1 -1
- package/dist/components/layout/Flow.js +1 -1
- package/dist/components/layout/Grid.js +1 -1
- package/dist/components/layout/Panel.js +1 -1
- package/dist/components/layout/Prefix.js +1 -1
- package/dist/components/layout/ResizablePanel.js +1 -1
- package/dist/components/layout/Space.js +1 -1
- package/dist/components/layout/Suffix.js +1 -1
- package/dist/components/navigation/Pagination/Pagination.js +1 -1
- package/dist/components/navigation/Pagination/use-pagination.js +1 -1
- package/dist/components/navigation/Tabs/BoardDragActiveProvider.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/popover-placement.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.d.ts +3 -3
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
- package/dist/components/other/Calendar/Calendar.js +1 -1
- package/dist/components/other/Calendar/CalendarCell.js +1 -1
- package/dist/components/other/Calendar/CalendarGrid.js +1 -1
- package/dist/components/other/Calendar/CalendarHeader.js +1 -1
- package/dist/components/other/Calendar/CalendarPanel.js +1 -1
- package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
- package/dist/components/other/Calendar/PeriodGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/Calendar/styled.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
- package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/ModernDialogForm.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/default-button-text.js +1 -1
- package/dist/components/overlays/Dialog/use-content-overflow.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.js +44 -24
- package/dist/components/overlays/Modal/Modal.js.map +1 -1
- package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +34 -24
- package/dist/components/overlays/Modal/Popover.js.map +1 -1
- package/dist/components/overlays/Modal/Tray.js +45 -25
- package/dist/components/overlays/Modal/Tray.js.map +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Modal/modal-containment.js +145 -0
- package/dist/components/overlays/Modal/modal-containment.js.map +1 -0
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +2 -2
- package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
- package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
- package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
- package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
- package/dist/components/overlays/Notifications/PersistentNotificationsList.js +2 -2
- package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
- package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
- package/dist/components/overlays/Notifications/index.js +1 -1
- package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
- package/dist/components/overlays/Notifications/use-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/useProgressToast.js +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +50 -47
- package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +95 -100
- package/dist/components/overlays/Tooltip/TooltipTrigger.js.map +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/overlays/Tooltip/split-trigger-props.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/DraggableCollection.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/data/item-themes.js +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/eslint-plugin/defaults.generated.js +2 -2
- package/dist/eslint-plugin/defaults.generated.js.map +1 -1
- package/dist/eslint-plugin/index.js +1 -1
- package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
- package/dist/i18n/I18nProvider.js +3 -2
- package/dist/i18n/I18nProvider.js.map +1 -1
- package/dist/i18n/createFormatter.js +1 -1
- package/dist/i18n/index.d.ts +2 -1
- package/dist/i18n/index.js +3 -2
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/instance.d.ts +2 -3
- package/dist/i18n/instance.js +3 -4
- package/dist/i18n/instance.js.map +1 -1
- package/dist/i18n/locales/de-DE/uikit.js +36 -5
- package/dist/i18n/locales/en-US/uikit.js +36 -5
- package/dist/i18n/locales/en-US/uikit.json.d.ts +41 -4
- package/dist/i18n/locales/es-ES/uikit.js +36 -5
- package/dist/i18n/locales/es-MX/uikit.js +36 -5
- package/dist/i18n/locales/fr-FR/uikit.js +36 -5
- package/dist/i18n/locales/it-IT/uikit.js +36 -5
- package/dist/i18n/locales/ja-JP/uikit.js +36 -5
- package/dist/i18n/locales/nb-NO/uikit.js +36 -5
- package/dist/i18n/locales/pt-BR/uikit.js +36 -5
- package/dist/i18n/locales/pt-PT/uikit.js +36 -5
- package/dist/i18n/locales/sv-SE/uikit.js +36 -5
- package/dist/i18n/locales/vi-VN/uikit.js +36 -5
- package/dist/i18n/locales.js +1 -1
- package/dist/i18n/namespace.d.ts +11 -0
- package/dist/i18n/namespace.js +12 -0
- package/dist/i18n/namespace.js.map +1 -0
- package/dist/i18n/useFormatter.js +1 -1
- package/dist/i18n/useI18n.js +5 -3
- package/dist/i18n/useI18n.js.map +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/ArrowNarrowDownIcon.js +1 -1
- package/dist/icons/ArrowNarrowUpIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/GripVerticalIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PipetteIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +9 -7
- package/dist/index.js +12 -11
- package/dist/index.js.map +1 -1
- package/dist/probe/canonicalize.js +1 -1
- package/dist/probe/css.js +1 -1
- package/dist/probe/index.js +1 -1
- package/dist/provider.js +2 -2
- package/dist/provider.js.map +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigation-url.js +11 -0
- package/dist/providers/navigation-url.js.map +1 -0
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/providers/use-navigation.js +19 -0
- package/dist/providers/use-navigation.js.map +1 -0
- package/dist/tokens/all-tokens.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/color-seed.js +1 -1
- package/dist/tokens/color-theme.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/lazy-styles.js +1 -1
- package/dist/tokens/legacy-color.js +1 -1
- package/dist/tokens/palette-config.js +1 -1
- package/dist/tokens/palette.js +1 -1
- package/dist/tokens/resolve.js +1 -1
- package/dist/tokens/shadows.js +1 -1
- package/dist/tokens/sizes.js +1 -1
- package/dist/tokens/spacing.js +1 -1
- package/dist/tokens/typography.js +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/colors.js +1 -1
- package/dist/utils/dotize.js +1 -1
- package/dist/utils/is-dev-env.js +1 -1
- package/dist/utils/modules.js +1 -1
- package/dist/utils/promise.js +1 -1
- package/dist/utils/raf.js +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/range.js +1 -1
- package/dist/utils/react/RenderCache.js +1 -1
- package/dist/utils/react/Slots.js +1 -1
- package/dist/utils/react/chain.js +1 -1
- package/dist/utils/react/disabledProps.js +1 -1
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.js +4 -4
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/overlayKeyPropagation.js +1 -1
- package/dist/utils/react/programmaticFocus.js +1 -1
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +1 -1
- package/dist/utils/react/useBufferedValue.js +1 -1
- package/dist/utils/react/useCombinedRefs.js +1 -1
- package/dist/utils/react/useControlledFocusVisible.js +1 -1
- package/dist/utils/react/useEventBus.js +1 -1
- package/dist/utils/react/useId.js +1 -1
- package/dist/utils/react/useIsDarwin.js +1 -1
- package/dist/utils/react/useKeySymbols.js +1 -1
- package/dist/utils/react/useLayoutEffect.js +1 -1
- package/dist/utils/react/useLocalStorage.js +1 -1
- package/dist/utils/react/useMergeStyles.js +1 -1
- package/dist/utils/react/useOverlayEscapeGuard.js +1 -1
- package/dist/utils/react/usePopoverSync.js +1 -1
- package/dist/utils/react/useQaProps.js +1 -1
- package/dist/utils/react/useScheme.js +1 -1
- package/dist/utils/react/useViewportSize.js +1 -1
- package/dist/utils/react/wrapNodeIfPlain.js +1 -1
- package/dist/utils/selection.js +1 -1
- package/dist/utils/styles.js +1 -1
- package/dist/utils/tree.js +1 -1
- package/dist/utils/warnings.js +1 -1
- package/dist/version.js +2 -2
- package/docs/Usage.md +4 -0
- package/docs/components/CollectionItem.md +5 -1
- package/docs/components/actions/CommandMenu.md +46 -18
- package/docs/components/actions/Menu.md +124 -19
- package/docs/components/content/Layout.md +1 -1
- package/docs/components/content/Placeholder.md +2 -0
- package/docs/components/content/Skeleton.md +2 -0
- package/docs/components/data/ItemTable.md +2 -0
- package/docs/components/overlays/Dialog.md +1 -1
- package/docs/components/overlays/DialogContainer.md +1 -2
- package/docs/components/overlays/DialogTrigger.md +1 -0
- package/package.json +2 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | 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
|
+
import { useI18n } from "../../../i18n/useI18n.js";
|
|
5
6
|
import { SIZES, SIZE_NAME_TO_KEY } from "../../../tokens/sizes.js";
|
|
6
7
|
import { TreeElement, TreeScrollContainer } from "./styled.js";
|
|
7
8
|
import { buildTreeIndex } from "./tree-index.js";
|
|
@@ -164,6 +165,8 @@ function TreeBase(props, ref) {
|
|
|
164
165
|
onSelect(arr, info_0);
|
|
165
166
|
});
|
|
166
167
|
const hasOnSelect = onSelect != null;
|
|
168
|
+
const { t } = useI18n();
|
|
169
|
+
const treeLabel = ariaLabel ?? t("tree.ariaLabel", "Tree");
|
|
167
170
|
const ariaProps = useMemo(() => ({
|
|
168
171
|
selectionMode,
|
|
169
172
|
selectedKeys,
|
|
@@ -176,7 +179,7 @@ function TreeBase(props, ref) {
|
|
|
176
179
|
disabledBehavior: "all",
|
|
177
180
|
items: treeData,
|
|
178
181
|
children: renderItem,
|
|
179
|
-
"aria-label":
|
|
182
|
+
"aria-label": treeLabel
|
|
180
183
|
}), [
|
|
181
184
|
selectionMode,
|
|
182
185
|
selectedKeys,
|
|
@@ -188,7 +191,7 @@ function TreeBase(props, ref) {
|
|
|
188
191
|
handleExpandedChange,
|
|
189
192
|
disabledKeys,
|
|
190
193
|
treeData,
|
|
191
|
-
|
|
194
|
+
treeLabel
|
|
192
195
|
]);
|
|
193
196
|
const baseState = useTreeState(ariaProps);
|
|
194
197
|
const state = useMemo(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tree.js","names":["useVirtualizer","OUTER_STYLES","forwardRef","useLayoutEffect","useMemo","useRef","useTree","Item","useTreeState","useEvent","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","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","treeStyle","sizerStyle","position","width","getTotalSize","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 { 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\n const ariaProps = useMemo(\n () => ({\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange:\n hasOnSelect && selectionMode !== 'none'\n ? handleSelectionChange\n : undefined,\n expandedKeys: effectiveExpandedKeys,\n defaultExpandedKeys: effectiveDefaultExpandedKeys,\n onExpandedChange: handleExpandedChange,\n disabledKeys,\n disabledBehavior: 'all' as const,\n items: treeData,\n children: renderItem as any,\n 'aria-label': ariaLabel ?? 'Tree',\n }),\n [\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n hasOnSelect,\n handleSelectionChange,\n effectiveExpandedKeys,\n effectiveDefaultExpandedKeys,\n handleExpandedChange,\n disabledKeys,\n treeData,\n ariaLabel,\n ],\n );\n\n const baseState = useTreeState<CubeTreeNodeData>(ariaProps);\n\n // The legacy `TreeCollection` from `useTreeState` lacks `getChildren`,\n // but `useTree` calls it for nested rows. Derive a patched state.\n // TODO: Remove this patch when upgrading to a react-stately version\n // that ships `getChildren` on TreeCollection natively.\n const state = useMemo(() => {\n const collection = baseState.collection;\n if (typeof (collection as any).getChildren === 'function') {\n return baseState;\n }\n const patched = Object.create(collection);\n patched.getChildren = (key: Key): Iterable<Node<CubeTreeNodeData>> => {\n const node = collection.getItem(key);\n return node ? Array.from(node.childNodes) : [];\n };\n return { ...baseState, collection: patched };\n }, [baseState]);\n\n const { gridProps } = useTree(ariaProps, state, treeRef);\n\n const visibleNodes: Node<CubeTreeNodeData>[] = useMemo(() => {\n const out: Node<CubeTreeNodeData>[] = [];\n for (const key of state.collection.getKeys()) {\n const node = state.collection.getItem(key);\n if (node && node.type === 'item') out.push(node);\n }\n return out;\n }, [state.collection]);\n\n const 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 treeStyle = useMemo<CSSProperties | undefined>(() => {\n if (height == null) return undefined;\n return { ['--tree-height' as keyof CSSProperties]: `${height}px` };\n }, [height]);\n\n const sizerStyle = useMemo<CSSProperties>(\n () => ({\n position: 'relative',\n width: '100%',\n height: `${rowVirtualizer.getTotalSize()}px`,\n }),\n [rowVirtualizer.getTotalSize()],\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 style={treeStyle}\n >\n <TreeScrollContainer ref={mergedScrollRef}>\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":";;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,SAASgC,WAAWC,MAAsC;AAGxD,QACE,oBAAC;EAEC,WAJF,OAAOA,KAAKE,UAAU,WAAWF,KAAKE,QAAQC,OAAOH,KAAKI,IAAI;EAK5D,YAAYJ,KAAKK;YAEhBL,KAAKE;IAJDF,KAAKI,IAKL;;AAIX,SAASE,oBACPC,UACAC,gBACU;CACV,MAAMC,OAAiB,EAAE;CACzB,MAAMC,SAASC,UAA8B;AAC3C,OAAK,MAAMX,QAAQW,OAAO;AACxB,OAAIH,kBAAkBR,KAAKY,WAAYH,MAAKI,KAAKb,KAAKI,IAAI;AAC1D,OAAIJ,KAAKK,SAAUK,OAAMV,KAAKK,SAAS;;;AAG3CK,OAAMH,SAAS;AACf,QAAOE;;;AAIT,SAASK,kBACPL,MACAM,UACsB;AACtB,KAAI,CAACN,QAAQA,KAAKQ,WAAW,EAAG,QAAOR;CACvC,MAAMS,MAAM,IAAIC,IAAYV,KAAK;AACjC,MAAK,MAAML,OAAOK,MAAM;EACtB,IAAIW,SAASL,SAASM,IAAIjB,IAAI;AAC9B,SAAOgB,QAAQ;AACbF,OAAII,IAAIF,OAAO;AACfA,YAASL,SAASM,IAAID,OAAO;;;AAGjC,QAAOG,MAAMC,KAAKN,IAAI;;;;;;AAOxB,SAASO,eACPC,UACAC,MACqC;AACrC,MAAK,MAAME,KAAKF,KACd,KAAI,CAACD,SAASI,IAAID,EAAE,CAAE,QAAO;EAAEzB,KAAKyB;EAAGD,OAAO;EAAM;AAEtD,MAAK,MAAMC,KAAKH,SACd,KAAI,CAACC,KAAKG,IAAID,EAAE,CAAE,QAAO;EAAEzB,KAAKyB;EAAGD,OAAO;EAAO;AAEnD,QAAO;;AAGT,SAASG,qBACPC,eACAC,cACmB;AACnB,KAAID,iBAAiB,KAAM,QAAOA;AAClC,KAAIC,iBAAiB,MAAO,QAAO;AACnC,QAAO;;AAGT,SAASC,SAASC,OAAsBC,KAAmC;CACzE,MAAM,EACJ7B,UACA+B,cAAc,OACdL,cACAD,eAAeO,mBACfC,OAAO,UACPC,QAAQ,WACRC,mBAAmB,GACnB9B,aAAa,OACb+B,qBACAC,cACAC,mBAAmB,OACnBC,oBACAC,aACAC,qBACAC,cACAC,QACAC,UACAC,UACAC,SACAC,UACAC,WACAC,WACAC,WACAC,IACAC,MAAMC,UACNC,aAAaC,iBACbC,UAAUC,cACVC,kBACAC,WACA,GAAGC,eACDhC;CAEJ,MAAMiC,aAAaxF,cAAcuF,YAAYnG,aAAa;CAE1D,MAAMqG,UAAUjG,OAAuB,KAAK;CAC5C,MAAMkG,YAAYlG,OAAuB,KAAK;CAE9C,MAAMmG,YAAYpG,cAAcY,eAAewB,SAAS,EAAE,CAACA,SAAS,CAAC;CACrE,MAAMiE,aAAaD,UAAUE;CAC7B,MAAM1D,WAAWwD,UAAUxD;CAE3B,MAAM2D,eAAevG,cACbmC,oBAAoBC,UAAUK,WAAW,EAC/C,CAACL,UAAUK,WACb,CAAC;CAED,MAAMoB,gBAAgBD,qBAAqBQ,mBAAmBN,aAAa;CAE3E,MAAM0C,wBAAwBxG,cAE1B0E,mBACI/B,kBAAkB8B,cAAc7B,SAAS,GACzC6B,cACN;EAACC;EAAkBD;EAAc7B;EACnC,CAAC;CAED,MAAM6D,+BAA+BzG,cAEjC0E,mBACI/B,kBAAkB6B,qBAAqB5B,SAAS,GAChD4B,qBACN;EAACE;EAAkBF;EAAqB5B;EAC1C,CAAC;CAED,MAAM8D,WAAW5F,gBAAgB;EAC/BsB;EACAuE,OAAOP;EACPjC;EACAQ;EACAC;EACAM;EACD,CAAC;CAEF,MAAM0B,qBAAqB7F,YAAY;EACrCsF;EACArB;EACA6B,qBAAqBL,yBAAyBC;EAC/C,CAAC;;;;;;;CAQF,MAAMK,sBAAsB7G,OAC1B,IAAI+C,IAASwD,yBAAyBC,gCAAgC,EAAE,CAC1E,CAAC;CAED,MAAMM,uBAAuB1G,UAAU2G,YAAsB;AAC3DJ,qBAAmBK,kBAAkBD,QAAQ;EAE7C,MAAMzD,WACJkB,iBAAiByC,SACb,IAAIlE,IAASwD,yBAAyB,EAAE,CAAC,GACzCM,oBAAoBK;AAC1BL,sBAAoBK,UAAU,IAAInE,IAASgE,QAAQ;AAEnD,MAAI,CAAC/B,SAAU;EAEf,MAAMmC,UAAU9D,eAAeC,UAAUyD,QAAQ;AACjD,MAAI,CAACI,QAAS;EAEd,MAAMvF,OAAOwE,WAAWnD,IAAIlB,OAAOoF,QAAQnF,IAAI,CAAC;AAChD,MAAI,CAACJ,KAAM;EAEX,MAAMwF,OAAyB;GAC7BC,UAAUF,QAAQ3D;GAClB5B;GACD;AACDoD,WAAS7B,MAAMC,KAAK2D,QAAQ,EAAEK,KAAK;GACnC;;;;;CAMF,MAAME,uBAAuBtH,OAC3B,IAAI+C,IAAS8B,gBAAgBD,uBAAuB,EAAE,CACxD,CAAC;;;;;CAMD,MAAM2C,wBAAwBnH,UAAUoH,cAAyB;AAC/D,MAAI,CAACtC,SAAU;EACf,IAAIuC;AACJ,MAAID,cAAc,OAAO;AAGvBC,SAAM,EAAE;AACR,QAAK,MAAMzF,OAAO0F,MAAMC,WAAWC,SAAS,EAAE;IAC5C,MAAMhG,SAAO8F,MAAMC,WAAWE,QAAQ7F,IAAI;AAC1C,QAAIJ,UAAQA,OAAKkG,SAAS,OAAQL,KAAIhF,KAAKT,IAAI;;QAGjDyF,OAAMtE,MAAMC,KAAKoE,UAAU;EAG7B,MAAMT,YAAU,IAAIhE,IAAS0E,IAAI;EACjC,MAAMnE,aACJuB,iBAAiBoC,SACb,IAAIlE,IAAS8B,gBAAgB,EAAE,CAAC,GAChCyC,qBAAqBJ;AAC3BI,uBAAqBJ,UAAUH;EAE/B,MAAMI,YAAU9D,eAAeC,YAAUyD,UAAQ;AACjD,MAAI,CAACI,UAAS;EAEd,MAAMvF,SAAOwE,WAAWnD,IAAIlB,OAAOoF,UAAQnF,IAAI,CAAC;AAChD,MAAI,CAACJ,OAAM;EAEX,MAAMmG,gBAAgBN,IACnBO,KAAKvE,MAAM2C,WAAWnD,IAAIlB,OAAO0B,EAAE,CAAC,CAAC,CACrCwE,QAAQC,MAA6B,CAAC,CAACA,EAAE;EAE5C,MAAMd,SAAyB;GAC7Be,UAAUhB,UAAQ3D;GAClB5B,MAAAA;GACAmG;GACD;AAED7C,WAASuC,KAAKL,OAAK;GACnB;CAEF,MAAMgB,cAAclD,YAAY;CAEhC,MAAMmD,YAAYtI,eACT;EACL6D;EACAiB;EACAD;EACA0D,mBACEF,eAAexE,kBAAkB,SAC7B2D,wBACAN;EACNzC,cAAc+B;EACdhC,qBAAqBiC;EACrB+B,kBAAkBzB;EAClBR;EACAkC,kBAAkB;EAClBE,OAAOvG;EACPF,UAAUN;EACV,cAAc0D,aAAa;EAC5B,GACD;EACEzB;EACAiB;EACAD;EACAwD;EACAb;EACAhB;EACAC;EACAM;EACAR;EACAnE;EACAkD;EAEJ,CAAC;CAED,MAAMsD,YAAYxI,aAA+BkI,UAAU;CAM3D,MAAMX,QAAQ3H,cAAc;EAC1B,MAAM4H,aAAagB,UAAUhB;AAC7B,MAAI,OAAQA,WAAmBiB,gBAAgB,WAC7C,QAAOD;EAET,MAAME,UAAUC,OAAOC,OAAOpB,WAAW;AACzCkB,UAAQD,eAAe5G,UAA+C;GACpE,MAAMJ,SAAO+F,WAAWE,QAAQ7F,MAAI;AACpC,UAAOJ,SAAOuB,MAAMC,KAAKxB,OAAKqH,WAAW,GAAG,EAAE;;AAEhD,SAAO;GAAE,GAAGN;GAAWhB,YAAYkB;GAAS;IAC3C,CAACF,UAAU,CAAC;CAEf,MAAM,EAAEO,cAAcjJ,QAAQoI,WAAWX,OAAOzB,QAAQ;CAExD,MAAMkD,eAAyCpJ,cAAc;EAC3D,MAAMqJ,MAAgC,EAAE;AACxC,OAAK,MAAMpH,SAAO0F,MAAMC,WAAWC,SAAS,EAAE;GAC5C,MAAMhG,SAAO8F,MAAMC,WAAWE,QAAQ7F,MAAI;AAC1C,OAAIJ,UAAQA,OAAKkG,SAAS,OAAQsB,KAAI3G,KAAKb,OAAK;;AAElD,SAAOwH;IACN,CAAC1B,MAAMC,WAAW,CAAC;CAEtB,MAAM0B,kBAAkBrJ,OAAOmJ,aAAa;AAC5CE,iBAAgBnC,UAAUiC;CAG1B,MAAMG,iBAAiB3J,eAAe;EACpC4J,OAAOJ,aAAatG;EACpB2G,wBAAwBtD,UAAUgB;EAClCuC,aAAa/C,UAAkB;AAE7B,UADa2C,gBAAgBnC,QAAQR,QACxB1E,OAAO0E;;EAEtBgD,oBAAoBpJ,MAAMD,iBAAiB+D;EAC3CuF,KAAK;EACLC,UAAU;EACVC,cAAcvF;EACdwF,YAAYxF;EACb,CAAC;CAEF,MAAMyF,YAAYhK,cAAyC;AACzD,MAAI+E,UAAU,KAAM,QAAOmC;AAC3B,SAAO,GAAG,kBAAyC,GAAGnC,OAAM,KAAM;IACjE,CAACA,OAAO,CAAC;CAEZ,MAAMkF,aAAajK,eACV;EACLkK,UAAU;EACVC,OAAO;EACPpF,QAAQ,GAAGwE,eAAea,cAAc,CAAA;EACzC,GACD,CAACb,eAAea,cAAc,CAChC,CAAC;;;;;;;;;;;;;;CAeD,MAAMC,uBAAuBpK,OAAmB,KAAK;CACrD,MAAMqK,wBAAwBrK,OAAsB,KAAK;;;;;;;;;;AAWzDF,uBAAsB;EACpB,MAAMwK,aAAa5C,MAAM6C,iBAAiBD;AAC1C,MAAIA,cAAc,KAAM;AACxB,MAAIF,qBAAqBlD,YAAYoD,WAAY;EAEjD,MAAM5D,UAAQ2C,gBAAgBnC,QAAQsD,WACnCtC,QAAMA,IAAElG,QAAQsI,WAClB;AACD,MAAI5D,UAAQ,EAAG;AAEf4C,iBAAemB,cAAc/D,SAAO,EAAEgE,OAAO,QAAQ,CAAC;AACtDN,uBAAqBlD,UAAUoD;IAC9B,CAAC5C,MAAM6C,iBAAiBD,YAAYhB,eAAe,CAAC;;;;;;;;;;;;;AAcvDxJ,uBAAsB;AACpB,MAAI+E,gBAAgB,KAAM;EAC1B,MAAM8F,SAAS9F,aAAa;AAC5B,MAAI8F,UAAU,KAAM;AACpB,MAAIN,sBAAsBnD,YAAYyD,OAAQ;EAE9C,MAAMjE,UAAQyC,aAAaqB,WAAWtC,QAAMnG,OAAOmG,IAAElG,IAAI,KAAK2I,OAAO;AACrE,MAAIjE,UAAQ,EAAG;AAEf4C,iBAAemB,cAAc/D,SAAO,EAAEgE,OAAO,QAAQ,CAAC;AACtDL,wBAAsBnD,UAAUyD;IAC/B;EAAC9F;EAAcsE;EAAcG;EAAe,CAAC;CAEhD,MAAMsB,OAAO7K,eACJ;EACL,cAAc+E,UAAU;EACxBT;EACD,GACD,CAACS,QAAQT,MACX,CAAC;CAMD,MAAMwG,kBAAkB9K,cAChBQ,UAAUyD,KAAKkC,UAAU,EAC/B,CAAClC,KAAKkC,UACR,CAAC;AAED,QACE,oBAAC;EACC,GAAIgD;EACJ,KAAKjD;EACL,IAAIX,MAAM;EACJsF;EACN,QAAQ5E;EACR,OAAO+D;YAEP,oBAAC;GAAoB,KAAKc;aACxB,oBAAC;IAAI,MAAK;IAAe,OAAOb;cAC7BV,eAAewB,iBAAiB,CAAC9C,KAAK+C,gBAAgB;KACrD,MAAMnJ,SAAOuH,aAAa4B,YAAYrE;AACtC,SAAI,CAAC9E,OAAM,QAAO;KAClB,MAAMoJ,SAASjJ,OAAOH,OAAKI,IAAI;KAC/B,MAAMiJ,OAAO7E,WAAWnD,IAAI+H,OAAO;AACnC,SAAI,CAACC,KAAM,QAAO;AAClB,YACE,oBAAC;MAEC,MAAMrJ;MACAqJ;MACCvD;MACMxD;MACb,YAAYwD,MAAMlD,aAAad,IAAI9B,OAAKI,IAAI;MAC5C,WAAWyE,SAASyE,WAAWxH,IAAIsH,OAAO;MAC1C,iBAAiBvE,SAAS0E,eAAezH,IAAIsH,OAAO;MACpD,WAAWrE,mBAAmByE,YAAY1H,IAAIsH,OAAO;MAC/C5G;MACKe;MACAC;MACX,cAAc;OACZ6E,UAAU;OACVoB,KAAK;OACLC,MAAMhH;OACNiH,OAAOjH;OACPkH,WAAW,cAAcT,YAAYU,MAAK;OAC3C;MACD,YAAYnC,eAAeoC;MAC3B,cAAcX,YAAYrE;MAC1B,MAAMlB;MACN,aAAaE;MACKG;MACPC;MACX,iBAAiBW,SAASkF;MAC1B,UAAU/F;QA1BLhE,OAAKI,IA2BV;MAEJ;KACC;IACc;GACT;;AAIlB,MAAM4J,QAAQ/L,WAAWiE,SAAS;AAClC8H,MAAMC,cAAc;;;;;;;;;;;;;;;;;;;AAoBpB,MAAaC,OAAOF"}
|
|
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","treeStyle","sizerStyle","position","width","getTotalSize","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 treeStyle = useMemo<CSSProperties | undefined>(() => {\n if (height == null) return undefined;\n return { ['--tree-height' as keyof CSSProperties]: `${height}px` };\n }, [height]);\n\n const sizerStyle = useMemo<CSSProperties>(\n () => ({\n position: 'relative',\n width: '100%',\n height: `${rowVirtualizer.getTotalSize()}px`,\n }),\n [rowVirtualizer.getTotalSize()],\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 style={treeStyle}\n >\n <TreeScrollContainer ref={mergedScrollRef}>\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,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | 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";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { _Item } from "../Item/Item.js";
|
|
3
3
|
import { Action } from "../../actions/Action/Action.js";
|
|
4
4
|
import { tasty } from "@tenphi/tasty";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
import { CubeMenuProps } from "../../actions/Menu/Menu.js";
|
|
3
|
-
import { CubeItemProps } from "../Item/Item.js";
|
|
4
2
|
import { CubeItemActionProps } from "../../actions/ItemAction/ItemAction.js";
|
|
5
3
|
import "../../actions/ItemAction/index.js";
|
|
4
|
+
import { CubeMenuProps } from "../../actions/Menu/Menu.js";
|
|
6
5
|
import "../../actions/Menu/index.js";
|
|
6
|
+
import { CubeItemProps } from "../Item/Item.js";
|
|
7
7
|
import { SizeName } from "../../../tokens/sizes.js";
|
|
8
8
|
import { BaseProps, OuterStyleProps, Styles } from "@tenphi/tasty";
|
|
9
9
|
import { ReactNode } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { c } from "react/compiler-runtime";
|
|
4
4
|
import { useState } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { isDevEnvOrTest } from "../../../utils/is-dev-env.js";
|
|
4
4
|
import { c } from "react/compiler-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { TooltipProvider } from "../overlays/Tooltip/TooltipProvider.js";
|
|
3
3
|
import { c } from "react/compiler-runtime";
|
|
4
4
|
import { useEffect, useRef, useState } from "react";
|
|
@@ -312,7 +312,8 @@ function useAutoTooltip(t0) {
|
|
|
312
312
|
isAutoTooltipEnabled,
|
|
313
313
|
hasTooltip: t16,
|
|
314
314
|
isTooltipActive,
|
|
315
|
-
renderWithTooltip
|
|
315
|
+
renderWithTooltip,
|
|
316
|
+
scheduleOverflowCheck
|
|
316
317
|
};
|
|
317
318
|
$[35] = finalLabelProps;
|
|
318
319
|
$[36] = handleDescriptionElementRef;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-auto-tooltip.js","names":["HTMLAttributes","ReactNode","Ref","RefObject","useCallback","useEffect","useRef","useState","PositionProps","flushSync","CubeTooltipProviderProps","TooltipProvider","Props","AutoTooltipValue","Omit","auto","UseAutoTooltipOptions","tooltip","children","description","labelProps","isDynamicLabel","labelRef","HTMLElement","descriptionRef","assignRef","ref","element","current","pendingOverflowChecks","Set","overflowChecksByNode","WeakMap","refreshAutoTooltipsWithin","node","Array","from","querySelectorAll","get","forEach","queueOverflowCheck","runOverflowChecks","checks","clear","check","size","queueMicrotask","add","allowsAutoTooltip","title","undefined","Truncation","getAutoTitle","truncation","resolveTooltip","isOverflowed","autoTitle","hasAutoContent","isDisabled","tooltipProps","isTruncated","scrollWidth","clientWidth","measureTruncation","label","isLabelCut","isDescriptionCut","MeasuredNodes","observer","ResizeObserver","observeMeasuredNodes","measured","onResize","disconnect","observe","useAutoTooltip","t0","$","_c","t1","labelRefOption","descriptionRefOption","t2","allowsAuto","isLabelMeasured","isDescriptionMeasured","isAutoTooltipEnabled","externalLabelRef","setTruncation","t3","Symbol","for","measuredRef","verdictRef","t4","value","setVerdict","t5","description_0","checkOverflow","t6","scheduleOverflowCheck","measuredLabel","measuredDescription","t7","t8","t9","part","previous","delete","checks_0","set","attachMeasuredNode","t10","element_0","handleLabelElementRef","t11","element_1","handleDescriptionElementRef","t12","finalLabelProps","_labelPropsRef","t13","resolvedTooltip","isTooltipActive","t14","renderElement","defaultTooltipPlacement","triggerProps","renderWithTooltip","t15","t16","t17","hasTooltip"],"sources":["../../../src/components/content/use-auto-tooltip.tsx"],"sourcesContent":["import {\n HTMLAttributes,\n ReactNode,\n Ref,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { PositionProps } from 'react-aria';\nimport { flushSync } from 'react-dom';\n\nimport {\n CubeTooltipProviderProps,\n TooltipProvider,\n} from '../overlays/Tooltip/TooltipProvider';\n\nimport type { Props } from '../../props';\n\nexport type AutoTooltipValue =\n | string\n | boolean\n | (Omit<CubeTooltipProviderProps, 'children'> & { auto?: boolean });\n\nexport interface UseAutoTooltipOptions {\n tooltip: AutoTooltipValue | undefined;\n children: ReactNode;\n /**\n * Secondary text that truncates alongside the label, such as `Item`'s\n * description. A string description is measured with the label, and the auto\n * tooltip shows whichever of the two is cut off.\n */\n description?: ReactNode;\n labelProps?: Props;\n isDynamicLabel?: boolean;\n /**\n * The caller's own ref to the label element. The hook owns the label's ref\n * (it measures the node), so a caller that also needs the node hands its ref\n * over here rather than attaching a second one.\n */\n labelRef?: Ref<HTMLElement>;\n /** The caller's own ref to the description element, as `labelRef`. */\n descriptionRef?: Ref<HTMLElement>;\n}\n\nfunction assignRef(ref: unknown, element: HTMLElement | null) {\n if (typeof ref === 'function') {\n ref(element);\n } else if (ref) {\n (ref as { current: HTMLElement | null }).current = element;\n }\n}\n\n/** Overflow checks queued for the end of the current task, from every label. */\nconst pendingOverflowChecks = new Set<() => void>();\nconst overflowChecksByNode = new WeakMap<HTMLElement, Set<() => void>>();\n\n/** Refresh a retained tooltip tree after inherited appearance changes. */\nexport function refreshAutoTooltipsWithin(element: HTMLElement) {\n for (const node of [\n element,\n ...Array.from(element.querySelectorAll<HTMLElement>('*')),\n ]) {\n overflowChecksByNode.get(node)?.forEach(queueOverflowCheck);\n }\n}\n\n/**\n * Runs every queued check in one pass and commits the verdicts that changed in\n * one synchronous render.\n *\n * All reads happen before React touches the DOM again, so they share one\n * layout. `flushSync` applies the verdicts, and the `TooltipProvider` remounts\n * they cause, before paint and before any other task, so code that looks the\n * label up after this task gets the node the verdict leaves in place, not one\n * about to be replaced. Outside a React commit this is an ordinary sync\n * render, not a nested update.\n */\nfunction runOverflowChecks() {\n const checks = Array.from(pendingOverflowChecks);\n\n pendingOverflowChecks.clear();\n\n flushSync(() => {\n for (const check of checks) check();\n });\n}\n\nfunction queueOverflowCheck(check: () => void) {\n if (!pendingOverflowChecks.size) queueMicrotask(runOverflowChecks);\n\n pendingOverflowChecks.add(check);\n}\n\n/**\n * Whether the tooltip value asks to detect overflow on its own. What it\n * measures is decided separately: overflow detection measures text, so only a\n * string label or description takes part.\n */\nfunction allowsAutoTooltip(tooltip: AutoTooltipValue | undefined): boolean {\n // Boolean true enables auto overflow detection\n if (tooltip === true) return true;\n if (typeof tooltip === 'object') {\n // If title is provided and auto is explicitly true, enable auto overflow detection\n if (tooltip.title) {\n return tooltip.auto === true;\n }\n\n // If no title is provided, default to auto=true unless explicitly disabled\n return tooltip.auto !== undefined ? !!tooltip.auto : true;\n }\n return false;\n}\n\n/** Which measured parts are cut off. */\ntype Truncation = 'none' | 'label' | 'description' | 'both';\n\n/**\n * What the auto tooltip shows: the text that is cut off, and nothing the row\n * already shows in full. When both parts are, the description goes below the\n * label as the tooltip's `Description`, styled as secondary text.\n */\nfunction getAutoTitle(\n children: ReactNode,\n description: ReactNode,\n truncation: Truncation,\n): ReactNode {\n if (truncation === 'description') return description;\n if (truncation === 'both') {\n return (\n <>\n {children}\n <div data-element=\"Description\">{description}</div>\n </>\n );\n }\n\n // The label is cut off, or nothing is and the tooltip stays mounted but\n // disabled for a dynamic label.\n return children;\n}\n\n/**\n * The `TooltipProvider` props a tooltip resolves to, or `null` when no tooltip\n * is rendered at all.\n */\nfunction resolveTooltip({\n tooltip,\n children,\n description,\n labelProps,\n isDynamicLabel,\n truncation,\n}: Omit<UseAutoTooltipOptions, 'labelRef' | 'descriptionRef'> & {\n truncation: Truncation;\n}): Omit<CubeTooltipProviderProps, 'children'> | null {\n if (!tooltip) return null;\n\n // String tooltip - simple case\n if (typeof tooltip === 'string') {\n return { title: tooltip };\n }\n\n const isOverflowed = truncation !== 'none';\n const autoTitle = getAutoTitle(children, description, truncation);\n const hasAutoContent =\n !!(autoTitle || labelProps) && (isOverflowed || isDynamicLabel);\n\n // Boolean tooltip - auto tooltip on overflow\n if (tooltip === true) {\n if (!hasAutoContent) return null;\n\n return {\n title: autoTitle,\n isDisabled: !isOverflowed && isDynamicLabel,\n };\n }\n\n // Object tooltip - advanced configuration\n const { auto, ...tooltipProps } = tooltip;\n\n // If title is provided and auto is not explicitly true, always show the tooltip\n if (tooltipProps.title && auto !== true) {\n return tooltipProps;\n }\n\n // If title is provided with auto=true, OR no title but auto behavior enabled\n if (!hasAutoContent) return null;\n\n return {\n title: tooltipProps.title ?? autoTitle,\n isDisabled:\n !isOverflowed && isDynamicLabel && tooltipProps.isDisabled !== true,\n ...tooltipProps,\n };\n}\n\n/** Whether a measured node's text is cut off. */\nfunction isTruncated(element: HTMLElement | null): boolean {\n return !!element && element.scrollWidth > element.clientWidth;\n}\n\nfunction measureTruncation(\n label: HTMLElement | null,\n description: HTMLElement | null,\n): Truncation {\n const isLabelCut = isTruncated(label);\n const isDescriptionCut = isTruncated(description);\n\n if (isLabelCut) return isDescriptionCut ? 'both' : 'label';\n\n return isDescriptionCut ? 'description' : 'none';\n}\n\ninterface MeasuredNodes {\n label: HTMLElement | null;\n description: HTMLElement | null;\n observer: ResizeObserver | null;\n}\n\n/**\n * Points the hook's one observer at the nodes now measured, so a row with a\n * label and a description still costs a single observer. It re-points by\n * disconnecting and observing again rather than with `unobserve`: those are\n * the only two calls the hook has ever made, so a consumer's test stub that\n * implements just them keeps working.\n */\nfunction observeMeasuredNodes(measured: MeasuredNodes, onResize: () => void) {\n try {\n measured.observer?.disconnect();\n } catch {\n // do nothing\n }\n\n const { label, description } = measured;\n\n if (!label && !description) return;\n\n measured.observer ??= new ResizeObserver(() => onResize());\n\n if (label) measured.observer.observe(label);\n if (description) measured.observer.observe(description);\n}\n\nexport function useAutoTooltip({\n tooltip,\n children,\n description,\n labelProps,\n isDynamicLabel = false,\n labelRef: labelRefOption,\n descriptionRef: descriptionRefOption,\n}: UseAutoTooltipOptions) {\n const allowsAuto = allowsAutoTooltip(tooltip);\n const isLabelMeasured = allowsAuto && typeof children === 'string';\n const isDescriptionMeasured = allowsAuto && typeof description === 'string';\n const isAutoTooltipEnabled = isLabelMeasured || isDescriptionMeasured;\n\n // Track overflow for auto tooltip (only when enabled)\n const externalLabelRef = (labelProps as any)?.ref;\n const [truncation, setTruncation] = useState<Truncation>('none');\n // The nodes being measured, and the one observer watching all of them.\n const measuredRef = useRef<MeasuredNodes>({\n label: null,\n description: null,\n observer: null,\n });\n\n const verdictRef = useRef<Truncation>('none');\n\n /**\n * Sets the verdict only when it changes. React skips an unchanged `setState`\n * only while the component has no other update queued; otherwise the no-op is\n * enqueued like any other update. From an effect flushed inside a sync commit\n * that is a pending update, and a nested one — see the mount effect below.\n * Mirroring the verdict makes every unchanged write free, whatever else the\n * component has queued.\n */\n const setVerdict = useCallback((value: Truncation) => {\n if (verdictRef.current === value) return;\n\n verdictRef.current = value;\n setTruncation(value);\n }, []);\n\n const checkOverflow = useCallback(() => {\n const { label, description } = measuredRef.current;\n\n if (!label && !description) return;\n\n setVerdict(measureTruncation(label, description));\n }, [setVerdict]);\n\n /**\n * Measure once the current task has finished, not inside it.\n *\n * A microtask runs after React's whole commit — every mutation, layout effect\n * and ref attachment — and before paint. Every label on the page therefore\n * reads after all of them have written, so the reads collapse into one style\n * and layout flush instead of forcing one each, mid-commit. Reading straight\n * from the callback ref is what cost 122ms of `get scrollWidth` in one Cloud\n * profile, more than the entire style engine.\n *\n * A microtask rather than the observer's first delivery: observer callbacks\n * are part of the rendering steps, so a runner that is not producing frames —\n * a background tab, or a headless browser running many stories at once — can\n * delay them past the point something asks whether the tooltip is active.\n * Microtasks do not depend on a frame. See `runOverflowChecks` for how the\n * verdicts are applied.\n */\n const scheduleOverflowCheck = useCallback(() => {\n queueOverflowCheck(checkOverflow);\n }, [checkOverflow]);\n\n // Text can change its overflow without changing the observed box size.\n const measuredLabel = isLabelMeasured ? children : undefined;\n const measuredDescription = isDescriptionMeasured ? description : undefined;\n\n useEffect(() => {\n if (isAutoTooltipEnabled) {\n // Queued, not measured here. React 19 flushes a sync commit's passive\n // effects before the commit returns, so a verdict set from this effect\n // leaves that commit with an update pending — a nested update. A list\n // that commits each row on its own (ag-grid-react wraps every new row in\n // `flushSync`) then gains one per row, and React throws \"Maximum update\n // depth exceeded\" once the count passes 50. The queued check runs after\n // the commit and still before paint. The callback refs have usually\n // queued it already, so this call is absorbed. It matters when what is\n // measured changes without a node re-attaching — the description stops\n // being a string, say, while the label stays.\n scheduleOverflowCheck();\n\n return;\n }\n\n // Clearing here rather than in the callback ref, which cannot be trusted\n // to do it. Flipping `isAutoTooltipEnabled` changes the ref's identity, so\n // React detaches with the PREVIOUS callback — the one that still believes\n // auto tooltips are on, and therefore keeps the last verdict — and only\n // attaches the new one if the label still exists. When `children` stops\n // being a string the label unmounts, so the new callback never runs and a\n // stale verdict would keep an auto tooltip mounted over content that is no\n // longer text. That is the default `Button` path, where `tooltip` is `true`.\n setVerdict('none');\n }, [\n isAutoTooltipEnabled,\n isLabelMeasured,\n isDescriptionMeasured,\n measuredLabel,\n measuredDescription,\n scheduleOverflowCheck,\n setVerdict,\n ]);\n\n // The callback refs own the observer: React hands them `null` when a node\n // goes away. Effect cleanup must not discard nodes still owned by refs:\n // reconnecting effects would otherwise strand queued measurements. Let\n // attachment/detachment update observer ownership symmetrically.\n const attachMeasuredNode = useCallback(\n (part: 'label' | 'description', element: HTMLElement | null) => {\n const measured = measuredRef.current;\n\n const previous = measured[part];\n measured[part] = element;\n\n if (\n previous &&\n previous !== measured.label &&\n previous !== measured.description\n ) {\n const checks = overflowChecksByNode.get(previous);\n checks?.delete(checkOverflow);\n if (!checks?.size) overflowChecksByNode.delete(previous);\n }\n if (element) {\n const checks = overflowChecksByNode.get(element) ?? new Set();\n checks.add(checkOverflow);\n overflowChecksByNode.set(element, checks);\n }\n\n // The observer covers every later size change.\n observeMeasuredNodes(measured, checkOverflow);\n\n // No node to measure. Leave the previous verdict alone rather than\n // clearing it: turning the verdict on mounts `TooltipProvider`, which\n // remounts the label underneath it, so React detaches the old node and\n // attaches a new one within that commit. Clearing here would unmount the\n // provider, remount the label, measure it, mount the provider again — a\n // loop that never settles.\n if (!element) return;\n\n // Do NOT measure synchronously here — see `scheduleOverflowCheck`. This\n // covers the node the ref just handed us, including the fresh one React\n // creates when `TooltipProvider` mounts and remounts the element.\n scheduleOverflowCheck();\n },\n [checkOverflow, scheduleOverflowCheck],\n );\n\n const handleLabelElementRef = useCallback(\n (element: HTMLElement | null) => {\n // Notify the external refs\n assignRef(externalLabelRef, element);\n assignRef(labelRefOption, element);\n\n attachMeasuredNode('label', isLabelMeasured ? element : null);\n },\n [externalLabelRef, labelRefOption, isLabelMeasured, attachMeasuredNode],\n );\n\n const handleDescriptionElementRef = useCallback(\n (element: HTMLElement | null) => {\n assignRef(descriptionRefOption, element);\n\n attachMeasuredNode('description', isDescriptionMeasured ? element : null);\n },\n [descriptionRefOption, isDescriptionMeasured, attachMeasuredNode],\n );\n\n const { ref: _labelPropsRef, ...finalLabelProps } = labelProps || {};\n\n // Resolved once so that both the rendering below and `isTooltipActive` speak\n // about the same tooltip.\n const resolvedTooltip = resolveTooltip({\n tooltip,\n children,\n description,\n labelProps,\n isDynamicLabel,\n truncation,\n });\n\n /** Whether a tooltip is rendered and able to open. */\n const isTooltipActive =\n !!resolvedTooltip && resolvedTooltip.isDisabled !== true;\n\n const renderWithTooltip = (\n renderElement: (\n tooltipTriggerProps?: HTMLAttributes<HTMLElement>,\n tooltipRef?: RefObject<HTMLElement>,\n ) => ReactNode,\n defaultTooltipPlacement: PositionProps['placement'],\n ) => {\n if (!resolvedTooltip) return renderElement();\n\n return (\n <TooltipProvider placement={defaultTooltipPlacement} {...resolvedTooltip}>\n {(triggerProps, ref) => renderElement(triggerProps, ref)}\n </TooltipProvider>\n );\n };\n\n return {\n labelRef: handleLabelElementRef,\n descriptionRef: handleDescriptionElementRef,\n labelProps: finalLabelProps,\n isOverflowed: truncation !== 'none',\n isAutoTooltipEnabled,\n hasTooltip: !!tooltip,\n isTooltipActive,\n renderWithTooltip,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-auto-tooltip.js","names":["HTMLAttributes","ReactNode","Ref","RefObject","useCallback","useEffect","useRef","useState","PositionProps","flushSync","CubeTooltipProviderProps","TooltipProvider","Props","AutoTooltipValue","Omit","auto","UseAutoTooltipOptions","tooltip","children","description","labelProps","isDynamicLabel","labelRef","HTMLElement","descriptionRef","assignRef","ref","element","current","pendingOverflowChecks","Set","overflowChecksByNode","WeakMap","refreshAutoTooltipsWithin","node","Array","from","querySelectorAll","get","forEach","queueOverflowCheck","runOverflowChecks","checks","clear","check","size","queueMicrotask","add","allowsAutoTooltip","title","undefined","Truncation","getAutoTitle","truncation","resolveTooltip","isOverflowed","autoTitle","hasAutoContent","isDisabled","tooltipProps","isTruncated","scrollWidth","clientWidth","measureTruncation","label","isLabelCut","isDescriptionCut","MeasuredNodes","observer","ResizeObserver","observeMeasuredNodes","measured","onResize","disconnect","observe","useAutoTooltip","t0","$","_c","t1","labelRefOption","descriptionRefOption","t2","allowsAuto","isLabelMeasured","isDescriptionMeasured","isAutoTooltipEnabled","externalLabelRef","setTruncation","t3","Symbol","for","measuredRef","verdictRef","t4","value","setVerdict","t5","description_0","checkOverflow","t6","scheduleOverflowCheck","measuredLabel","measuredDescription","t7","t8","t9","part","previous","delete","checks_0","set","attachMeasuredNode","t10","element_0","handleLabelElementRef","t11","element_1","handleDescriptionElementRef","t12","finalLabelProps","_labelPropsRef","t13","resolvedTooltip","isTooltipActive","t14","renderElement","defaultTooltipPlacement","triggerProps","renderWithTooltip","t15","t16","t17","hasTooltip"],"sources":["../../../src/components/content/use-auto-tooltip.tsx"],"sourcesContent":["import {\n HTMLAttributes,\n ReactNode,\n Ref,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { PositionProps } from 'react-aria';\nimport { flushSync } from 'react-dom';\n\nimport {\n CubeTooltipProviderProps,\n TooltipProvider,\n} from '../overlays/Tooltip/TooltipProvider';\n\nimport type { Props } from '../../props';\n\nexport type AutoTooltipValue =\n | string\n | boolean\n | (Omit<CubeTooltipProviderProps, 'children'> & { auto?: boolean });\n\nexport interface UseAutoTooltipOptions {\n tooltip: AutoTooltipValue | undefined;\n children: ReactNode;\n /**\n * Secondary text that truncates alongside the label, such as `Item`'s\n * description. A string description is measured with the label, and the auto\n * tooltip shows whichever of the two is cut off.\n */\n description?: ReactNode;\n labelProps?: Props;\n isDynamicLabel?: boolean;\n /**\n * The caller's own ref to the label element. The hook owns the label's ref\n * (it measures the node), so a caller that also needs the node hands its ref\n * over here rather than attaching a second one.\n */\n labelRef?: Ref<HTMLElement>;\n /** The caller's own ref to the description element, as `labelRef`. */\n descriptionRef?: Ref<HTMLElement>;\n}\n\nfunction assignRef(ref: unknown, element: HTMLElement | null) {\n if (typeof ref === 'function') {\n ref(element);\n } else if (ref) {\n (ref as { current: HTMLElement | null }).current = element;\n }\n}\n\n/** Overflow checks queued for the end of the current task, from every label. */\nconst pendingOverflowChecks = new Set<() => void>();\nconst overflowChecksByNode = new WeakMap<HTMLElement, Set<() => void>>();\n\n/** Refresh a retained tooltip tree after inherited appearance changes. */\nexport function refreshAutoTooltipsWithin(element: HTMLElement) {\n for (const node of [\n element,\n ...Array.from(element.querySelectorAll<HTMLElement>('*')),\n ]) {\n overflowChecksByNode.get(node)?.forEach(queueOverflowCheck);\n }\n}\n\n/**\n * Runs every queued check in one pass and commits the verdicts that changed in\n * one synchronous render.\n *\n * All reads happen before React touches the DOM again, so they share one\n * layout. `flushSync` applies the verdicts, and the `TooltipProvider` remounts\n * they cause, before paint and before any other task, so code that looks the\n * label up after this task gets the node the verdict leaves in place, not one\n * about to be replaced. Outside a React commit this is an ordinary sync\n * render, not a nested update.\n */\nfunction runOverflowChecks() {\n const checks = Array.from(pendingOverflowChecks);\n\n pendingOverflowChecks.clear();\n\n flushSync(() => {\n for (const check of checks) check();\n });\n}\n\nfunction queueOverflowCheck(check: () => void) {\n if (!pendingOverflowChecks.size) queueMicrotask(runOverflowChecks);\n\n pendingOverflowChecks.add(check);\n}\n\n/**\n * Whether the tooltip value asks to detect overflow on its own. What it\n * measures is decided separately: overflow detection measures text, so only a\n * string label or description takes part.\n */\nfunction allowsAutoTooltip(tooltip: AutoTooltipValue | undefined): boolean {\n // Boolean true enables auto overflow detection\n if (tooltip === true) return true;\n if (typeof tooltip === 'object') {\n // If title is provided and auto is explicitly true, enable auto overflow detection\n if (tooltip.title) {\n return tooltip.auto === true;\n }\n\n // If no title is provided, default to auto=true unless explicitly disabled\n return tooltip.auto !== undefined ? !!tooltip.auto : true;\n }\n return false;\n}\n\n/** Which measured parts are cut off. */\ntype Truncation = 'none' | 'label' | 'description' | 'both';\n\n/**\n * What the auto tooltip shows: the text that is cut off, and nothing the row\n * already shows in full. When both parts are, the description goes below the\n * label as the tooltip's `Description`, styled as secondary text.\n */\nfunction getAutoTitle(\n children: ReactNode,\n description: ReactNode,\n truncation: Truncation,\n): ReactNode {\n if (truncation === 'description') return description;\n if (truncation === 'both') {\n return (\n <>\n {children}\n <div data-element=\"Description\">{description}</div>\n </>\n );\n }\n\n // The label is cut off, or nothing is and the tooltip stays mounted but\n // disabled for a dynamic label.\n return children;\n}\n\n/**\n * The `TooltipProvider` props a tooltip resolves to, or `null` when no tooltip\n * is rendered at all.\n */\nfunction resolveTooltip({\n tooltip,\n children,\n description,\n labelProps,\n isDynamicLabel,\n truncation,\n}: Omit<UseAutoTooltipOptions, 'labelRef' | 'descriptionRef'> & {\n truncation: Truncation;\n}): Omit<CubeTooltipProviderProps, 'children'> | null {\n if (!tooltip) return null;\n\n // String tooltip - simple case\n if (typeof tooltip === 'string') {\n return { title: tooltip };\n }\n\n const isOverflowed = truncation !== 'none';\n const autoTitle = getAutoTitle(children, description, truncation);\n const hasAutoContent =\n !!(autoTitle || labelProps) && (isOverflowed || isDynamicLabel);\n\n // Boolean tooltip - auto tooltip on overflow\n if (tooltip === true) {\n if (!hasAutoContent) return null;\n\n return {\n title: autoTitle,\n isDisabled: !isOverflowed && isDynamicLabel,\n };\n }\n\n // Object tooltip - advanced configuration\n const { auto, ...tooltipProps } = tooltip;\n\n // If title is provided and auto is not explicitly true, always show the tooltip\n if (tooltipProps.title && auto !== true) {\n return tooltipProps;\n }\n\n // If title is provided with auto=true, OR no title but auto behavior enabled\n if (!hasAutoContent) return null;\n\n return {\n title: tooltipProps.title ?? autoTitle,\n isDisabled:\n !isOverflowed && isDynamicLabel && tooltipProps.isDisabled !== true,\n ...tooltipProps,\n };\n}\n\n/** Whether a measured node's text is cut off. */\nfunction isTruncated(element: HTMLElement | null): boolean {\n return !!element && element.scrollWidth > element.clientWidth;\n}\n\nfunction measureTruncation(\n label: HTMLElement | null,\n description: HTMLElement | null,\n): Truncation {\n const isLabelCut = isTruncated(label);\n const isDescriptionCut = isTruncated(description);\n\n if (isLabelCut) return isDescriptionCut ? 'both' : 'label';\n\n return isDescriptionCut ? 'description' : 'none';\n}\n\ninterface MeasuredNodes {\n label: HTMLElement | null;\n description: HTMLElement | null;\n observer: ResizeObserver | null;\n}\n\n/**\n * Points the hook's one observer at the nodes now measured, so a row with a\n * label and a description still costs a single observer. It re-points by\n * disconnecting and observing again rather than with `unobserve`: those are\n * the only two calls the hook has ever made, so a consumer's test stub that\n * implements just them keeps working.\n */\nfunction observeMeasuredNodes(measured: MeasuredNodes, onResize: () => void) {\n try {\n measured.observer?.disconnect();\n } catch {\n // do nothing\n }\n\n const { label, description } = measured;\n\n if (!label && !description) return;\n\n measured.observer ??= new ResizeObserver(() => onResize());\n\n if (label) measured.observer.observe(label);\n if (description) measured.observer.observe(description);\n}\n\nexport function useAutoTooltip({\n tooltip,\n children,\n description,\n labelProps,\n isDynamicLabel = false,\n labelRef: labelRefOption,\n descriptionRef: descriptionRefOption,\n}: UseAutoTooltipOptions) {\n const allowsAuto = allowsAutoTooltip(tooltip);\n const isLabelMeasured = allowsAuto && typeof children === 'string';\n const isDescriptionMeasured = allowsAuto && typeof description === 'string';\n const isAutoTooltipEnabled = isLabelMeasured || isDescriptionMeasured;\n\n // Track overflow for auto tooltip (only when enabled)\n const externalLabelRef = (labelProps as any)?.ref;\n const [truncation, setTruncation] = useState<Truncation>('none');\n // The nodes being measured, and the one observer watching all of them.\n const measuredRef = useRef<MeasuredNodes>({\n label: null,\n description: null,\n observer: null,\n });\n\n const verdictRef = useRef<Truncation>('none');\n\n /**\n * Sets the verdict only when it changes. React skips an unchanged `setState`\n * only while the component has no other update queued; otherwise the no-op is\n * enqueued like any other update. From an effect flushed inside a sync commit\n * that is a pending update, and a nested one — see the mount effect below.\n * Mirroring the verdict makes every unchanged write free, whatever else the\n * component has queued.\n */\n const setVerdict = useCallback((value: Truncation) => {\n if (verdictRef.current === value) return;\n\n verdictRef.current = value;\n setTruncation(value);\n }, []);\n\n const checkOverflow = useCallback(() => {\n const { label, description } = measuredRef.current;\n\n if (!label && !description) return;\n\n setVerdict(measureTruncation(label, description));\n }, [setVerdict]);\n\n /**\n * Measure once the current task has finished, not inside it.\n *\n * A microtask runs after React's whole commit — every mutation, layout effect\n * and ref attachment — and before paint. Every label on the page therefore\n * reads after all of them have written, so the reads collapse into one style\n * and layout flush instead of forcing one each, mid-commit. Reading straight\n * from the callback ref is what cost 122ms of `get scrollWidth` in one Cloud\n * profile, more than the entire style engine.\n *\n * A microtask rather than the observer's first delivery: observer callbacks\n * are part of the rendering steps, so a runner that is not producing frames —\n * a background tab, or a headless browser running many stories at once — can\n * delay them past the point something asks whether the tooltip is active.\n * Microtasks do not depend on a frame. See `runOverflowChecks` for how the\n * verdicts are applied.\n */\n const scheduleOverflowCheck = useCallback(() => {\n queueOverflowCheck(checkOverflow);\n }, [checkOverflow]);\n\n // Text can change its overflow without changing the observed box size.\n const measuredLabel = isLabelMeasured ? children : undefined;\n const measuredDescription = isDescriptionMeasured ? description : undefined;\n\n useEffect(() => {\n if (isAutoTooltipEnabled) {\n // Queued, not measured here. React 19 flushes a sync commit's passive\n // effects before the commit returns, so a verdict set from this effect\n // leaves that commit with an update pending — a nested update. A list\n // that commits each row on its own (ag-grid-react wraps every new row in\n // `flushSync`) then gains one per row, and React throws \"Maximum update\n // depth exceeded\" once the count passes 50. The queued check runs after\n // the commit and still before paint. The callback refs have usually\n // queued it already, so this call is absorbed. It matters when what is\n // measured changes without a node re-attaching — the description stops\n // being a string, say, while the label stays.\n scheduleOverflowCheck();\n\n return;\n }\n\n // Clearing here rather than in the callback ref, which cannot be trusted\n // to do it. Flipping `isAutoTooltipEnabled` changes the ref's identity, so\n // React detaches with the PREVIOUS callback — the one that still believes\n // auto tooltips are on, and therefore keeps the last verdict — and only\n // attaches the new one if the label still exists. When `children` stops\n // being a string the label unmounts, so the new callback never runs and a\n // stale verdict would keep an auto tooltip mounted over content that is no\n // longer text. That is the default `Button` path, where `tooltip` is `true`.\n setVerdict('none');\n }, [\n isAutoTooltipEnabled,\n isLabelMeasured,\n isDescriptionMeasured,\n measuredLabel,\n measuredDescription,\n scheduleOverflowCheck,\n setVerdict,\n ]);\n\n // The callback refs own the observer: React hands them `null` when a node\n // goes away. Effect cleanup must not discard nodes still owned by refs:\n // reconnecting effects would otherwise strand queued measurements. Let\n // attachment/detachment update observer ownership symmetrically.\n const attachMeasuredNode = useCallback(\n (part: 'label' | 'description', element: HTMLElement | null) => {\n const measured = measuredRef.current;\n\n const previous = measured[part];\n measured[part] = element;\n\n if (\n previous &&\n previous !== measured.label &&\n previous !== measured.description\n ) {\n const checks = overflowChecksByNode.get(previous);\n checks?.delete(checkOverflow);\n if (!checks?.size) overflowChecksByNode.delete(previous);\n }\n if (element) {\n const checks = overflowChecksByNode.get(element) ?? new Set();\n checks.add(checkOverflow);\n overflowChecksByNode.set(element, checks);\n }\n\n // The observer covers every later size change.\n observeMeasuredNodes(measured, checkOverflow);\n\n // No node to measure. Leave the previous verdict alone rather than\n // clearing it: turning the verdict on mounts `TooltipProvider`, which\n // remounts the label underneath it, so React detaches the old node and\n // attaches a new one within that commit. Clearing here would unmount the\n // provider, remount the label, measure it, mount the provider again — a\n // loop that never settles.\n if (!element) return;\n\n // Do NOT measure synchronously here — see `scheduleOverflowCheck`. This\n // covers the node the ref just handed us, including the fresh one React\n // creates when `TooltipProvider` mounts and remounts the element.\n scheduleOverflowCheck();\n },\n [checkOverflow, scheduleOverflowCheck],\n );\n\n const handleLabelElementRef = useCallback(\n (element: HTMLElement | null) => {\n // Notify the external refs\n assignRef(externalLabelRef, element);\n assignRef(labelRefOption, element);\n\n attachMeasuredNode('label', isLabelMeasured ? element : null);\n },\n [externalLabelRef, labelRefOption, isLabelMeasured, attachMeasuredNode],\n );\n\n const handleDescriptionElementRef = useCallback(\n (element: HTMLElement | null) => {\n assignRef(descriptionRefOption, element);\n\n attachMeasuredNode('description', isDescriptionMeasured ? element : null);\n },\n [descriptionRefOption, isDescriptionMeasured, attachMeasuredNode],\n );\n\n const { ref: _labelPropsRef, ...finalLabelProps } = labelProps || {};\n\n // Resolved once so that both the rendering below and `isTooltipActive` speak\n // about the same tooltip.\n const resolvedTooltip = resolveTooltip({\n tooltip,\n children,\n description,\n labelProps,\n isDynamicLabel,\n truncation,\n });\n\n /** Whether a tooltip is rendered and able to open. */\n const isTooltipActive =\n !!resolvedTooltip && resolvedTooltip.isDisabled !== true;\n\n const renderWithTooltip = (\n renderElement: (\n tooltipTriggerProps?: HTMLAttributes<HTMLElement>,\n tooltipRef?: RefObject<HTMLElement>,\n ) => ReactNode,\n defaultTooltipPlacement: PositionProps['placement'],\n ) => {\n if (!resolvedTooltip) return renderElement();\n\n return (\n <TooltipProvider placement={defaultTooltipPlacement} {...resolvedTooltip}>\n {(triggerProps, ref) => renderElement(triggerProps, ref)}\n </TooltipProvider>\n );\n };\n\n return {\n labelRef: handleLabelElementRef,\n descriptionRef: handleDescriptionElementRef,\n labelProps: finalLabelProps,\n isOverflowed: truncation !== 'none',\n isAutoTooltipEnabled,\n hasTooltip: !!tooltip,\n isTooltipActive,\n renderWithTooltip,\n scheduleOverflowCheck,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { extractStyles, mergeStyleLayers } from "../../../utils/styles.js";
|
|
3
3
|
import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
|
|
4
4
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { extractStyles, mergeStyleLayers } from "../../../utils/styles.js";
|
|
3
3
|
import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
|
|
4
4
|
import { useI18n } from "../../../i18n/useI18n.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
2
|
-
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
3
2
|
import { _Text } from "../../content/Text.js";
|
|
3
|
+
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
4
4
|
import { useI18n } from "../../../i18n/useI18n.js";
|
|
5
5
|
import { Button } from "../../actions/index.js";
|
|
6
6
|
import { CloseIcon } from "../../../icons/CloseIcon.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { _Text } from "../../content/Text.js";
|
|
3
3
|
import { useI18n } from "../../../i18n/useI18n.js";
|
|
4
4
|
import { c } from "react/compiler-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { _Pagination } from "../../navigation/Pagination/Pagination.js";
|
|
3
3
|
import { c } from "react/compiler-runtime";
|
|
4
4
|
import { tasty } from "@tenphi/tasty";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { useI18n } from "../../../i18n/useI18n.js";
|
|
3
3
|
import { Button } from "../../actions/index.js";
|
|
4
4
|
import { ReloadIcon } from "../../../icons/ReloadIcon.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { freezeColumnWidths, useTableColumns } from "../TableBase/use-table-columns.js";
|
|
4
4
|
import { c } from "react/compiler-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { isTableTreeDescendant } from "../TableBase/table-tree.js";
|
|
4
4
|
import { ItemTableDragPreview } from "./ItemTableDragPreview.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { clampPage, getPageInfo } from "../../navigation/Pagination/use-pagination.js";
|
|
4
4
|
import { reindexTableTree } from "../TableBase/table-tree.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { flattenTableTree } from "../TableBase/table-tree.js";
|
|
3
3
|
import { useTableSelection } from "../TableBase/use-table-selection.js";
|
|
4
4
|
import { c } from "react/compiler-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { sortTableTree } from "../TableBase/table-tree.js";
|
|
4
4
|
import { compareByColumn, useTableSort } from "../TableBase/use-table-sort.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { useWarn } from "../../../_internal/hooks/use-warn.js";
|
|
3
3
|
import { buildTableTree } from "../TableBase/table-tree.js";
|
|
4
4
|
import { c } from "react/compiler-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
3
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
4
4
|
import { c } from "react/compiler-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
3
|
import { c } from "react/compiler-runtime";
|
|
4
4
|
import { useEffect, useRef, useState } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | 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 { c } from "react/compiler-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.1 | Cube Dev Team */
|
|
2
2
|
import { useSlotProps } from "../../../utils/react/Slots.js";
|
|
3
3
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
4
4
|
import { TooltipProvider } from "../../overlays/Tooltip/TooltipProvider.js";
|
|
@@ -16,7 +16,7 @@ import { SIZES, SIZE_NAME_TO_KEY } from "../../../tokens/sizes.js";
|
|
|
16
16
|
import { getColorTheme, useColorTheme } from "../../../tokens/color-theme.js";
|
|
17
17
|
import { MoreIcon } from "../../../icons/MoreIcon.js";
|
|
18
18
|
import { __Checkbox } from "../../fields/Checkbox/Checkbox.js";
|
|
19
|
-
import { Placeholder } from "../../content/Placeholder/Placeholder.js";
|
|
19
|
+
import { Placeholder, PlaceholderGroupContext } from "../../content/Placeholder/Placeholder.js";
|
|
20
20
|
import { Skeleton } from "../../content/Skeleton/Skeleton.js";
|
|
21
21
|
import { TableElement, TableHeaderItem, TableTreeToggle, TableTreeTogglePlaceholder } from "./styled.js";
|
|
22
22
|
import { renderColumnHeaderContent, resolveColumnSort } from "./column-header.js";
|
|
@@ -190,7 +190,7 @@ function TableView(props) {
|
|
|
190
190
|
const [scrollerEl, setScrollerEl] = useState(null);
|
|
191
191
|
const scrollerRef = useRef(null);
|
|
192
192
|
const textSlotProps = useSlotProps({}, "text");
|
|
193
|
-
const { segments: bodyColumns, refreshAppearance } = useColumnWindow(layout, scrollerEl, isVirtualized !== false && !isAutoHeight && !bodyStyles && !rowStyles && !cellStyles && Object.keys(textSlotProps).length === 0 && (!contentPreset || contentPreset === "t4") && canWindowColumns(columns, styles), tree?.columnKey);
|
|
193
|
+
const { segments: bodyColumns, refreshAppearance, resetRange } = useColumnWindow(layout, scrollerEl, isVirtualized !== false && !isAutoHeight && !bodyStyles && !rowStyles && !cellStyles && Object.keys(textSlotProps).length === 0 && (!contentPreset || contentPreset === "t4") && canWindowColumns(columns, styles), tree?.columnKey);
|
|
194
194
|
const localBodyRef = useRef(null);
|
|
195
195
|
const handleBodyRef = useCallback((element) => {
|
|
196
196
|
localBodyRef.current = element;
|
|
@@ -395,7 +395,10 @@ function TableView(props) {
|
|
|
395
395
|
role: "gridcell",
|
|
396
396
|
"aria-colindex": column.ariaColIndex,
|
|
397
397
|
style: pinStyle(column),
|
|
398
|
-
children: /* @__PURE__ */ jsx(
|
|
398
|
+
children: /* @__PURE__ */ jsx(PlaceholderGroupContext.Provider, {
|
|
399
|
+
value: true,
|
|
400
|
+
children: /* @__PURE__ */ jsx(Placeholder, {})
|
|
401
|
+
})
|
|
399
402
|
}, `column-cell:${column.key}`);
|
|
400
403
|
}
|
|
401
404
|
function renderSkeletonRows(count = skeletonRowCount, keyPrefix = "skeleton") {
|
|
@@ -810,7 +813,7 @@ function TableView(props) {
|
|
|
810
813
|
virtualizer.getTotalSize();
|
|
811
814
|
localBodyRef.current?.querySelectorAll("tr[data-index]").forEach((element) => virtualizer.measureElement(element));
|
|
812
815
|
}, [estimatedRowHeight, virtualizer]);
|
|
813
|
-
useTableTooltipRefresh(scrollerEl, virtualizer.isScrolling, refreshAppearance);
|
|
816
|
+
useTableTooltipRefresh(scrollerEl, virtualizer.isScrolling, refreshAppearance, resetRange);
|
|
814
817
|
const focusedTreeKey = tree?.state.selectionManager.focusedKey;
|
|
815
818
|
useEffect(() => {
|
|
816
819
|
if (!shouldVirtualize || focusedTreeKey == null || !tree) return;
|