@cube-dev/ui-kit 0.0.0-canary-3cf647a → 0.0.0-canary-ea72271
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/_internal/hooks/use-chained-callback.js +1 -1
- 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.js +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 +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +1 -1
- package/dist/components/actions/Button/Button.js +1 -1
- package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
- package/dist/components/actions/ButtonSplit/context.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +1 -1
- package/dist/components/actions/ItemActionContext.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.js +1 -1
- package/dist/components/actions/Menu/MenuItem.js +1 -1
- package/dist/components/actions/Menu/MenuSection.js +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +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/styled.js +1 -1
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +1 -1
- 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.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 +1 -1
- package/dist/components/content/InlineInput/InlineInput.js +1 -1
- package/dist/components/content/Item/Item.js +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.js +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 +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.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 +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 +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/Tree/Tree.js +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/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 +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +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 +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/intl.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.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 +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.js +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 +1 -1
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +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.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +1 -1
- package/dist/components/fields/Select/Select.js +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/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/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Form.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/index.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +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 +1 -1
- package/dist/components/form/wrapper.js +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/dist/components/layout/Board/Board.d.ts +9 -0
- package/dist/components/layout/Board/Board.js +128 -52
- package/dist/components/layout/Board/Board.js.map +1 -1
- package/dist/components/layout/Board/BoardProvider.js +1 -1
- package/dist/components/layout/Board/Widget.d.ts +6 -0
- package/dist/components/layout/Board/Widget.js +4 -3
- package/dist/components/layout/Board/Widget.js.map +1 -1
- package/dist/components/layout/Board/WidgetHost.js +36 -13
- package/dist/components/layout/Board/WidgetHost.js.map +1 -1
- package/dist/components/layout/Board/board-context.js +10 -2
- package/dist/components/layout/Board/board-context.js.map +1 -1
- package/dist/components/layout/Board/board-store.js +2 -2
- package/dist/components/layout/Board/board-store.js.map +1 -1
- package/dist/components/layout/Board/grid-core/calculate.js +2 -2
- package/dist/components/layout/Board/grid-core/collision.js +1 -1
- package/dist/components/layout/Board/grid-core/compactors.js +1 -1
- package/dist/components/layout/Board/grid-core/constraints.js +1 -1
- package/dist/components/layout/Board/grid-core/layout.js +23 -2
- package/dist/components/layout/Board/grid-core/layout.js.map +1 -1
- package/dist/components/layout/Board/grid-core/sort.js +1 -1
- package/dist/components/layout/Board/index.js +1 -1
- package/dist/components/layout/Board/use-board-layout.js +1 -1
- package/dist/components/layout/Board/use-board-registry.js +11 -2
- package/dist/components/layout/Board/use-board-registry.js.map +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/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.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/FileTabs/FileTabs.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/RangeCalendar.js +1 -1
- package/dist/components/other/CloudLogo/CloudLogo.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/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.js +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 +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/dist/components/overlays/Tooltip/context.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/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/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/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.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/palette.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/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/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.js +1 -1
- 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/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.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/usePopoverSync.js +1 -1
- package/dist/utils/react/useQaProps.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/components/layout/Board.md +13 -0
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../utils/styles.js";
|
|
3
3
|
import { useProviderProps } from "../../provider.js";
|
|
4
4
|
import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
|
|
2
2
|
import { mergeProps } from "../../utils/react/mergeProps.js";
|
|
3
3
|
import { FieldWrapper } from "./FieldWrapper/FieldWrapper.js";
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
|
|
2
2
|
import { useCallback, useLayoutEffect, useRef, useState } from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/components/helpers/DisplayTransition/DisplayTransition.tsx
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
|
|
2
2
|
import { DisplayTransition } from "../DisplayTransition/DisplayTransition.js";
|
|
3
3
|
import { tasty } from "@tenphi/tasty";
|
|
4
4
|
import { isValidElement, useCallback, useLayoutEffect, useRef, useState } from "react";
|
|
@@ -37,6 +37,15 @@ interface CubeBoardProps extends Omit<AllBaseProps, 'children'>, Omit<ContainerS
|
|
|
37
37
|
isDroppable?: boolean;
|
|
38
38
|
/** Which resize handles to show. @default ['se'] */
|
|
39
39
|
resizeHandles?: ResizeHandleAxis[];
|
|
40
|
+
/**
|
|
41
|
+
* Align this board's grid with an ancestor `Board`'s layout. Only takes
|
|
42
|
+
* effect when the board is nested inside another `Board`'s widget. When set,
|
|
43
|
+
* the board inherits the parent's column pitch (deriving its own column count
|
|
44
|
+
* from its measured width so cells stay parent-sized) and inherits the
|
|
45
|
+
* parent's row height as a target, shrinking rows slightly when needed to fit
|
|
46
|
+
* the height the container widget grants it. @default false
|
|
47
|
+
*/
|
|
48
|
+
isAligned?: boolean;
|
|
40
49
|
/** Grid/item layout constraints. */
|
|
41
50
|
constraints?: LayoutConstraint[];
|
|
42
51
|
/**
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
|
|
4
4
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
5
|
-
import { useBoardRegistry } from "./board-context.js";
|
|
6
|
-
import { bottom, getLayoutItem, modifyLayout } from "./grid-core/layout.js";
|
|
5
|
+
import { BoardMetricsContext, useBoardHost, useBoardMetrics, useBoardRegistry } from "./board-context.js";
|
|
6
|
+
import { bottom, cloneLayout, correctBounds, getLayoutItem, modifyLayout } from "./grid-core/layout.js";
|
|
7
7
|
import { getCompactor } from "./grid-core/compactors.js";
|
|
8
|
-
import { calcGridItemPosition, calcWH } from "./grid-core/calculate.js";
|
|
8
|
+
import { calcGridColWidth, calcGridItemPosition, calcWH, clamp } from "./grid-core/calculate.js";
|
|
9
9
|
import { applySizeConstraints, defaultConstraints } from "./grid-core/constraints.js";
|
|
10
10
|
import { BoardProvider } from "./BoardProvider.js";
|
|
11
11
|
import { useBoardLayout } from "./use-board-layout.js";
|
|
@@ -47,22 +47,34 @@ const PlaceholderElement = tasty({
|
|
|
47
47
|
boxSizing: "border-box"
|
|
48
48
|
}
|
|
49
49
|
});
|
|
50
|
+
/**
|
|
51
|
+
* Lower bound for the reduced row height used by an aligned nested board, so a
|
|
52
|
+
* very short container can never collapse its rows to zero.
|
|
53
|
+
*/
|
|
54
|
+
const MIN_ALIGNED_ROW_HEIGHT = 24;
|
|
50
55
|
function compactTypeToCore(compact) {
|
|
51
56
|
if (compact === "free") return null;
|
|
52
57
|
return compact;
|
|
53
58
|
}
|
|
54
59
|
function BoardInner(props, ref) {
|
|
55
|
-
const { id: providedId, layout: controlledLayout, defaultLayout, onLayoutChange, cols = 12, rowHeight = 100, margin = [8, 8], containerPadding, maxRows = Infinity, compact = "vertical", allowOverlap = false, preventCollision = false, isDraggable = true, isResizable = true, isDroppable = true, resizeHandles = ["se"], constraints, width: providedWidth, children, ...otherProps } = props;
|
|
60
|
+
const { id: providedId, layout: controlledLayout, defaultLayout, onLayoutChange, cols = 12, rowHeight = 100, margin = [8, 8], containerPadding, maxRows = Infinity, compact = "vertical", allowOverlap = false, preventCollision = false, isDraggable = true, isResizable = true, isDroppable = true, resizeHandles = ["se"], isAligned = false, constraints, width: providedWidth, children, ...otherProps } = props;
|
|
56
61
|
const registry = useBoardRegistry();
|
|
62
|
+
const parentMetrics = useBoardMetrics();
|
|
63
|
+
const host = useBoardHost();
|
|
64
|
+
const aligned = isAligned && !!parentMetrics;
|
|
57
65
|
const generatedId = useId();
|
|
58
66
|
const boardId = providedId ?? generatedId;
|
|
59
67
|
const containerRef = useCombinedRefs(ref);
|
|
60
68
|
const contentRef = useRef(null);
|
|
61
69
|
const [measuredWidth, setMeasuredWidth] = useState(0);
|
|
70
|
+
const [measuredHeight, setMeasuredHeight] = useState(0);
|
|
62
71
|
const width = providedWidth ?? measuredWidth;
|
|
63
72
|
const onResizeContainer = useEvent(() => {
|
|
64
73
|
const el = containerRef.current;
|
|
65
|
-
if (el)
|
|
74
|
+
if (el) {
|
|
75
|
+
setMeasuredWidth(el.offsetWidth);
|
|
76
|
+
setMeasuredHeight(el.offsetHeight);
|
|
77
|
+
}
|
|
66
78
|
});
|
|
67
79
|
useResizeObserver({
|
|
68
80
|
ref: containerRef,
|
|
@@ -77,22 +89,30 @@ function BoardInner(props, ref) {
|
|
|
77
89
|
onLayoutChange
|
|
78
90
|
});
|
|
79
91
|
useSyncExternalStore(registry.store.subscribe, registry.store.getVersion);
|
|
80
|
-
const
|
|
92
|
+
const effectiveMargin = aligned ? parentMetrics.margin : margin;
|
|
93
|
+
const resolvedPadding = containerPadding ?? effectiveMargin;
|
|
94
|
+
const rows = Math.max(bottom(layout), placeholder ? placeholder.y + placeholder.h : 0);
|
|
95
|
+
const parentColWidth = aligned ? parentMetrics.colWidth : 0;
|
|
96
|
+
const alignedCols = aligned && width > 0 ? Math.max(1, Math.floor((width - resolvedPadding[0] * 2 + effectiveMargin[0]) / (parentColWidth + effectiveMargin[0]))) : cols;
|
|
97
|
+
const effectiveCols = aligned ? alignedCols : cols;
|
|
98
|
+
const effectiveContainerWidth = aligned ? parentColWidth * effectiveCols + effectiveMargin[0] * Math.max(0, effectiveCols - 1) + resolvedPadding[0] * 2 : width;
|
|
99
|
+
const parentRowHeight = aligned ? parentMetrics.rowHeight : rowHeight;
|
|
100
|
+
const effectiveRowHeight = aligned && rows > 0 && measuredHeight > 0 ? clamp((measuredHeight - Math.max(0, rows - 1) * effectiveMargin[1] - resolvedPadding[1] * 2) / rows, MIN_ALIGNED_ROW_HEIGHT, parentRowHeight) : parentRowHeight;
|
|
81
101
|
const positionParams = useMemo(() => ({
|
|
82
|
-
margin,
|
|
102
|
+
margin: effectiveMargin,
|
|
83
103
|
containerPadding: resolvedPadding,
|
|
84
|
-
containerWidth:
|
|
85
|
-
cols,
|
|
86
|
-
rowHeight,
|
|
104
|
+
containerWidth: effectiveContainerWidth,
|
|
105
|
+
cols: effectiveCols,
|
|
106
|
+
rowHeight: effectiveRowHeight,
|
|
87
107
|
maxRows
|
|
88
108
|
}), [
|
|
89
|
-
|
|
90
|
-
|
|
109
|
+
effectiveMargin[0],
|
|
110
|
+
effectiveMargin[1],
|
|
91
111
|
resolvedPadding[0],
|
|
92
112
|
resolvedPadding[1],
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
113
|
+
effectiveContainerWidth,
|
|
114
|
+
effectiveCols,
|
|
115
|
+
effectiveRowHeight,
|
|
96
116
|
maxRows
|
|
97
117
|
]);
|
|
98
118
|
const compactor = useMemo(() => {
|
|
@@ -104,8 +124,8 @@ function BoardInner(props, ref) {
|
|
|
104
124
|
preventCollision
|
|
105
125
|
]);
|
|
106
126
|
const resolvedConstraints = constraints ?? defaultConstraints;
|
|
107
|
-
const
|
|
108
|
-
const containerHeight =
|
|
127
|
+
const computedHeight = rows > 0 ? rows * effectiveRowHeight + Math.max(0, rows - 1) * effectiveMargin[1] + resolvedPadding[1] * 2 : effectiveRowHeight;
|
|
128
|
+
const containerHeight = aligned && measuredHeight > 0 ? measuredHeight : computedHeight;
|
|
109
129
|
const liveRef = useRef({
|
|
110
130
|
positionParams,
|
|
111
131
|
compactor,
|
|
@@ -144,7 +164,39 @@ function BoardInner(props, ref) {
|
|
|
144
164
|
entry.id = boardId;
|
|
145
165
|
return registry.registerBoard(entry);
|
|
146
166
|
}, [boardId]);
|
|
167
|
+
const recompactForCols = useEvent((nextCols) => {
|
|
168
|
+
const corrected = correctBounds(cloneLayout(layoutRef.current), { cols: nextCols });
|
|
169
|
+
applyLayoutEvent([...liveRef.current.compactor.compact(corrected, nextCols)], true);
|
|
170
|
+
});
|
|
171
|
+
const prevAlignedColsRef = useRef(effectiveCols);
|
|
172
|
+
useEffect(() => {
|
|
173
|
+
if (!aligned) {
|
|
174
|
+
prevAlignedColsRef.current = effectiveCols;
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (prevAlignedColsRef.current === effectiveCols) return;
|
|
178
|
+
prevAlignedColsRef.current = effectiveCols;
|
|
179
|
+
recompactForCols(effectiveCols);
|
|
180
|
+
}, [
|
|
181
|
+
aligned,
|
|
182
|
+
effectiveCols,
|
|
183
|
+
recompactForCols
|
|
184
|
+
]);
|
|
185
|
+
const naturalHeight = rows > 0 ? rows * parentRowHeight + Math.max(0, rows - 1) * effectiveMargin[1] + resolvedPadding[1] * 2 : parentRowHeight;
|
|
186
|
+
const requestHeightDeficit = host?.requestHeightDeficit;
|
|
187
|
+
useEffect(() => {
|
|
188
|
+
if (!aligned || !host?.isAutoHeight || !requestHeightDeficit) return;
|
|
189
|
+
if (measuredHeight <= 0) return;
|
|
190
|
+
requestHeightDeficit(naturalHeight - measuredHeight);
|
|
191
|
+
}, [
|
|
192
|
+
aligned,
|
|
193
|
+
host?.isAutoHeight,
|
|
194
|
+
requestHeightDeficit,
|
|
195
|
+
naturalHeight,
|
|
196
|
+
measuredHeight
|
|
197
|
+
]);
|
|
147
198
|
const resizeStateRef = useRef(null);
|
|
199
|
+
const autoHeightMinRowsRef = useRef({});
|
|
148
200
|
const handleResize = useEvent((id, axis, phase, dx, dy) => {
|
|
149
201
|
const pp = liveRef.current.positionParams;
|
|
150
202
|
if (phase === "start") {
|
|
@@ -194,24 +246,38 @@ function BoardInner(props, ref) {
|
|
|
194
246
|
margin: pp.margin,
|
|
195
247
|
layout: layoutRef.current
|
|
196
248
|
});
|
|
249
|
+
const floorRows = autoHeightMinRowsRef.current[id] ?? 0;
|
|
250
|
+
const finalW = constrained.w;
|
|
251
|
+
const finalH = Math.max(constrained.h, floorRows);
|
|
197
252
|
let x = item.x;
|
|
198
253
|
let y = item.y;
|
|
199
|
-
if (handle.includes("w")) x = item.x + item.w -
|
|
200
|
-
if (handle.includes("n")) y = item.y + item.h -
|
|
254
|
+
if (handle.includes("w")) x = item.x + item.w - finalW;
|
|
255
|
+
if (handle.includes("n")) y = item.y + item.h - finalH;
|
|
201
256
|
x = Math.max(0, x);
|
|
202
257
|
y = Math.max(0, y);
|
|
203
258
|
const newItem = {
|
|
204
259
|
...item,
|
|
205
260
|
x,
|
|
206
261
|
y,
|
|
207
|
-
w:
|
|
208
|
-
h:
|
|
262
|
+
w: finalW,
|
|
263
|
+
h: finalH
|
|
209
264
|
};
|
|
210
265
|
const working = modifyLayout(layoutRef.current, newItem);
|
|
211
266
|
const compacted = [...liveRef.current.compactor.compact(working, pp.cols)];
|
|
212
267
|
applyLayout(compacted, false);
|
|
213
268
|
setPlaceholder(getLayoutItem(compacted, id) ?? newItem);
|
|
214
269
|
});
|
|
270
|
+
const handleAutoHeight = useEvent((id, neededRows) => {
|
|
271
|
+
autoHeightMinRowsRef.current[id] = neededRows;
|
|
272
|
+
const current = getLayoutItem(layoutRef.current, id);
|
|
273
|
+
if (!current || neededRows <= current.h) return;
|
|
274
|
+
const pp = liveRef.current.positionParams;
|
|
275
|
+
const working = modifyLayout(layoutRef.current, {
|
|
276
|
+
...current,
|
|
277
|
+
h: neededRows
|
|
278
|
+
});
|
|
279
|
+
applyLayout([...liveRef.current.compactor.compact(working, pp.cols)], true);
|
|
280
|
+
});
|
|
215
281
|
const styles = extractStyles(otherProps, CONTAINER_STYLES);
|
|
216
282
|
const dragState = registry.dragState;
|
|
217
283
|
const ready = width > 0;
|
|
@@ -224,36 +290,46 @@ function BoardInner(props, ref) {
|
|
|
224
290
|
};
|
|
225
291
|
})() : null;
|
|
226
292
|
const showPlaceholder = placeholder && placeholderStyle;
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
ref:
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
293
|
+
const boardMetrics = useMemo(() => ({
|
|
294
|
+
colWidth: calcGridColWidth(positionParams),
|
|
295
|
+
rowHeight: positionParams.rowHeight,
|
|
296
|
+
margin: positionParams.margin,
|
|
297
|
+
containerPadding: positionParams.containerPadding
|
|
298
|
+
}), [positionParams]);
|
|
299
|
+
return /* @__PURE__ */ jsx(BoardMetricsContext.Provider, {
|
|
300
|
+
value: boardMetrics,
|
|
301
|
+
children: /* @__PURE__ */ jsxs(BoardElement, {
|
|
302
|
+
...filterBaseProps(otherProps, { eventProps: true }),
|
|
303
|
+
ref: containerRef,
|
|
304
|
+
styles,
|
|
305
|
+
style: aligned ? void 0 : { minHeight: `${containerHeight}px` },
|
|
306
|
+
mods: {
|
|
307
|
+
dragging: !!dragState,
|
|
308
|
+
"drop-target": dragState?.currentBoardId === boardId
|
|
309
|
+
},
|
|
310
|
+
children: [/* @__PURE__ */ jsxs(ContentLayer, {
|
|
311
|
+
ref: contentRef,
|
|
312
|
+
children: [ready ? layout.map((item) => {
|
|
313
|
+
const registration = registry.store.get(item.i);
|
|
314
|
+
return /* @__PURE__ */ jsx(WidgetHost, {
|
|
315
|
+
boardId,
|
|
316
|
+
item,
|
|
317
|
+
positionParams,
|
|
318
|
+
registration,
|
|
319
|
+
isDraggable: isDraggable && registration?.isDraggable !== false && item.isDraggable !== false && !item.static,
|
|
320
|
+
isResizable: isResizable && registration?.isResizable !== false && item.isResizable !== false && !item.static,
|
|
321
|
+
resizeHandles: item.resizeHandles ?? registration?.resizeHandles ?? resizeHandles,
|
|
322
|
+
registry,
|
|
323
|
+
dragState,
|
|
324
|
+
onResize: handleResize,
|
|
325
|
+
onAutoHeight: handleAutoHeight
|
|
326
|
+
}, item.i);
|
|
327
|
+
}) : null, showPlaceholder ? /* @__PURE__ */ jsx(PlaceholderElement, {
|
|
328
|
+
"aria-hidden": "true",
|
|
329
|
+
style: placeholderStyle
|
|
330
|
+
}) : null]
|
|
331
|
+
}), children]
|
|
332
|
+
})
|
|
257
333
|
});
|
|
258
334
|
}
|
|
259
335
|
const BoardInnerForwarded = forwardRef(BoardInner);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Board.js","names":[],"sources":["../../../../src/components/layout/Board/Board.tsx"],"sourcesContent":["import { useResizeObserver } from '@react-aria/utils';\nimport {\n AllBaseProps,\n CONTAINER_STYLES,\n ContainerStyleProps,\n filterBaseProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport {\n forwardRef,\n ReactNode,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useCombinedRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\n\nimport { BoardEntry, useBoardRegistry } from './board-context';\nimport { BoardProvider } from './BoardProvider';\nimport {\n applySizeConstraints,\n bottom,\n calcGridItemPosition,\n calcWH,\n Compactor,\n CompactType,\n defaultConstraints,\n getCompactor,\n getLayoutItem,\n LayoutConstraint,\n LayoutItem,\n modifyLayout,\n Position,\n PositionParams,\n ResizeHandleAxis,\n} from './grid-core';\nimport { useBoardLayout } from './use-board-layout';\nimport { ResizePhase, WidgetHost } from './WidgetHost';\n\nconst BoardElement = tasty({\n qa: 'Board',\n styles: {\n position: 'relative',\n display: 'block',\n width: '100%',\n flexGrow: 1,\n minHeight: '0',\n fill: '#clear',\n boxSizing: 'border-box',\n },\n});\n\nconst ContentLayer = tasty({\n styles: {\n position: 'absolute',\n inset: 0,\n },\n});\n\nconst PlaceholderElement = tasty({\n qa: 'BoardPlaceholder',\n styles: {\n position: 'absolute',\n top: 0,\n left: 0,\n fill: '#purple.10',\n radius: '1cr',\n border: '#purple.40',\n zIndex: 2,\n pointerEvents: 'none',\n transition: 'transform 80ms linear, width 80ms linear, height 80ms linear',\n boxSizing: 'border-box',\n },\n});\n\nexport type BoardCompactType = 'vertical' | 'horizontal' | 'free' | null;\n\nexport interface CubeBoardProps\n extends Omit<AllBaseProps, 'children'>,\n Omit<ContainerStyleProps, 'margin'> {\n /** Stable board id (used for cross-board drag). Auto-generated if omitted. */\n id?: string;\n /** Controlled layout. */\n layout?: LayoutItem[];\n /** Initial layout for uncontrolled usage. */\n defaultLayout?: LayoutItem[];\n onLayoutChange?: (layout: LayoutItem[]) => void;\n /** Number of columns. @default 12 */\n cols?: number;\n /** Row height in pixels. @default 100 */\n rowHeight?: number;\n /** [horizontal, vertical] margin between widgets in pixels. @default [8, 8] */\n margin?: [number, number];\n /** [horizontal, vertical] padding inside the board. Defaults to `margin`. */\n containerPadding?: [number, number];\n /** Maximum number of rows. @default Infinity */\n maxRows?: number;\n /** Compaction behavior. @default 'vertical' */\n compact?: BoardCompactType;\n /** Allow widgets to overlap. @default false */\n allowOverlap?: boolean;\n /** Block movement into occupied cells instead of pushing. @default false */\n preventCollision?: boolean;\n /** Enable dragging for all widgets. @default true */\n isDraggable?: boolean;\n /** Enable resizing for all widgets. @default true */\n isResizable?: boolean;\n /** Whether this board accepts widgets dropped from other boards. @default true */\n isDroppable?: boolean;\n /** Which resize handles to show. @default ['se'] */\n resizeHandles?: ResizeHandleAxis[];\n /** Grid/item layout constraints. */\n constraints?: LayoutConstraint[];\n /**\n * Explicit container width in pixels. When provided, disables automatic width\n * measurement (useful for SSR and tests).\n */\n width?: number;\n children?: ReactNode;\n}\n\nfunction compactTypeToCore(compact: BoardCompactType): CompactType {\n if (compact === 'free') return null;\n return compact;\n}\n\nfunction BoardInner(\n props: CubeBoardProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const {\n id: providedId,\n layout: controlledLayout,\n defaultLayout,\n onLayoutChange,\n cols = 12,\n rowHeight = 100,\n margin = [8, 8],\n containerPadding,\n maxRows = Infinity,\n compact = 'vertical',\n allowOverlap = false,\n preventCollision = false,\n isDraggable = true,\n isResizable = true,\n isDroppable = true,\n resizeHandles = ['se'],\n constraints,\n width: providedWidth,\n children,\n ...otherProps\n } = props;\n\n const registry = useBoardRegistry()!;\n const generatedId = useId();\n const boardId = providedId ?? generatedId;\n\n const containerRef = useCombinedRefs(ref);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [measuredWidth, setMeasuredWidth] = useState<number>(0);\n const width = providedWidth ?? measuredWidth;\n\n const onResizeContainer = useEvent(() => {\n const el = containerRef.current;\n if (el) {\n setMeasuredWidth(el.offsetWidth);\n }\n });\n useResizeObserver({ ref: containerRef, onResize: onResizeContainer });\n useEffect(() => {\n if (providedWidth == null) {\n onResizeContainer();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [providedWidth]);\n\n const { layout, layoutRef, placeholder, setPlaceholder, applyLayout } =\n useBoardLayout({\n layout: controlledLayout,\n defaultLayout,\n onLayoutChange,\n });\n\n // Re-render when any widget's registered content/config changes.\n useSyncExternalStore(registry.store.subscribe, registry.store.getVersion);\n\n const resolvedPadding = containerPadding ?? margin;\n\n const positionParams = useMemo<PositionParams>(\n () => ({\n margin,\n containerPadding: resolvedPadding,\n containerWidth: width,\n cols,\n rowHeight,\n maxRows,\n }),\n [\n margin[0],\n margin[1],\n resolvedPadding[0],\n resolvedPadding[1],\n width,\n cols,\n rowHeight,\n maxRows,\n ],\n );\n\n const compactor = useMemo<Compactor>(() => {\n // 'free' means true free positioning: widgets can overlap and nothing is\n // pushed or recompacted. Force allowOverlap so `moveElement` short-circuits\n // on collision and the (no-op) compactor leaves items exactly where dropped.\n if (compact === 'free') {\n return getCompactor(null, true, preventCollision);\n }\n return getCompactor(\n compactTypeToCore(compact),\n allowOverlap,\n preventCollision,\n );\n }, [compact, allowOverlap, preventCollision]);\n\n const resolvedConstraints = constraints ?? defaultConstraints;\n\n const rows = Math.max(\n bottom(layout),\n placeholder ? placeholder.y + placeholder.h : 0,\n );\n const containerHeight =\n rows > 0\n ? rows * rowHeight +\n Math.max(0, rows - 1) * margin[1] +\n resolvedPadding[1] * 2\n : rowHeight;\n\n // Live refs so the stable registry entry always reads current values.\n const liveRef = useRef({\n positionParams,\n compactor,\n constraints: resolvedConstraints,\n maxRows,\n containerHeight,\n isDroppable,\n });\n liveRef.current = {\n positionParams,\n compactor,\n constraints: resolvedConstraints,\n maxRows,\n containerHeight,\n isDroppable,\n };\n\n const applyLayoutEvent = useEvent(applyLayout);\n const setPlaceholderEvent = useEvent(setPlaceholder);\n\n const entryRef = useRef<BoardEntry | null>(null);\n if (!entryRef.current) {\n entryRef.current = {\n id: boardId,\n getContentRect: () => contentRef.current?.getBoundingClientRect() ?? null,\n getContentNode: () => contentRef.current,\n getPositionParams: () => liveRef.current.positionParams,\n getConstraints: () => liveRef.current.constraints,\n getCompactor: () => liveRef.current.compactor,\n getMaxRows: () => liveRef.current.maxRows,\n getContainerHeight: () => liveRef.current.containerHeight,\n getLayout: () => layoutRef.current,\n applyLayout: (next, commit) => applyLayoutEvent(next, commit),\n setPlaceholder: (item) => setPlaceholderEvent(item),\n isDroppable: () => liveRef.current.isDroppable,\n };\n }\n\n useEffect(() => {\n const entry = entryRef.current!;\n // Keep the entry's id in sync with the (possibly changed) board id before\n // registering. The previous effect's cleanup has already removed the old id,\n // so registering here keys the entry under the current id.\n entry.id = boardId;\n return registry.registerBoard(entry);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [boardId]);\n\n // In-board resize orchestration.\n const resizeStateRef = useRef<{\n id: string;\n axis: ResizeHandleAxis;\n item: LayoutItem;\n origin: Position;\n accX: number;\n accY: number;\n } | null>(null);\n\n const handleResize = useEvent(\n (\n id: string,\n axis: ResizeHandleAxis,\n phase: ResizePhase,\n dx: number,\n dy: number,\n ) => {\n const pp = liveRef.current.positionParams;\n\n if (phase === 'start') {\n const rawItem = getLayoutItem(layoutRef.current, id);\n if (!rawItem) return;\n // Layout-item constraints win; otherwise fall back to the ones declared\n // on the owning `Board.Widget` so `applySizeConstraints` picks them up.\n const item: LayoutItem = {\n ...rawItem,\n constraints:\n rawItem.constraints ?? registry.store.get(id)?.constraints,\n };\n resizeStateRef.current = {\n id,\n axis,\n item: { ...item },\n origin: calcGridItemPosition(pp, item.x, item.y, item.w, item.h),\n accX: 0,\n accY: 0,\n };\n setPlaceholder({ ...item });\n return;\n }\n\n const rs = resizeStateRef.current;\n if (!rs) return;\n\n if (phase === 'end') {\n applyLayout([...layoutRef.current], true);\n setPlaceholder(null);\n resizeStateRef.current = null;\n return;\n }\n\n rs.accX += dx;\n rs.accY += dy;\n\n const { origin, item, axis: handle } = rs;\n let newW = origin.width;\n let newH = origin.height;\n if (handle.includes('e')) newW = origin.width + rs.accX;\n if (handle.includes('w')) newW = origin.width - rs.accX;\n if (handle.includes('s')) newH = origin.height + rs.accY;\n if (handle.includes('n')) newH = origin.height - rs.accY;\n newW = Math.max(newW, 8);\n newH = Math.max(newH, 8);\n\n const raw = calcWH(pp, newW, newH, item.x, item.y, handle);\n const constrained = applySizeConstraints(\n liveRef.current.constraints,\n item,\n raw.w,\n raw.h,\n handle,\n {\n cols: pp.cols,\n maxRows: liveRef.current.maxRows,\n containerWidth: pp.containerWidth,\n containerHeight: liveRef.current.containerHeight,\n rowHeight: pp.rowHeight,\n margin: pp.margin,\n layout: layoutRef.current,\n },\n );\n\n let x = item.x;\n let y = item.y;\n if (handle.includes('w')) x = item.x + item.w - constrained.w;\n if (handle.includes('n')) y = item.y + item.h - constrained.h;\n x = Math.max(0, x);\n y = Math.max(0, y);\n\n const newItem: LayoutItem = {\n ...item,\n x,\n y,\n w: constrained.w,\n h: constrained.h,\n };\n const working = modifyLayout(layoutRef.current, newItem);\n const compacted = [\n ...liveRef.current.compactor.compact(working, pp.cols),\n ];\n applyLayout(compacted, false);\n setPlaceholder(getLayoutItem(compacted, id) ?? newItem);\n },\n );\n\n const styles: Styles = extractStyles(otherProps, CONTAINER_STYLES);\n\n const dragState = registry.dragState;\n const ready = width > 0;\n\n const placeholderStyle = placeholder\n ? (() => {\n const pos = calcGridItemPosition(\n positionParams,\n placeholder.x,\n placeholder.y,\n placeholder.w,\n placeholder.h,\n );\n return {\n transform: `translate(${pos.left}px, ${pos.top}px)`,\n width: `${pos.width}px`,\n height: `${pos.height}px`,\n };\n })()\n : null;\n\n const showPlaceholder = placeholder && placeholderStyle;\n\n return (\n <BoardElement\n {...filterBaseProps(otherProps, { eventProps: true })}\n ref={containerRef}\n styles={styles}\n // Use min-height (not a fixed height) so the board auto-sizes to its\n // content by default but can still grow to fill a taller parent (e.g. a\n // nested board stretched inside a container widget). Widgets are absolutely\n // positioned, so growing never shifts them, and the content layer\n // (inset: 0) always covers the full board -> the whole board is droppable.\n style={{ minHeight: `${containerHeight}px` }}\n mods={{\n dragging: !!dragState,\n 'drop-target': dragState?.currentBoardId === boardId,\n }}\n >\n <ContentLayer ref={contentRef}>\n {ready\n ? layout.map((item) => {\n const registration = registry.store.get(item.i);\n const widgetDraggable =\n isDraggable &&\n registration?.isDraggable !== false &&\n item.isDraggable !== false &&\n !item.static;\n const widgetResizable =\n isResizable &&\n registration?.isResizable !== false &&\n item.isResizable !== false &&\n !item.static;\n const handles =\n item.resizeHandles ??\n registration?.resizeHandles ??\n resizeHandles;\n\n return (\n <WidgetHost\n key={item.i}\n boardId={boardId}\n item={item}\n positionParams={positionParams}\n registration={registration}\n isDraggable={widgetDraggable}\n isResizable={widgetResizable}\n resizeHandles={handles}\n registry={registry}\n dragState={dragState}\n onResize={handleResize}\n />\n );\n })\n : null}\n {showPlaceholder ? (\n <PlaceholderElement aria-hidden=\"true\" style={placeholderStyle!} />\n ) : null}\n </ContentLayer>\n {children}\n </BoardElement>\n );\n}\n\nconst BoardInnerForwarded = forwardRef(BoardInner);\n\n/**\n * A draggable and resizable widget grid. Widgets are declared with\n * `Board.Widget` and positioned via a `layout`. Wrap multiple boards in a\n * `BoardProvider` to enable dragging widgets between them.\n */\nexport const Board = forwardRef(function Board(\n props: CubeBoardProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const existingRegistry = useBoardRegistry();\n\n if (existingRegistry) {\n return <BoardInnerForwarded {...props} ref={ref} />;\n }\n\n return (\n <BoardProvider>\n <BoardInnerForwarded {...props} ref={ref} />\n </BoardProvider>\n );\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Board.js","names":[],"sources":["../../../../src/components/layout/Board/Board.tsx"],"sourcesContent":["import { useResizeObserver } from '@react-aria/utils';\nimport {\n AllBaseProps,\n CONTAINER_STYLES,\n ContainerStyleProps,\n filterBaseProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport {\n forwardRef,\n ReactNode,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useCombinedRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\n\nimport {\n BoardEntry,\n BoardMetrics,\n BoardMetricsContext,\n useBoardHost,\n useBoardMetrics,\n useBoardRegistry,\n} from './board-context';\nimport { BoardProvider } from './BoardProvider';\nimport {\n applySizeConstraints,\n bottom,\n calcGridColWidth,\n calcGridItemPosition,\n calcWH,\n clamp,\n cloneLayout,\n Compactor,\n CompactType,\n correctBounds,\n defaultConstraints,\n getCompactor,\n getLayoutItem,\n LayoutConstraint,\n LayoutItem,\n modifyLayout,\n Position,\n PositionParams,\n ResizeHandleAxis,\n} from './grid-core';\nimport { useBoardLayout } from './use-board-layout';\nimport { ResizePhase, WidgetHost } from './WidgetHost';\n\nconst BoardElement = tasty({\n qa: 'Board',\n styles: {\n position: 'relative',\n display: 'block',\n width: '100%',\n flexGrow: 1,\n minHeight: '0',\n fill: '#clear',\n boxSizing: 'border-box',\n },\n});\n\nconst ContentLayer = tasty({\n styles: {\n position: 'absolute',\n inset: 0,\n },\n});\n\nconst PlaceholderElement = tasty({\n qa: 'BoardPlaceholder',\n styles: {\n position: 'absolute',\n top: 0,\n left: 0,\n fill: '#purple.10',\n radius: '1cr',\n border: '#purple.40',\n zIndex: 2,\n pointerEvents: 'none',\n transition: 'transform 80ms linear, width 80ms linear, height 80ms linear',\n boxSizing: 'border-box',\n },\n});\n\n/**\n * Lower bound for the reduced row height used by an aligned nested board, so a\n * very short container can never collapse its rows to zero.\n */\nconst MIN_ALIGNED_ROW_HEIGHT = 24;\n\nexport type BoardCompactType = 'vertical' | 'horizontal' | 'free' | null;\n\nexport interface CubeBoardProps\n extends Omit<AllBaseProps, 'children'>,\n Omit<ContainerStyleProps, 'margin'> {\n /** Stable board id (used for cross-board drag). Auto-generated if omitted. */\n id?: string;\n /** Controlled layout. */\n layout?: LayoutItem[];\n /** Initial layout for uncontrolled usage. */\n defaultLayout?: LayoutItem[];\n onLayoutChange?: (layout: LayoutItem[]) => void;\n /** Number of columns. @default 12 */\n cols?: number;\n /** Row height in pixels. @default 100 */\n rowHeight?: number;\n /** [horizontal, vertical] margin between widgets in pixels. @default [8, 8] */\n margin?: [number, number];\n /** [horizontal, vertical] padding inside the board. Defaults to `margin`. */\n containerPadding?: [number, number];\n /** Maximum number of rows. @default Infinity */\n maxRows?: number;\n /** Compaction behavior. @default 'vertical' */\n compact?: BoardCompactType;\n /** Allow widgets to overlap. @default false */\n allowOverlap?: boolean;\n /** Block movement into occupied cells instead of pushing. @default false */\n preventCollision?: boolean;\n /** Enable dragging for all widgets. @default true */\n isDraggable?: boolean;\n /** Enable resizing for all widgets. @default true */\n isResizable?: boolean;\n /** Whether this board accepts widgets dropped from other boards. @default true */\n isDroppable?: boolean;\n /** Which resize handles to show. @default ['se'] */\n resizeHandles?: ResizeHandleAxis[];\n /**\n * Align this board's grid with an ancestor `Board`'s layout. Only takes\n * effect when the board is nested inside another `Board`'s widget. When set,\n * the board inherits the parent's column pitch (deriving its own column count\n * from its measured width so cells stay parent-sized) and inherits the\n * parent's row height as a target, shrinking rows slightly when needed to fit\n * the height the container widget grants it. @default false\n */\n isAligned?: boolean;\n /** Grid/item layout constraints. */\n constraints?: LayoutConstraint[];\n /**\n * Explicit container width in pixels. When provided, disables automatic width\n * measurement (useful for SSR and tests).\n */\n width?: number;\n children?: ReactNode;\n}\n\nfunction compactTypeToCore(compact: BoardCompactType): CompactType {\n if (compact === 'free') return null;\n return compact;\n}\n\nfunction BoardInner(\n props: CubeBoardProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const {\n id: providedId,\n layout: controlledLayout,\n defaultLayout,\n onLayoutChange,\n cols = 12,\n rowHeight = 100,\n margin = [8, 8],\n containerPadding,\n maxRows = Infinity,\n compact = 'vertical',\n allowOverlap = false,\n preventCollision = false,\n isDraggable = true,\n isResizable = true,\n isDroppable = true,\n resizeHandles = ['se'],\n isAligned = false,\n constraints,\n width: providedWidth,\n children,\n ...otherProps\n } = props;\n\n const registry = useBoardRegistry()!;\n const parentMetrics = useBoardMetrics();\n const host = useBoardHost();\n const aligned = isAligned && !!parentMetrics;\n const generatedId = useId();\n const boardId = providedId ?? generatedId;\n\n const containerRef = useCombinedRefs(ref);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [measuredWidth, setMeasuredWidth] = useState<number>(0);\n // Rendered height is only needed for aligned nested boards (to fit rows into\n // the space the container grants). It never drives the board's own height, so\n // measuring it cannot create a feedback loop.\n const [measuredHeight, setMeasuredHeight] = useState<number>(0);\n const width = providedWidth ?? measuredWidth;\n\n const onResizeContainer = useEvent(() => {\n const el = containerRef.current;\n if (el) {\n setMeasuredWidth(el.offsetWidth);\n setMeasuredHeight(el.offsetHeight);\n }\n });\n useResizeObserver({ ref: containerRef, onResize: onResizeContainer });\n useEffect(() => {\n if (providedWidth == null) {\n onResizeContainer();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [providedWidth]);\n\n const { layout, layoutRef, placeholder, setPlaceholder, applyLayout } =\n useBoardLayout({\n layout: controlledLayout,\n defaultLayout,\n onLayoutChange,\n });\n\n // Re-render when any widget's registered content/config changes.\n useSyncExternalStore(registry.store.subscribe, registry.store.getVersion);\n\n // In aligned mode the board inherits the parent's gap so widget edges line up\n // with the surrounding layout; otherwise it uses its own `margin`.\n const effectiveMargin: readonly [number, number] = aligned\n ? parentMetrics!.margin\n : margin;\n // The board keeps its own padding (it sits inside the container's chrome);\n // when unspecified it defaults to the effective gap.\n const resolvedPadding: readonly [number, number] =\n containerPadding ?? effectiveMargin;\n\n const rows = Math.max(\n bottom(layout),\n placeholder ? placeholder.y + placeholder.h : 0,\n );\n\n // Derive the aligned column count so each column keeps the parent's pixel\n // pitch: as the container widget is resized, columns are added/removed rather\n // than stretched. `containerWidth` is then back-solved so `calcGridColWidth`\n // returns exactly the parent's column width.\n const parentColWidth = aligned ? parentMetrics!.colWidth : 0;\n const alignedCols =\n aligned && width > 0\n ? Math.max(\n 1,\n Math.floor(\n (width - resolvedPadding[0] * 2 + effectiveMargin[0]) /\n (parentColWidth + effectiveMargin[0]),\n ),\n )\n : cols;\n const effectiveCols = aligned ? alignedCols : cols;\n const effectiveContainerWidth = aligned\n ? parentColWidth * effectiveCols +\n effectiveMargin[0] * Math.max(0, effectiveCols - 1) +\n resolvedPadding[0] * 2\n : width;\n\n // Row height inherits the parent's as the target, but shrinks (never grows\n // beyond it) so the board's rows fit the height the container grants. When\n // the height is unbounded/unmeasured, it stays at the parent's row height.\n const parentRowHeight = aligned ? parentMetrics!.rowHeight : rowHeight;\n const effectiveRowHeight =\n aligned && rows > 0 && measuredHeight > 0\n ? clamp(\n (measuredHeight -\n Math.max(0, rows - 1) * effectiveMargin[1] -\n resolvedPadding[1] * 2) /\n rows,\n MIN_ALIGNED_ROW_HEIGHT,\n parentRowHeight,\n )\n : parentRowHeight;\n\n const positionParams = useMemo<PositionParams>(\n () => ({\n margin: effectiveMargin,\n containerPadding: resolvedPadding,\n containerWidth: effectiveContainerWidth,\n cols: effectiveCols,\n rowHeight: effectiveRowHeight,\n maxRows,\n }),\n [\n effectiveMargin[0],\n effectiveMargin[1],\n resolvedPadding[0],\n resolvedPadding[1],\n effectiveContainerWidth,\n effectiveCols,\n effectiveRowHeight,\n maxRows,\n ],\n );\n\n const compactor = useMemo<Compactor>(() => {\n // 'free' means true free positioning: widgets can overlap and nothing is\n // pushed or recompacted. Force allowOverlap so `moveElement` short-circuits\n // on collision and the (no-op) compactor leaves items exactly where dropped.\n if (compact === 'free') {\n return getCompactor(null, true, preventCollision);\n }\n return getCompactor(\n compactTypeToCore(compact),\n allowOverlap,\n preventCollision,\n );\n }, [compact, allowOverlap, preventCollision]);\n\n const resolvedConstraints = constraints ?? defaultConstraints;\n\n const computedHeight =\n rows > 0\n ? rows * effectiveRowHeight +\n Math.max(0, rows - 1) * effectiveMargin[1] +\n resolvedPadding[1] * 2\n : effectiveRowHeight;\n // An aligned board fills the height the container grants it, so it reports its\n // measured height; otherwise it reports the height its content needs.\n const containerHeight =\n aligned && measuredHeight > 0 ? measuredHeight : computedHeight;\n\n // Live refs so the stable registry entry always reads current values.\n const liveRef = useRef({\n positionParams,\n compactor,\n constraints: resolvedConstraints,\n maxRows,\n containerHeight,\n isDroppable,\n });\n liveRef.current = {\n positionParams,\n compactor,\n constraints: resolvedConstraints,\n maxRows,\n containerHeight,\n isDroppable,\n };\n\n const applyLayoutEvent = useEvent(applyLayout);\n const setPlaceholderEvent = useEvent(setPlaceholder);\n\n const entryRef = useRef<BoardEntry | null>(null);\n if (!entryRef.current) {\n entryRef.current = {\n id: boardId,\n getContentRect: () => contentRef.current?.getBoundingClientRect() ?? null,\n getContentNode: () => contentRef.current,\n getPositionParams: () => liveRef.current.positionParams,\n getConstraints: () => liveRef.current.constraints,\n getCompactor: () => liveRef.current.compactor,\n getMaxRows: () => liveRef.current.maxRows,\n getContainerHeight: () => liveRef.current.containerHeight,\n getLayout: () => layoutRef.current,\n applyLayout: (next, commit) => applyLayoutEvent(next, commit),\n setPlaceholder: (item) => setPlaceholderEvent(item),\n isDroppable: () => liveRef.current.isDroppable,\n };\n }\n\n useEffect(() => {\n const entry = entryRef.current!;\n // Keep the entry's id in sync with the (possibly changed) board id before\n // registering. The previous effect's cleanup has already removed the old id,\n // so registering here keys the entry under the current id.\n entry.id = boardId;\n return registry.registerBoard(entry);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [boardId]);\n\n // When the aligned column count changes (the container was resized), reflow\n // the layout to the new width: clamp items back into bounds and recompact so\n // nothing overflows the narrower/wider grid.\n const recompactForCols = useEvent((nextCols: number) => {\n const corrected = correctBounds(cloneLayout(layoutRef.current), {\n cols: nextCols,\n });\n const compacted = [\n ...liveRef.current.compactor.compact(corrected, nextCols),\n ];\n applyLayoutEvent(compacted, true);\n });\n const prevAlignedColsRef = useRef(effectiveCols);\n useEffect(() => {\n if (!aligned) {\n prevAlignedColsRef.current = effectiveCols;\n return;\n }\n if (prevAlignedColsRef.current === effectiveCols) return;\n prevAlignedColsRef.current = effectiveCols;\n recompactForCols(effectiveCols);\n }, [aligned, effectiveCols, recompactForCols]);\n\n // Natural height this board wants: its rows at the (unshrunk) target row\n // height. When aligned rows are shrunk to fit a short container, this exceeds\n // the measured height by the amount the board was squeezed.\n const naturalHeight =\n rows > 0\n ? rows * parentRowHeight +\n Math.max(0, rows - 1) * effectiveMargin[1] +\n resolvedPadding[1] * 2\n : parentRowHeight;\n\n // Report this aligned board's height deficit to an auto-sizing host so the\n // host can both grow to fit and pin its resize floor. The value is signed:\n // positive when the board is squeezed (needs more height), negative when the\n // container is taller than needed (so the floor can be lowered). The host\n // never shrinks the widget on its own - it only grows and clamps resizing.\n const requestHeightDeficit = host?.requestHeightDeficit;\n useEffect(() => {\n if (!aligned || !host?.isAutoHeight || !requestHeightDeficit) return;\n if (measuredHeight <= 0) return;\n requestHeightDeficit(naturalHeight - measuredHeight);\n }, [\n aligned,\n host?.isAutoHeight,\n requestHeightDeficit,\n naturalHeight,\n measuredHeight,\n ]);\n\n // In-board resize orchestration.\n const resizeStateRef = useRef<{\n id: string;\n axis: ResizeHandleAxis;\n item: LayoutItem;\n origin: Position;\n accX: number;\n accY: number;\n } | null>(null);\n\n // Minimum rows each auto-height widget currently needs to fit its content.\n // Read during resize so a widget can never be dragged shorter than its\n // content, and used to grow the item when the content needs more room.\n const autoHeightMinRowsRef = useRef<Record<string, number>>({});\n\n const handleResize = useEvent(\n (\n id: string,\n axis: ResizeHandleAxis,\n phase: ResizePhase,\n dx: number,\n dy: number,\n ) => {\n const pp = liveRef.current.positionParams;\n\n if (phase === 'start') {\n const rawItem = getLayoutItem(layoutRef.current, id);\n if (!rawItem) return;\n // Layout-item constraints win; otherwise fall back to the ones declared\n // on the owning `Board.Widget` so `applySizeConstraints` picks them up.\n const item: LayoutItem = {\n ...rawItem,\n constraints:\n rawItem.constraints ?? registry.store.get(id)?.constraints,\n };\n resizeStateRef.current = {\n id,\n axis,\n item: { ...item },\n origin: calcGridItemPosition(pp, item.x, item.y, item.w, item.h),\n accX: 0,\n accY: 0,\n };\n setPlaceholder({ ...item });\n return;\n }\n\n const rs = resizeStateRef.current;\n if (!rs) return;\n\n if (phase === 'end') {\n applyLayout([...layoutRef.current], true);\n setPlaceholder(null);\n resizeStateRef.current = null;\n return;\n }\n\n rs.accX += dx;\n rs.accY += dy;\n\n const { origin, item, axis: handle } = rs;\n let newW = origin.width;\n let newH = origin.height;\n if (handle.includes('e')) newW = origin.width + rs.accX;\n if (handle.includes('w')) newW = origin.width - rs.accX;\n if (handle.includes('s')) newH = origin.height + rs.accY;\n if (handle.includes('n')) newH = origin.height - rs.accY;\n newW = Math.max(newW, 8);\n newH = Math.max(newH, 8);\n\n const raw = calcWH(pp, newW, newH, item.x, item.y, handle);\n const constrained = applySizeConstraints(\n liveRef.current.constraints,\n item,\n raw.w,\n raw.h,\n handle,\n {\n cols: pp.cols,\n maxRows: liveRef.current.maxRows,\n containerWidth: pp.containerWidth,\n containerHeight: liveRef.current.containerHeight,\n rowHeight: pp.rowHeight,\n margin: pp.margin,\n layout: layoutRef.current,\n },\n );\n\n // An auto-height widget cannot be resized shorter than the content it\n // hosts (a nested board) currently needs, so pin its height to the floor.\n const floorRows = autoHeightMinRowsRef.current[id] ?? 0;\n const finalW = constrained.w;\n const finalH = Math.max(constrained.h, floorRows);\n\n let x = item.x;\n let y = item.y;\n if (handle.includes('w')) x = item.x + item.w - finalW;\n if (handle.includes('n')) y = item.y + item.h - finalH;\n x = Math.max(0, x);\n y = Math.max(0, y);\n\n const newItem: LayoutItem = {\n ...item,\n x,\n y,\n w: finalW,\n h: finalH,\n };\n const working = modifyLayout(layoutRef.current, newItem);\n const compacted = [\n ...liveRef.current.compactor.compact(working, pp.cols),\n ];\n applyLayout(compacted, false);\n setPlaceholder(getLayoutItem(compacted, id) ?? newItem);\n },\n );\n\n // Record an auto-height widget's needed rows. Grow the item when its content\n // needs more height (only ever increases); the stored value is also the\n // resize floor enforced in `handleResize`.\n const handleAutoHeight = useEvent((id: string, neededRows: number) => {\n autoHeightMinRowsRef.current[id] = neededRows;\n const current = getLayoutItem(layoutRef.current, id);\n if (!current || neededRows <= current.h) return;\n const pp = liveRef.current.positionParams;\n const working = modifyLayout(layoutRef.current, {\n ...current,\n h: neededRows,\n });\n const compacted = [...liveRef.current.compactor.compact(working, pp.cols)];\n applyLayout(compacted, true);\n });\n\n const styles: Styles = extractStyles(otherProps, CONTAINER_STYLES);\n\n const dragState = registry.dragState;\n const ready = width > 0;\n\n const placeholderStyle = placeholder\n ? (() => {\n const pos = calcGridItemPosition(\n positionParams,\n placeholder.x,\n placeholder.y,\n placeholder.w,\n placeholder.h,\n );\n return {\n transform: `translate(${pos.left}px, ${pos.top}px)`,\n width: `${pos.width}px`,\n height: `${pos.height}px`,\n };\n })()\n : null;\n\n const showPlaceholder = placeholder && placeholderStyle;\n\n // Metrics this board exposes to any aligned boards nested inside its widgets.\n const boardMetrics = useMemo<BoardMetrics>(\n () => ({\n colWidth: calcGridColWidth(positionParams),\n rowHeight: positionParams.rowHeight,\n margin: positionParams.margin,\n containerPadding: positionParams.containerPadding,\n }),\n [positionParams],\n );\n\n return (\n <BoardMetricsContext.Provider value={boardMetrics}>\n <BoardElement\n {...filterBaseProps(otherProps, { eventProps: true })}\n ref={containerRef}\n styles={styles}\n // Non-aligned: use min-height (not a fixed height) so the board\n // auto-sizes to its content by default but can still grow to fill a\n // taller parent. Widgets are absolutely positioned, so growing never\n // shifts them, and the content layer (inset: 0) always covers the full\n // board -> the whole board is droppable. Aligned: omit the inline height\n // so the board fills (and is bounded by) the space the container grants,\n // which is what drives the reduced row height.\n style={aligned ? undefined : { minHeight: `${containerHeight}px` }}\n mods={{\n dragging: !!dragState,\n 'drop-target': dragState?.currentBoardId === boardId,\n }}\n >\n <ContentLayer ref={contentRef}>\n {ready\n ? layout.map((item) => {\n const registration = registry.store.get(item.i);\n const widgetDraggable =\n isDraggable &&\n registration?.isDraggable !== false &&\n item.isDraggable !== false &&\n !item.static;\n const widgetResizable =\n isResizable &&\n registration?.isResizable !== false &&\n item.isResizable !== false &&\n !item.static;\n const handles =\n item.resizeHandles ??\n registration?.resizeHandles ??\n resizeHandles;\n\n return (\n <WidgetHost\n key={item.i}\n boardId={boardId}\n item={item}\n positionParams={positionParams}\n registration={registration}\n isDraggable={widgetDraggable}\n isResizable={widgetResizable}\n resizeHandles={handles}\n registry={registry}\n dragState={dragState}\n onResize={handleResize}\n onAutoHeight={handleAutoHeight}\n />\n );\n })\n : null}\n {showPlaceholder ? (\n <PlaceholderElement aria-hidden=\"true\" style={placeholderStyle!} />\n ) : null}\n </ContentLayer>\n {children}\n </BoardElement>\n </BoardMetricsContext.Provider>\n );\n}\n\nconst BoardInnerForwarded = forwardRef(BoardInner);\n\n/**\n * A draggable and resizable widget grid. Widgets are declared with\n * `Board.Widget` and positioned via a `layout`. Wrap multiple boards in a\n * `BoardProvider` to enable dragging widgets between them.\n */\nexport const Board = forwardRef(function Board(\n props: CubeBoardProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const existingRegistry = useBoardRegistry();\n\n if (existingRegistry) {\n return <BoardInnerForwarded {...props} ref={ref} />;\n }\n\n return (\n <BoardProvider>\n <BoardInnerForwarded {...props} ref={ref} />\n </BoardProvider>\n );\n});\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
|
|
2
2
|
import { BoardRegistryContext } from "./board-context.js";
|
|
3
3
|
import { useBoardRegistry } from "./use-board-registry.js";
|
|
4
4
|
import { tasty } from "@tenphi/tasty";
|
|
@@ -21,6 +21,12 @@ interface CubeBoardWidgetProps {
|
|
|
21
21
|
qa?: string;
|
|
22
22
|
/** Style overrides applied to the rendered widget element. */
|
|
23
23
|
styles?: Styles;
|
|
24
|
+
/**
|
|
25
|
+
* Grow this widget's height in its board to fit its content (only ever
|
|
26
|
+
* increases). Pair with a nested `Board isAligned` to make the container
|
|
27
|
+
* expand until the inner board's rows fit at the parent's row height.
|
|
28
|
+
*/
|
|
29
|
+
isAutoHeight?: boolean;
|
|
24
30
|
}
|
|
25
31
|
/**
|
|
26
32
|
* Declares a widget's content and per-widget options. Rendering and positioning
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
|
|
2
2
|
import { useLayoutEffect as useLayoutEffect$1 } from "../../../utils/react/useLayoutEffect.js";
|
|
3
3
|
import { useBoardRegistry } from "./board-context.js";
|
|
4
4
|
import { useEffect, useRef } from "react";
|
|
@@ -10,7 +10,7 @@ import { useEffect, useRef } from "react";
|
|
|
10
10
|
* which is what allows a widget to be transferred between boards.
|
|
11
11
|
*/
|
|
12
12
|
function Widget(props) {
|
|
13
|
-
const { id, children, isDraggable, isResizable, resizeHandles, constraints, qa, styles } = props;
|
|
13
|
+
const { id, children, isDraggable, isResizable, resizeHandles, constraints, qa, styles, isAutoHeight } = props;
|
|
14
14
|
const registry = useBoardRegistry();
|
|
15
15
|
const ownerRef = useRef({});
|
|
16
16
|
useLayoutEffect$1(() => {
|
|
@@ -22,7 +22,8 @@ function Widget(props) {
|
|
|
22
22
|
resizeHandles,
|
|
23
23
|
constraints,
|
|
24
24
|
qa,
|
|
25
|
-
styles
|
|
25
|
+
styles,
|
|
26
|
+
isAutoHeight
|
|
26
27
|
}, ownerRef.current);
|
|
27
28
|
});
|
|
28
29
|
useEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Widget.js","names":[],"sources":["../../../../src/components/layout/Board/Widget.tsx"],"sourcesContent":["import { Styles } from '@tenphi/tasty';\nimport { ReactNode, useEffect, useRef } from 'react';\n\nimport { useLayoutEffect } from '../../../utils/react';\n\nimport { useBoardRegistry } from './board-context';\nimport { LayoutConstraint, ResizeHandleAxis } from './grid-core';\n\nexport interface CubeBoardWidgetProps {\n /** Unique id, must match the `i` of a layout item in a `Board`. */\n id: string;\n /** Widget content. */\n children?: ReactNode;\n /** Disable dragging for this widget. */\n isDraggable?: boolean;\n /** Disable resizing for this widget. */\n isResizable?: boolean;\n /** Which resize handles to show (overrides the board default). */\n resizeHandles?: ResizeHandleAxis[];\n /** Per-widget layout constraints. */\n constraints?: LayoutConstraint[];\n /** Test id applied to the rendered widget element. */\n qa?: string;\n /** Style overrides applied to the rendered widget element. */\n styles?: Styles;\n}\n\n/**\n * Declares a widget's content and per-widget options. Rendering and positioning\n * are performed by the owning `Board` (the component itself renders nothing),\n * which is what allows a widget to be transferred between boards.\n */\nexport function Widget(props: CubeBoardWidgetProps) {\n const {\n id,\n children,\n isDraggable,\n isResizable,\n resizeHandles,\n constraints,\n qa,\n styles,\n } = props;\n const registry = useBoardRegistry();\n\n // Stable per-instance token so a stale unregister (from an unmounting copy of\n // this widget) can't wipe out a newer instance's registration.\n const ownerRef = useRef({});\n\n // Register/update content on every render so content stays fresh in the store.\n useLayoutEffect(() => {\n registry?.store.register(\n {\n id,\n content: children,\n isDraggable,\n isResizable,\n resizeHandles,\n constraints,\n qa,\n styles,\n },\n ownerRef.current,\n );\n });\n\n // Remove from the store on unmount.\n useEffect(() => {\n const owner = ownerRef.current;\n return () => {\n registry?.store.unregister(id, owner);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"Widget.js","names":[],"sources":["../../../../src/components/layout/Board/Widget.tsx"],"sourcesContent":["import { Styles } from '@tenphi/tasty';\nimport { ReactNode, useEffect, useRef } from 'react';\n\nimport { useLayoutEffect } from '../../../utils/react';\n\nimport { useBoardRegistry } from './board-context';\nimport { LayoutConstraint, ResizeHandleAxis } from './grid-core';\n\nexport interface CubeBoardWidgetProps {\n /** Unique id, must match the `i` of a layout item in a `Board`. */\n id: string;\n /** Widget content. */\n children?: ReactNode;\n /** Disable dragging for this widget. */\n isDraggable?: boolean;\n /** Disable resizing for this widget. */\n isResizable?: boolean;\n /** Which resize handles to show (overrides the board default). */\n resizeHandles?: ResizeHandleAxis[];\n /** Per-widget layout constraints. */\n constraints?: LayoutConstraint[];\n /** Test id applied to the rendered widget element. */\n qa?: string;\n /** Style overrides applied to the rendered widget element. */\n styles?: Styles;\n /**\n * Grow this widget's height in its board to fit its content (only ever\n * increases). Pair with a nested `Board isAligned` to make the container\n * expand until the inner board's rows fit at the parent's row height.\n */\n isAutoHeight?: boolean;\n}\n\n/**\n * Declares a widget's content and per-widget options. Rendering and positioning\n * are performed by the owning `Board` (the component itself renders nothing),\n * which is what allows a widget to be transferred between boards.\n */\nexport function Widget(props: CubeBoardWidgetProps) {\n const {\n id,\n children,\n isDraggable,\n isResizable,\n resizeHandles,\n constraints,\n qa,\n styles,\n isAutoHeight,\n } = props;\n const registry = useBoardRegistry();\n\n // Stable per-instance token so a stale unregister (from an unmounting copy of\n // this widget) can't wipe out a newer instance's registration.\n const ownerRef = useRef({});\n\n // Register/update content on every render so content stays fresh in the store.\n useLayoutEffect(() => {\n registry?.store.register(\n {\n id,\n content: children,\n isDraggable,\n isResizable,\n resizeHandles,\n constraints,\n qa,\n styles,\n isAutoHeight,\n },\n ownerRef.current,\n );\n });\n\n // Remove from the store on unmount.\n useEffect(() => {\n const owner = ownerRef.current;\n return () => {\n registry?.store.unregister(id, owner);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;AAsCA,SAAgB,OAAO,OAA6B;CAClD,MAAM,EACJ,IACA,UACA,aACA,aACA,eACA,aACA,IACA,QACA,iBACE;CACJ,MAAM,WAAW,kBAAkB;CAInC,MAAM,WAAW,OAAO,EAAE,CAAC;AAG3B,yBAAsB;AACpB,YAAU,MAAM,SACd;GACE;GACA,SAAS;GACT;GACA;GACA;GACA;GACA;GACA;GACA;GACD,EACD,SAAS,QACV;GACD;AAGF,iBAAgB;EACd,MAAM,QAAQ,SAAS;AACvB,eAAa;AACX,aAAU,MAAM,WAAW,IAAI,MAAM;;IAGtC,CAAC,GAAG,CAAC;AAER,QAAO"}
|
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
|
|
2
2
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
|
+
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
4
|
+
import { BoardHostContext } from "./board-context.js";
|
|
3
5
|
import { calcGridColWidth, calcGridItemPosition } from "./grid-core/calculate.js";
|
|
4
6
|
import { tasty } from "@tenphi/tasty";
|
|
5
|
-
import { useRef, useState } from "react";
|
|
7
|
+
import { useMemo, useRef, useState } from "react";
|
|
6
8
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
7
9
|
import { useFocusWithin, useHover, useMove } from "react-aria";
|
|
8
10
|
import { createPortal } from "react-dom";
|
|
9
11
|
|
|
10
12
|
//#region src/components/layout/Board/WidgetHost.tsx
|
|
13
|
+
/**
|
|
14
|
+
* Slack (px) absorbed when converting an auto-height widget's content height to
|
|
15
|
+
* whole rows, so sub-pixel measurement/rounding noise never bumps an extra row.
|
|
16
|
+
*/
|
|
17
|
+
const AUTO_HEIGHT_TOLERANCE = 4;
|
|
11
18
|
const WidgetElement = tasty({
|
|
12
19
|
qa: "BoardWidget",
|
|
13
20
|
styles: {
|
|
@@ -19,7 +26,7 @@ const WidgetElement = tasty({
|
|
|
19
26
|
border: true,
|
|
20
27
|
shadow: {
|
|
21
28
|
"": false,
|
|
22
|
-
"drag | resizing": "
|
|
29
|
+
"drag | resizing": "$dialog-shadow"
|
|
23
30
|
},
|
|
24
31
|
zIndex: {
|
|
25
32
|
"": 1,
|
|
@@ -175,9 +182,22 @@ function ResizeHandle({ axis, onResize }) {
|
|
|
175
182
|
* renders into the shared overlay portal so it can float outside its board.
|
|
176
183
|
*/
|
|
177
184
|
function WidgetHost(props) {
|
|
178
|
-
const { boardId, item, positionParams, registration, isDraggable, isResizable, resizeHandles, registry, dragState, onResize } = props;
|
|
185
|
+
const { boardId, item, positionParams, registration, isDraggable, isResizable, resizeHandles, registry, dragState, onResize, onAutoHeight } = props;
|
|
179
186
|
const hostRef = useRef(null);
|
|
180
187
|
const isActiveDrag = dragState?.itemId === item.i;
|
|
188
|
+
const isAutoHeight = registration?.isAutoHeight === true;
|
|
189
|
+
const requestHeightDeficit = useEvent((deficitPx) => {
|
|
190
|
+
if (!isAutoHeight || isActiveDrag) return;
|
|
191
|
+
const step = positionParams.rowHeight + positionParams.margin[1];
|
|
192
|
+
if (step <= 0) return;
|
|
193
|
+
const neededPx = calcGridItemPosition(positionParams, item.x, item.y, item.w, item.h).height + deficitPx;
|
|
194
|
+
const neededRows = Math.max(1, Math.ceil((neededPx + positionParams.margin[1] - AUTO_HEIGHT_TOLERANCE) / step));
|
|
195
|
+
onAutoHeight(item.i, neededRows);
|
|
196
|
+
});
|
|
197
|
+
const hostValue = useMemo(() => ({
|
|
198
|
+
isAutoHeight,
|
|
199
|
+
requestHeightDeficit
|
|
200
|
+
}), [isAutoHeight, requestHeightDeficit]);
|
|
181
201
|
const useOverlay = isActiveDrag && dragState?.pointerType !== "keyboard";
|
|
182
202
|
const [isResizing, setIsResizing] = useState(false);
|
|
183
203
|
const [isFocusWithin, setIsFocusWithin] = useState(false);
|
|
@@ -200,7 +220,7 @@ function WidgetHost(props) {
|
|
|
200
220
|
width: pos.width,
|
|
201
221
|
height: pos.height
|
|
202
222
|
};
|
|
203
|
-
registry.onDragStart(boardId, item.i, vr, e.pointerType);
|
|
223
|
+
registry.onDragStart(boardId, item.i, vr, e.pointerType, hostRef.current);
|
|
204
224
|
},
|
|
205
225
|
onMove(e) {
|
|
206
226
|
if (!isDraggable) return;
|
|
@@ -233,14 +253,17 @@ function WidgetHost(props) {
|
|
|
233
253
|
static: !!item.static,
|
|
234
254
|
resizing: isResizing
|
|
235
255
|
};
|
|
236
|
-
const content = /* @__PURE__ */ jsxs(
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
256
|
+
const content = /* @__PURE__ */ jsxs(BoardHostContext.Provider, {
|
|
257
|
+
value: hostValue,
|
|
258
|
+
children: [registration?.content, isResizable && !item.static ? /* @__PURE__ */ jsxs(Fragment$1, { children: [resizeHandles.map((axis) => /* @__PURE__ */ jsx(ResizeHandle, {
|
|
259
|
+
axis,
|
|
260
|
+
onResize: handleResize
|
|
261
|
+
}, axis)), resizeHandles.filter(isCornerAxis).map((axis) => /* @__PURE__ */ jsx(GripElement, {
|
|
262
|
+
"data-axis": axis,
|
|
263
|
+
mods: { revealed: gripsRevealed },
|
|
264
|
+
"aria-hidden": "true"
|
|
265
|
+
}, `grip-${axis}`))] }) : null]
|
|
266
|
+
});
|
|
244
267
|
const pos = calcGridItemPosition(positionParams, item.x, item.y, item.w, item.h);
|
|
245
268
|
const overlayNode = registry.overlayRef.current;
|
|
246
269
|
const floatInOverlay = useOverlay && !!overlayNode && !!dragState;
|