@vuu-ui/vuu-layout 0.0.26
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/LICENSE +201 -0
- package/README.md +1 -0
- package/cjs/Component.js +14 -0
- package/cjs/Component.js.map +1 -0
- package/cjs/DraggableLayout.css.js +6 -0
- package/cjs/DraggableLayout.css.js.map +1 -0
- package/cjs/DraggableLayout.js +33 -0
- package/cjs/DraggableLayout.js.map +1 -0
- package/cjs/dock-layout/DockLayout.css.js +6 -0
- package/cjs/dock-layout/DockLayout.css.js.map +1 -0
- package/cjs/dock-layout/DockLayout.js +36 -0
- package/cjs/dock-layout/DockLayout.js.map +1 -0
- package/cjs/dock-layout/Drawer.css.js +6 -0
- package/cjs/dock-layout/Drawer.css.js.map +1 -0
- package/cjs/dock-layout/Drawer.js +96 -0
- package/cjs/dock-layout/Drawer.js.map +1 -0
- package/cjs/drag-drop/BoxModel.js +422 -0
- package/cjs/drag-drop/BoxModel.js.map +1 -0
- package/cjs/drag-drop/DragState.js +154 -0
- package/cjs/drag-drop/DragState.js.map +1 -0
- package/cjs/drag-drop/Draggable.js +192 -0
- package/cjs/drag-drop/Draggable.js.map +1 -0
- package/cjs/drag-drop/DropMenu.css.js +6 -0
- package/cjs/drag-drop/DropMenu.css.js.map +1 -0
- package/cjs/drag-drop/DropMenu.js +55 -0
- package/cjs/drag-drop/DropMenu.js.map +1 -0
- package/cjs/drag-drop/DropTarget.js +244 -0
- package/cjs/drag-drop/DropTarget.js.map +1 -0
- package/cjs/drag-drop/DropTargetRenderer.js +244 -0
- package/cjs/drag-drop/DropTargetRenderer.js.map +1 -0
- package/cjs/flexbox/Flexbox.css.js +6 -0
- package/cjs/flexbox/Flexbox.css.js.map +1 -0
- package/cjs/flexbox/Flexbox.js +70 -0
- package/cjs/flexbox/Flexbox.js.map +1 -0
- package/cjs/flexbox/FlexboxLayout.js +30 -0
- package/cjs/flexbox/FlexboxLayout.js.map +1 -0
- package/cjs/flexbox/FluidGrid.css.js +6 -0
- package/cjs/flexbox/FluidGrid.css.js.map +1 -0
- package/cjs/flexbox/FluidGrid.js +87 -0
- package/cjs/flexbox/FluidGrid.js.map +1 -0
- package/cjs/flexbox/FluidGridLayout.js +14 -0
- package/cjs/flexbox/FluidGridLayout.js.map +1 -0
- package/cjs/flexbox/Splitter.css.js +6 -0
- package/cjs/flexbox/Splitter.css.js.map +1 -0
- package/cjs/flexbox/Splitter.js +122 -0
- package/cjs/flexbox/Splitter.js.map +1 -0
- package/cjs/flexbox/flexbox-utils.js +109 -0
- package/cjs/flexbox/flexbox-utils.js.map +1 -0
- package/cjs/flexbox/useResponsiveSizing.js +62 -0
- package/cjs/flexbox/useResponsiveSizing.js.map +1 -0
- package/cjs/flexbox/useSplitterResizing.js +209 -0
- package/cjs/flexbox/useSplitterResizing.js.map +1 -0
- package/cjs/index.js +133 -0
- package/cjs/index.js.map +1 -0
- package/cjs/layout-action.js +27 -0
- package/cjs/layout-action.js.map +1 -0
- package/cjs/layout-header/Header.css.js +6 -0
- package/cjs/layout-header/Header.css.js.map +1 -0
- package/cjs/layout-header/Header.js +131 -0
- package/cjs/layout-header/Header.js.map +1 -0
- package/cjs/layout-provider/LayoutProvider.js +178 -0
- package/cjs/layout-provider/LayoutProvider.js.map +1 -0
- package/cjs/layout-provider/LayoutProviderContext.js +14 -0
- package/cjs/layout-provider/LayoutProviderContext.js.map +1 -0
- package/cjs/layout-provider/useLayoutDragDrop.js +172 -0
- package/cjs/layout-provider/useLayoutDragDrop.js.map +1 -0
- package/cjs/layout-reducer/flexUtils.js +219 -0
- package/cjs/layout-reducer/flexUtils.js.map +1 -0
- package/cjs/layout-reducer/insert-layout-element.js +273 -0
- package/cjs/layout-reducer/insert-layout-element.js.map +1 -0
- package/cjs/layout-reducer/layout-reducer.js +198 -0
- package/cjs/layout-reducer/layout-reducer.js.map +1 -0
- package/cjs/layout-reducer/layoutTypes.js +41 -0
- package/cjs/layout-reducer/layoutTypes.js.map +1 -0
- package/cjs/layout-reducer/layoutUtils.js +226 -0
- package/cjs/layout-reducer/layoutUtils.js.map +1 -0
- package/cjs/layout-reducer/move-layout-element.js +31 -0
- package/cjs/layout-reducer/move-layout-element.js.map +1 -0
- package/cjs/layout-reducer/remove-layout-element.js +223 -0
- package/cjs/layout-reducer/remove-layout-element.js.map +1 -0
- package/cjs/layout-reducer/replace-layout-element.js +91 -0
- package/cjs/layout-reducer/replace-layout-element.js.map +1 -0
- package/cjs/layout-reducer/resize-flex-children.js +61 -0
- package/cjs/layout-reducer/resize-flex-children.js.map +1 -0
- package/cjs/layout-reducer/wrap-layout-element.js +212 -0
- package/cjs/layout-reducer/wrap-layout-element.js.map +1 -0
- package/cjs/layout-view/View.css.js +6 -0
- package/cjs/layout-view/View.css.js.map +1 -0
- package/cjs/layout-view/View.js +164 -0
- package/cjs/layout-view/View.js.map +1 -0
- package/cjs/layout-view/useView.js +92 -0
- package/cjs/layout-view/useView.js.map +1 -0
- package/cjs/layout-view/useViewResize.js +42 -0
- package/cjs/layout-view/useViewResize.js.map +1 -0
- package/cjs/layout-view-actions/ViewContext.js +16 -0
- package/cjs/layout-view-actions/ViewContext.js.map +1 -0
- package/cjs/layout-view-actions/useViewActionDispatcher.js +103 -0
- package/cjs/layout-view-actions/useViewActionDispatcher.js.map +1 -0
- package/cjs/palette/Palette.css.js +6 -0
- package/cjs/palette/Palette.css.js.map +1 -0
- package/cjs/palette/Palette.js +127 -0
- package/cjs/palette/Palette.js.map +1 -0
- package/cjs/placeholder/LayoutStartPanel.css.js +6 -0
- package/cjs/placeholder/LayoutStartPanel.css.js.map +1 -0
- package/cjs/placeholder/LayoutStartPanel.js +60 -0
- package/cjs/placeholder/LayoutStartPanel.js.map +1 -0
- package/cjs/placeholder/Placeholder.css.js +6 -0
- package/cjs/placeholder/Placeholder.css.js.map +1 -0
- package/cjs/placeholder/Placeholder.js +34 -0
- package/cjs/placeholder/Placeholder.js.map +1 -0
- package/cjs/registry/ComponentRegistry.js +27 -0
- package/cjs/registry/ComponentRegistry.js.map +1 -0
- package/cjs/responsive/breakpoints.js +36 -0
- package/cjs/responsive/breakpoints.js.map +1 -0
- package/cjs/responsive/use-breakpoints.js +76 -0
- package/cjs/responsive/use-breakpoints.js.map +1 -0
- package/cjs/responsive/useResizeObserver.js +118 -0
- package/cjs/responsive/useResizeObserver.js.map +1 -0
- package/cjs/responsive/utils.js +34 -0
- package/cjs/responsive/utils.js.map +1 -0
- package/cjs/stack/Stack.css.js +6 -0
- package/cjs/stack/Stack.css.js.map +1 -0
- package/cjs/stack/Stack.js +148 -0
- package/cjs/stack/Stack.js.map +1 -0
- package/cjs/stack/StackLayout.js +122 -0
- package/cjs/stack/StackLayout.js.map +1 -0
- package/cjs/use-persistent-state.js +109 -0
- package/cjs/use-persistent-state.js.map +1 -0
- package/cjs/utils/pathUtils.js +293 -0
- package/cjs/utils/pathUtils.js.map +1 -0
- package/cjs/utils/propUtils.js +27 -0
- package/cjs/utils/propUtils.js.map +1 -0
- package/cjs/utils/refUtils.js +12 -0
- package/cjs/utils/refUtils.js.map +1 -0
- package/cjs/utils/styleUtils.js +15 -0
- package/cjs/utils/styleUtils.js.map +1 -0
- package/cjs/utils/typeOf.js +27 -0
- package/cjs/utils/typeOf.js.map +1 -0
- package/esm/Component.js +12 -0
- package/esm/Component.js.map +1 -0
- package/esm/DraggableLayout.css.js +4 -0
- package/esm/DraggableLayout.css.js.map +1 -0
- package/esm/DraggableLayout.js +31 -0
- package/esm/DraggableLayout.js.map +1 -0
- package/esm/dock-layout/DockLayout.css.js +4 -0
- package/esm/dock-layout/DockLayout.css.js.map +1 -0
- package/esm/dock-layout/DockLayout.js +34 -0
- package/esm/dock-layout/DockLayout.js.map +1 -0
- package/esm/dock-layout/Drawer.css.js +4 -0
- package/esm/dock-layout/Drawer.css.js.map +1 -0
- package/esm/dock-layout/Drawer.js +94 -0
- package/esm/dock-layout/Drawer.js.map +1 -0
- package/esm/drag-drop/BoxModel.js +415 -0
- package/esm/drag-drop/BoxModel.js.map +1 -0
- package/esm/drag-drop/DragState.js +152 -0
- package/esm/drag-drop/DragState.js.map +1 -0
- package/esm/drag-drop/Draggable.js +190 -0
- package/esm/drag-drop/Draggable.js.map +1 -0
- package/esm/drag-drop/DropMenu.css.js +4 -0
- package/esm/drag-drop/DropMenu.css.js.map +1 -0
- package/esm/drag-drop/DropMenu.js +52 -0
- package/esm/drag-drop/DropMenu.js.map +1 -0
- package/esm/drag-drop/DropTarget.js +240 -0
- package/esm/drag-drop/DropTarget.js.map +1 -0
- package/esm/drag-drop/DropTargetRenderer.js +242 -0
- package/esm/drag-drop/DropTargetRenderer.js.map +1 -0
- package/esm/flexbox/Flexbox.css.js +4 -0
- package/esm/flexbox/Flexbox.css.js.map +1 -0
- package/esm/flexbox/Flexbox.js +68 -0
- package/esm/flexbox/Flexbox.js.map +1 -0
- package/esm/flexbox/FlexboxLayout.js +28 -0
- package/esm/flexbox/FlexboxLayout.js.map +1 -0
- package/esm/flexbox/FluidGrid.css.js +4 -0
- package/esm/flexbox/FluidGrid.css.js.map +1 -0
- package/esm/flexbox/FluidGrid.js +85 -0
- package/esm/flexbox/FluidGrid.js.map +1 -0
- package/esm/flexbox/FluidGridLayout.js +12 -0
- package/esm/flexbox/FluidGridLayout.js.map +1 -0
- package/esm/flexbox/Splitter.css.js +4 -0
- package/esm/flexbox/Splitter.css.js.map +1 -0
- package/esm/flexbox/Splitter.js +120 -0
- package/esm/flexbox/Splitter.js.map +1 -0
- package/esm/flexbox/flexbox-utils.js +103 -0
- package/esm/flexbox/flexbox-utils.js.map +1 -0
- package/esm/flexbox/useResponsiveSizing.js +60 -0
- package/esm/flexbox/useResponsiveSizing.js.map +1 -0
- package/esm/flexbox/useSplitterResizing.js +207 -0
- package/esm/flexbox/useSplitterResizing.js.map +1 -0
- package/esm/index.js +37 -0
- package/esm/index.js.map +1 -0
- package/esm/layout-action.js +25 -0
- package/esm/layout-action.js.map +1 -0
- package/esm/layout-header/Header.css.js +4 -0
- package/esm/layout-header/Header.css.js.map +1 -0
- package/esm/layout-header/Header.js +129 -0
- package/esm/layout-header/Header.js.map +1 -0
- package/esm/layout-provider/LayoutProvider.js +172 -0
- package/esm/layout-provider/LayoutProvider.js.map +1 -0
- package/esm/layout-provider/LayoutProviderContext.js +12 -0
- package/esm/layout-provider/LayoutProviderContext.js.map +1 -0
- package/esm/layout-provider/useLayoutDragDrop.js +170 -0
- package/esm/layout-provider/useLayoutDragDrop.js.map +1 -0
- package/esm/layout-reducer/flexUtils.js +210 -0
- package/esm/layout-reducer/flexUtils.js.map +1 -0
- package/esm/layout-reducer/insert-layout-element.js +269 -0
- package/esm/layout-reducer/insert-layout-element.js.map +1 -0
- package/esm/layout-reducer/layout-reducer.js +196 -0
- package/esm/layout-reducer/layout-reducer.js.map +1 -0
- package/esm/layout-reducer/layoutTypes.js +37 -0
- package/esm/layout-reducer/layoutTypes.js.map +1 -0
- package/esm/layout-reducer/layoutUtils.js +215 -0
- package/esm/layout-reducer/layoutUtils.js.map +1 -0
- package/esm/layout-reducer/move-layout-element.js +29 -0
- package/esm/layout-reducer/move-layout-element.js.map +1 -0
- package/esm/layout-reducer/remove-layout-element.js +221 -0
- package/esm/layout-reducer/remove-layout-element.js.map +1 -0
- package/esm/layout-reducer/replace-layout-element.js +87 -0
- package/esm/layout-reducer/replace-layout-element.js.map +1 -0
- package/esm/layout-reducer/resize-flex-children.js +58 -0
- package/esm/layout-reducer/resize-flex-children.js.map +1 -0
- package/esm/layout-reducer/wrap-layout-element.js +210 -0
- package/esm/layout-reducer/wrap-layout-element.js.map +1 -0
- package/esm/layout-view/View.css.js +4 -0
- package/esm/layout-view/View.css.js.map +1 -0
- package/esm/layout-view/View.js +162 -0
- package/esm/layout-view/View.js.map +1 -0
- package/esm/layout-view/useView.js +90 -0
- package/esm/layout-view/useView.js.map +1 -0
- package/esm/layout-view/useViewResize.js +40 -0
- package/esm/layout-view/useViewResize.js.map +1 -0
- package/esm/layout-view-actions/ViewContext.js +12 -0
- package/esm/layout-view-actions/ViewContext.js.map +1 -0
- package/esm/layout-view-actions/useViewActionDispatcher.js +101 -0
- package/esm/layout-view-actions/useViewActionDispatcher.js.map +1 -0
- package/esm/palette/Palette.css.js +4 -0
- package/esm/palette/Palette.css.js.map +1 -0
- package/esm/palette/Palette.js +124 -0
- package/esm/palette/Palette.js.map +1 -0
- package/esm/placeholder/LayoutStartPanel.css.js +4 -0
- package/esm/placeholder/LayoutStartPanel.css.js.map +1 -0
- package/esm/placeholder/LayoutStartPanel.js +58 -0
- package/esm/placeholder/LayoutStartPanel.js.map +1 -0
- package/esm/placeholder/Placeholder.css.js +4 -0
- package/esm/placeholder/Placeholder.css.js.map +1 -0
- package/esm/placeholder/Placeholder.js +32 -0
- package/esm/placeholder/Placeholder.js.map +1 -0
- package/esm/registry/ComponentRegistry.js +21 -0
- package/esm/registry/ComponentRegistry.js.map +1 -0
- package/esm/responsive/breakpoints.js +33 -0
- package/esm/responsive/breakpoints.js.map +1 -0
- package/esm/responsive/use-breakpoints.js +74 -0
- package/esm/responsive/use-breakpoints.js.map +1 -0
- package/esm/responsive/useResizeObserver.js +112 -0
- package/esm/responsive/useResizeObserver.js.map +1 -0
- package/esm/responsive/utils.js +31 -0
- package/esm/responsive/utils.js.map +1 -0
- package/esm/stack/Stack.css.js +4 -0
- package/esm/stack/Stack.css.js.map +1 -0
- package/esm/stack/Stack.js +146 -0
- package/esm/stack/Stack.js.map +1 -0
- package/esm/stack/StackLayout.js +120 -0
- package/esm/stack/StackLayout.js.map +1 -0
- package/esm/use-persistent-state.js +104 -0
- package/esm/use-persistent-state.js.map +1 -0
- package/esm/utils/pathUtils.js +280 -0
- package/esm/utils/pathUtils.js.map +1 -0
- package/esm/utils/propUtils.js +23 -0
- package/esm/utils/propUtils.js.map +1 -0
- package/esm/utils/refUtils.js +10 -0
- package/esm/utils/refUtils.js.map +1 -0
- package/esm/utils/styleUtils.js +13 -0
- package/esm/utils/styleUtils.js.map +1 -0
- package/esm/utils/typeOf.js +23 -0
- package/esm/utils/typeOf.js.map +1 -0
- package/package.json +43 -0
- package/types/Component.d.ts +7 -0
- package/types/DraggableLayout.d.ts +6 -0
- package/types/debug.d.ts +2 -0
- package/types/dock-layout/DockLayout.d.ts +9 -0
- package/types/dock-layout/Drawer.d.ts +17 -0
- package/types/dock-layout/index.d.ts +2 -0
- package/types/drag-drop/BoxModel.d.ts +143 -0
- package/types/drag-drop/DragState.d.ts +46 -0
- package/types/drag-drop/Draggable.d.ts +24 -0
- package/types/drag-drop/DropMenu.d.ts +9 -0
- package/types/drag-drop/DropTarget.d.ts +61 -0
- package/types/drag-drop/DropTargetRenderer.d.ts +17 -0
- package/types/drag-drop/dragDropTypes.d.ts +51 -0
- package/types/drag-drop/index.d.ts +4 -0
- package/types/flexbox/Flexbox.d.ts +4 -0
- package/types/flexbox/FlexboxLayout.d.ts +6 -0
- package/types/flexbox/FluidGrid.d.ts +6 -0
- package/types/flexbox/FluidGridLayout.d.ts +6 -0
- package/types/flexbox/Splitter.d.ts +12 -0
- package/types/flexbox/flexbox-utils.d.ts +12 -0
- package/types/flexbox/flexboxTypes.d.ts +51 -0
- package/types/flexbox/index.d.ts +4 -0
- package/types/flexbox/useResponsiveSizing.d.ts +10 -0
- package/types/flexbox/useSplitterResizing.d.ts +2 -0
- package/types/index.d.ts +18 -0
- package/types/layout-action.d.ts +22 -0
- package/types/layout-header/ActionButton.d.ts +8 -0
- package/types/layout-header/Header.d.ts +12 -0
- package/types/layout-header/index.d.ts +1 -0
- package/types/layout-provider/LayoutProvider.d.ts +15 -0
- package/types/layout-provider/LayoutProviderContext.d.ts +9 -0
- package/types/layout-provider/index.d.ts +2 -0
- package/types/layout-provider/useLayoutDragDrop.d.ts +4 -0
- package/types/layout-reducer/flexUtils.d.ts +22 -0
- package/types/layout-reducer/index.d.ts +4 -0
- package/types/layout-reducer/insert-layout-element.d.ts +8 -0
- package/types/layout-reducer/layout-reducer.d.ts +3 -0
- package/types/layout-reducer/layoutTypes.d.ts +193 -0
- package/types/layout-reducer/layoutUtils.d.ts +38 -0
- package/types/layout-reducer/move-layout-element.d.ts +3 -0
- package/types/layout-reducer/remove-layout-element.d.ts +3 -0
- package/types/layout-reducer/replace-layout-element.d.ts +6 -0
- package/types/layout-reducer/resize-flex-children.d.ts +4 -0
- package/types/layout-reducer/wrap-layout-element.d.ts +9 -0
- package/types/layout-view/View.d.ts +10 -0
- package/types/layout-view/index.d.ts +2 -0
- package/types/layout-view/useView.d.ts +21 -0
- package/types/layout-view/useViewResize.d.ts +7 -0
- package/types/layout-view/viewTypes.d.ts +21 -0
- package/types/layout-view-actions/ViewContext.d.ts +33 -0
- package/types/layout-view-actions/index.d.ts +2 -0
- package/types/layout-view-actions/useViewActionDispatcher.d.ts +9 -0
- package/types/palette/Palette.d.ts +21 -0
- package/types/palette/index.d.ts +1 -0
- package/types/placeholder/LayoutStartPanel.d.ts +5 -0
- package/types/placeholder/Placeholder.d.ts +17 -0
- package/types/placeholder/index.d.ts +1 -0
- package/types/registry/ComponentRegistry.d.ts +13 -0
- package/types/registry/index.d.ts +1 -0
- package/types/responsive/breakpoints.d.ts +4 -0
- package/types/responsive/index.d.ts +3 -0
- package/types/responsive/measureMinimumNodeSize.d.ts +1 -0
- package/types/responsive/overflowUtils.d.ts +2 -0
- package/types/responsive/use-breakpoints.d.ts +7 -0
- package/types/responsive/useResizeObserver.d.ts +13 -0
- package/types/responsive/utils.d.ts +6 -0
- package/types/stack/Stack.d.ts +3 -0
- package/types/stack/StackLayout.d.ts +6 -0
- package/types/stack/index.d.ts +3 -0
- package/types/stack/stackTypes.d.ts +22 -0
- package/types/tabs/TabPanel.d.ts +7 -0
- package/types/tabs/index.d.ts +1 -0
- package/types/tools/config-wrapper/ConfigWrapper.d.ts +2 -0
- package/types/tools/config-wrapper/index.d.ts +1 -0
- package/types/tools/devtools-box/layout-configurator.d.ts +31 -0
- package/types/tools/devtools-tree/layout-tree-viewer.d.ts +5 -0
- package/types/tools/index.d.ts +3 -0
- package/types/use-persistent-state.d.ts +11 -0
- package/types/utils/index.d.ts +5 -0
- package/types/utils/pathUtils.d.ts +31 -0
- package/types/utils/propUtils.d.ts +5 -0
- package/types/utils/refUtils.d.ts +2 -0
- package/types/utils/styleUtils.d.ts +3 -0
- package/types/utils/typeOf.d.ts +5 -0
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
|
+
var ComponentRegistry = require('../registry/ComponentRegistry.js');
|
|
5
|
+
require('react');
|
|
6
|
+
var propUtils = require('../utils/propUtils.js');
|
|
7
|
+
var typeOf = require('../utils/typeOf.js');
|
|
8
|
+
|
|
9
|
+
const positionValues = {
|
|
10
|
+
north: 1,
|
|
11
|
+
east: 2,
|
|
12
|
+
south: 4,
|
|
13
|
+
west: 8,
|
|
14
|
+
header: 16,
|
|
15
|
+
centre: 32,
|
|
16
|
+
absolute: 64
|
|
17
|
+
};
|
|
18
|
+
const RelativeDropPosition = {
|
|
19
|
+
AFTER: "after",
|
|
20
|
+
BEFORE: "before"
|
|
21
|
+
};
|
|
22
|
+
const Position = Object.freeze({
|
|
23
|
+
North: _position("north"),
|
|
24
|
+
East: _position("east"),
|
|
25
|
+
South: _position("south"),
|
|
26
|
+
West: _position("west"),
|
|
27
|
+
Header: _position("header"),
|
|
28
|
+
Centre: _position("centre"),
|
|
29
|
+
Absolute: _position("absolute")
|
|
30
|
+
});
|
|
31
|
+
function _position(str) {
|
|
32
|
+
return Object.freeze({
|
|
33
|
+
offset: str === "north" || str === "west" ? 0 : str === "south" || str === "east" ? 1 : NaN,
|
|
34
|
+
valueOf: function() {
|
|
35
|
+
return positionValues[str];
|
|
36
|
+
},
|
|
37
|
+
toString: function() {
|
|
38
|
+
return str;
|
|
39
|
+
},
|
|
40
|
+
North: str === "north",
|
|
41
|
+
South: str === "south",
|
|
42
|
+
East: str === "east",
|
|
43
|
+
West: str === "west",
|
|
44
|
+
Header: str === "header",
|
|
45
|
+
Centre: str === "centre",
|
|
46
|
+
NorthOrSouth: str === "north" || str === "south",
|
|
47
|
+
EastOrWest: str === "east" || str === "west",
|
|
48
|
+
NorthOrWest: str === "north" || str === "west",
|
|
49
|
+
SouthOrEast: str === "east" || str === "south",
|
|
50
|
+
Absolute: str === "absolute"
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const NORTH = Position.North, SOUTH = Position.South, EAST = Position.East, WEST = Position.West, HEADER = Position.Header, CENTRE = Position.Centre;
|
|
54
|
+
class BoxModel {
|
|
55
|
+
//TODO we should accept initial let,top offsets here
|
|
56
|
+
// if dropTargets are supplied, we will only allow drop operations directly on these targets
|
|
57
|
+
// TODO we will need to make this more flexible e.g allowing drop anywhere within these target
|
|
58
|
+
static measure(model, dropTargetPaths = []) {
|
|
59
|
+
const measurements = {};
|
|
60
|
+
measureRootComponent(model, measurements, dropTargetPaths);
|
|
61
|
+
return measurements;
|
|
62
|
+
}
|
|
63
|
+
static allBoxesContainingPoint(layout, measurements, x, y, validDropTargets) {
|
|
64
|
+
return allBoxesContainingPoint(
|
|
65
|
+
layout,
|
|
66
|
+
measurements,
|
|
67
|
+
x,
|
|
68
|
+
y,
|
|
69
|
+
validDropTargets
|
|
70
|
+
).reverse();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function pointPositionWithinRect(x, y, rect, borderZone = 30) {
|
|
74
|
+
const width = rect.right - rect.left;
|
|
75
|
+
const height = rect.bottom - rect.top;
|
|
76
|
+
const posX = x - rect.left;
|
|
77
|
+
const posY = y - rect.top;
|
|
78
|
+
let closeToTheEdge = 0;
|
|
79
|
+
if (posX < borderZone)
|
|
80
|
+
closeToTheEdge += 8;
|
|
81
|
+
if (posX > width - borderZone)
|
|
82
|
+
closeToTheEdge += 2;
|
|
83
|
+
if (posY < borderZone)
|
|
84
|
+
closeToTheEdge += 1;
|
|
85
|
+
if (posY > height - borderZone)
|
|
86
|
+
closeToTheEdge += 4;
|
|
87
|
+
return { pctX: posX / width, pctY: posY / height, closeToTheEdge };
|
|
88
|
+
}
|
|
89
|
+
function getPosition(x, y, rect, targetOrientation) {
|
|
90
|
+
const { BEFORE, AFTER } = RelativeDropPosition;
|
|
91
|
+
const { pctX, pctY, closeToTheEdge } = pointPositionWithinRect(x, y, rect);
|
|
92
|
+
let position;
|
|
93
|
+
let tab;
|
|
94
|
+
if (targetOrientation === "row") {
|
|
95
|
+
position = pctX < 0.5 ? WEST : EAST;
|
|
96
|
+
} else if (rect.header && vuuUtils.boxContainsPoint(rect.header, x, y)) {
|
|
97
|
+
position = HEADER;
|
|
98
|
+
if (rect.Stack) {
|
|
99
|
+
const tabCount = rect.Stack.length;
|
|
100
|
+
if (tabCount === 0) {
|
|
101
|
+
tab = {
|
|
102
|
+
index: -1,
|
|
103
|
+
left: rect.left,
|
|
104
|
+
positionRelativeToTab: AFTER,
|
|
105
|
+
width: 0
|
|
106
|
+
};
|
|
107
|
+
} else {
|
|
108
|
+
const targetTab = rect.Stack.find(
|
|
109
|
+
({ left, right }) => x >= left && x <= right
|
|
110
|
+
);
|
|
111
|
+
if (targetTab) {
|
|
112
|
+
const tabWidth = targetTab.right - targetTab.left;
|
|
113
|
+
tab = {
|
|
114
|
+
index: rect.Stack.indexOf(targetTab),
|
|
115
|
+
left: targetTab.left,
|
|
116
|
+
positionRelativeToTab: (x - targetTab.left) / tabWidth < 0.5 ? BEFORE : AFTER,
|
|
117
|
+
width: tabWidth
|
|
118
|
+
};
|
|
119
|
+
} else {
|
|
120
|
+
const lastTab = rect.Stack[tabCount - 1];
|
|
121
|
+
tab = {
|
|
122
|
+
left: lastTab.right,
|
|
123
|
+
width: 0,
|
|
124
|
+
index: tabCount,
|
|
125
|
+
positionRelativeToTab: AFTER
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
} else if (rect.header.titleWidth) {
|
|
130
|
+
const tabWidth = rect.header.titleWidth;
|
|
131
|
+
tab = {
|
|
132
|
+
index: -1,
|
|
133
|
+
left: rect.left,
|
|
134
|
+
positionRelativeToTab: (x - rect.left) / tabWidth < 0.5 ? BEFORE : AFTER,
|
|
135
|
+
width: tabWidth
|
|
136
|
+
};
|
|
137
|
+
} else {
|
|
138
|
+
tab = {
|
|
139
|
+
left: rect.left,
|
|
140
|
+
width: 0,
|
|
141
|
+
positionRelativeToTab: BEFORE,
|
|
142
|
+
index: -1
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
} else {
|
|
146
|
+
position = getPositionWithinBox(x, y, rect, pctX, pctY);
|
|
147
|
+
}
|
|
148
|
+
return { position, x, y, closeToTheEdge, tab };
|
|
149
|
+
}
|
|
150
|
+
function getPositionWithinBox(x, y, rect, pctX, pctY) {
|
|
151
|
+
const centerBox = getCenteredBox(rect, 0.2);
|
|
152
|
+
if (vuuUtils.boxContainsPoint(centerBox, x, y)) {
|
|
153
|
+
return CENTRE;
|
|
154
|
+
} else {
|
|
155
|
+
const quadrant = `${pctY < 0.5 ? "north" : "south"}${pctX < 0.5 ? "west" : "east"}`;
|
|
156
|
+
switch (quadrant) {
|
|
157
|
+
case "northwest":
|
|
158
|
+
return pctX > pctY ? NORTH : WEST;
|
|
159
|
+
case "northeast":
|
|
160
|
+
return 1 - pctX > pctY ? NORTH : EAST;
|
|
161
|
+
case "southeast":
|
|
162
|
+
return pctX > pctY ? EAST : SOUTH;
|
|
163
|
+
case "southwest":
|
|
164
|
+
return 1 - pctX > pctY ? WEST : SOUTH;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function getCenteredBox({ right, left, top, bottom }, pctSize) {
|
|
169
|
+
const pctOffset = (1 - pctSize) / 2;
|
|
170
|
+
const w = (right - left) * pctOffset;
|
|
171
|
+
const h = (bottom - top) * pctOffset;
|
|
172
|
+
return { left: left + w, top: top + h, right: right - w, bottom: bottom - h };
|
|
173
|
+
}
|
|
174
|
+
function measureRootComponent(rootComponent, measurements, dropTargets) {
|
|
175
|
+
const {
|
|
176
|
+
id,
|
|
177
|
+
"data-path": dataPath,
|
|
178
|
+
path = dataPath
|
|
179
|
+
} = propUtils.getProps(rootComponent);
|
|
180
|
+
const type = typeOf.typeOf(rootComponent);
|
|
181
|
+
if (id && path) {
|
|
182
|
+
const [rect, el] = measureComponentDomElement(rootComponent);
|
|
183
|
+
measureComponent(rootComponent, rect, el, measurements);
|
|
184
|
+
if (ComponentRegistry.isContainer(type)) {
|
|
185
|
+
collectChildMeasurements(rootComponent, measurements, dropTargets);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function measureComponent(component, rect, el, measurements) {
|
|
190
|
+
const {
|
|
191
|
+
"data-path": dataPath,
|
|
192
|
+
path = dataPath,
|
|
193
|
+
header
|
|
194
|
+
} = propUtils.getProps(component);
|
|
195
|
+
measurements[path] = rect;
|
|
196
|
+
const type = typeOf.typeOf(component);
|
|
197
|
+
if (header || type === "Stack") {
|
|
198
|
+
const query = type === "Stack" ? ".vuuTabstrip" : ".vuuHeader";
|
|
199
|
+
const headerEl = el.querySelector(query);
|
|
200
|
+
if (headerEl) {
|
|
201
|
+
const { top, left, right, bottom } = headerEl.getBoundingClientRect();
|
|
202
|
+
measurements[path].header = {
|
|
203
|
+
top: Math.round(top),
|
|
204
|
+
left: Math.round(left),
|
|
205
|
+
right: Math.round(right),
|
|
206
|
+
bottom: Math.round(bottom)
|
|
207
|
+
};
|
|
208
|
+
if (type === "Stack") {
|
|
209
|
+
measurements[path].Stack = Array.from(
|
|
210
|
+
headerEl.querySelectorAll(".vuuTab")
|
|
211
|
+
).map((tab) => tab.getBoundingClientRect()).map(({ left: left2, right: right2 }) => ({ left: left2, right: right2 }));
|
|
212
|
+
} else {
|
|
213
|
+
const titleEl = headerEl.querySelector('[class^="vuuHeader-title"]');
|
|
214
|
+
const { header: header2 } = measurements[path];
|
|
215
|
+
if (titleEl && header2) {
|
|
216
|
+
header2.titleWidth = titleEl.clientWidth;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return measurements[path];
|
|
222
|
+
}
|
|
223
|
+
function collectChildMeasurements(component, measurements, dropTargets, preX = 0, posX = 0, preY = 0, posY = 0) {
|
|
224
|
+
const {
|
|
225
|
+
children,
|
|
226
|
+
"data-path": dataPath,
|
|
227
|
+
path = dataPath,
|
|
228
|
+
style,
|
|
229
|
+
active = 0
|
|
230
|
+
} = propUtils.getProps(component);
|
|
231
|
+
const type = typeOf.typeOf(component);
|
|
232
|
+
const isFlexbox = type === "Flexbox";
|
|
233
|
+
const isStack = type === "Stack";
|
|
234
|
+
const isTower = isFlexbox && style.flexDirection === "column";
|
|
235
|
+
const isTerrace = isFlexbox && style.flexDirection === "row";
|
|
236
|
+
const childrenToMeasure = isStack ? children.filter((_child, idx) => idx === active) : children.filter(omitDragging);
|
|
237
|
+
const childMeasurements = childrenToMeasure.map(
|
|
238
|
+
(child) => {
|
|
239
|
+
const [rect, el] = measureComponentDomElement(child);
|
|
240
|
+
return [
|
|
241
|
+
{
|
|
242
|
+
...rect,
|
|
243
|
+
top: rect.top - preY,
|
|
244
|
+
right: rect.right + posX,
|
|
245
|
+
bottom: rect.bottom + posY,
|
|
246
|
+
left: rect.left - preX
|
|
247
|
+
},
|
|
248
|
+
el,
|
|
249
|
+
child
|
|
250
|
+
];
|
|
251
|
+
}
|
|
252
|
+
);
|
|
253
|
+
const expandedMeasurements = childMeasurements.map(
|
|
254
|
+
([rect, el, child], i, all) => {
|
|
255
|
+
let localPreX;
|
|
256
|
+
let localPosX;
|
|
257
|
+
let localPreY;
|
|
258
|
+
let localPosY;
|
|
259
|
+
let gapPre;
|
|
260
|
+
let gapPos;
|
|
261
|
+
const n = all.length - 1;
|
|
262
|
+
if (isTerrace) {
|
|
263
|
+
gapPre = i === 0 ? 0 : rect.left - all[i - 1][0].right;
|
|
264
|
+
gapPos = i === n ? 0 : all[i + 1][0].left - rect.right;
|
|
265
|
+
localPreX = i === 0 ? 0 : gapPre === 0 ? 0 : gapPre;
|
|
266
|
+
localPosX = i === n ? 0 : gapPos === 0 ? 0 : gapPos - gapPos / 2;
|
|
267
|
+
rect.left -= localPreX;
|
|
268
|
+
rect.right += localPosX;
|
|
269
|
+
localPreY = preY;
|
|
270
|
+
localPosY = posY;
|
|
271
|
+
} else if (isTower) {
|
|
272
|
+
gapPre = i === 0 ? 0 : rect.top - all[i - 1][0].bottom;
|
|
273
|
+
gapPos = i === n ? 0 : all[i + 1][0].top - rect.bottom;
|
|
274
|
+
localPreY = i === 0 ? 0 : gapPre === 0 ? 0 : gapPre;
|
|
275
|
+
localPosY = i === n ? 0 : gapPos === 0 ? 0 : gapPos - gapPos / 2;
|
|
276
|
+
rect.top -= localPreY;
|
|
277
|
+
rect.bottom += localPosY;
|
|
278
|
+
localPreX = preX;
|
|
279
|
+
localPosX = posX;
|
|
280
|
+
}
|
|
281
|
+
const componentMeasurements = measureComponent(
|
|
282
|
+
child,
|
|
283
|
+
rect,
|
|
284
|
+
el,
|
|
285
|
+
measurements
|
|
286
|
+
);
|
|
287
|
+
const childType = typeOf.typeOf(child);
|
|
288
|
+
if (ComponentRegistry.isContainer(childType)) {
|
|
289
|
+
collectChildMeasurements(
|
|
290
|
+
child,
|
|
291
|
+
measurements,
|
|
292
|
+
dropTargets,
|
|
293
|
+
localPreX,
|
|
294
|
+
localPosX,
|
|
295
|
+
localPreY,
|
|
296
|
+
localPosY
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
return componentMeasurements;
|
|
300
|
+
}
|
|
301
|
+
);
|
|
302
|
+
if (childMeasurements.length) {
|
|
303
|
+
measurements[path].children = expandedMeasurements;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
function omitDragging(component) {
|
|
307
|
+
const { id } = propUtils.getProps(component);
|
|
308
|
+
const el = document.getElementById(id);
|
|
309
|
+
if (el) {
|
|
310
|
+
return el.dataset.dragging !== "true";
|
|
311
|
+
} else {
|
|
312
|
+
console.warn(`BoxModel: no element found with id #${id}`);
|
|
313
|
+
return false;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
function measureComponentDomElement(component) {
|
|
317
|
+
const { id } = propUtils.getProps(component);
|
|
318
|
+
if (id === void 0) {
|
|
319
|
+
throw Error("`BoxModel.measureComponentElement, component has no id");
|
|
320
|
+
}
|
|
321
|
+
const el = document.getElementById(id);
|
|
322
|
+
if (!el) {
|
|
323
|
+
throw Error(
|
|
324
|
+
"BoxModel.measureComponentElement, no DOM element found for component"
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
const { top, left, right, bottom, height, width } = el.getBoundingClientRect();
|
|
328
|
+
let scrolling = void 0;
|
|
329
|
+
const type = typeOf.typeOf(component);
|
|
330
|
+
if (ComponentRegistry.isContainer(type)) {
|
|
331
|
+
const scrollHeight = el.scrollHeight;
|
|
332
|
+
if (scrollHeight > height) {
|
|
333
|
+
scrolling = { id, scrollHeight, scrollTop: el.scrollTop };
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return [
|
|
337
|
+
{
|
|
338
|
+
top: Math.round(top),
|
|
339
|
+
left: Math.round(left),
|
|
340
|
+
right: Math.round(right),
|
|
341
|
+
bottom: Math.round(bottom),
|
|
342
|
+
height: Math.round(height),
|
|
343
|
+
width: Math.round(width),
|
|
344
|
+
scrolling
|
|
345
|
+
},
|
|
346
|
+
el,
|
|
347
|
+
component
|
|
348
|
+
];
|
|
349
|
+
}
|
|
350
|
+
function allBoxesContainingPoint(component, measurements, x, y, dropTargets, boxes = []) {
|
|
351
|
+
const {
|
|
352
|
+
children,
|
|
353
|
+
"data-path": dataPath,
|
|
354
|
+
path = dataPath
|
|
355
|
+
} = propUtils.getProps(component);
|
|
356
|
+
const type = typeOf.typeOf(component);
|
|
357
|
+
const rect = measurements[path];
|
|
358
|
+
if (!vuuUtils.boxContainsPoint(rect, x, y))
|
|
359
|
+
return boxes;
|
|
360
|
+
if (dropTargets && dropTargets.length) {
|
|
361
|
+
if (dropTargets.includes(path)) {
|
|
362
|
+
boxes.push(component);
|
|
363
|
+
} else if (dropTargets.some((dropTargetPath) => dropTargetPath.startsWith(path))) ; else {
|
|
364
|
+
return boxes;
|
|
365
|
+
}
|
|
366
|
+
} else {
|
|
367
|
+
boxes.push(component);
|
|
368
|
+
}
|
|
369
|
+
if (!ComponentRegistry.isContainer(type)) {
|
|
370
|
+
return boxes;
|
|
371
|
+
}
|
|
372
|
+
if (rect.header && vuuUtils.boxContainsPoint(rect.header, x, y)) {
|
|
373
|
+
return boxes;
|
|
374
|
+
}
|
|
375
|
+
if (rect.scrolling) {
|
|
376
|
+
scrollIntoViewIfNeccesary(rect, x, y);
|
|
377
|
+
}
|
|
378
|
+
for (let i = 0; i < children.length; i++) {
|
|
379
|
+
if (type === "Stack" && component.props.active !== i) {
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
const nestedBoxes = allBoxesContainingPoint(
|
|
383
|
+
children[i],
|
|
384
|
+
measurements,
|
|
385
|
+
x,
|
|
386
|
+
y,
|
|
387
|
+
dropTargets
|
|
388
|
+
);
|
|
389
|
+
if (nestedBoxes.length) {
|
|
390
|
+
return boxes.concat(nestedBoxes);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return boxes;
|
|
394
|
+
}
|
|
395
|
+
function scrollIntoViewIfNeccesary({ top, bottom, scrolling }, x, y) {
|
|
396
|
+
if (scrolling) {
|
|
397
|
+
const { id, scrollTop, scrollHeight } = scrolling;
|
|
398
|
+
const height = bottom - top;
|
|
399
|
+
if (scrollTop === 0 && bottom - y < 50) {
|
|
400
|
+
const scrollMax = scrollHeight - height;
|
|
401
|
+
const el = document.getElementById(id);
|
|
402
|
+
el.scrollTo({ left: 0, top: scrollMax, behavior: "smooth" });
|
|
403
|
+
scrolling.scrollTop = scrollMax;
|
|
404
|
+
} else if (scrollTop > 0 && y - top < 50) {
|
|
405
|
+
const el = document.getElementById(id);
|
|
406
|
+
el.scrollTo({ left: 0, top: 0, behavior: "smooth" });
|
|
407
|
+
scrolling.scrollTop = 0;
|
|
408
|
+
} else {
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
} else {
|
|
412
|
+
return false;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
exports.BoxModel = BoxModel;
|
|
417
|
+
exports.Position = Position;
|
|
418
|
+
exports.RelativeDropPosition = RelativeDropPosition;
|
|
419
|
+
exports.getPosition = getPosition;
|
|
420
|
+
exports.pointPositionWithinRect = pointPositionWithinRect;
|
|
421
|
+
exports.positionValues = positionValues;
|
|
422
|
+
//# sourceMappingURL=BoxModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BoxModel.js","sources":["../../src/drag-drop/BoxModel.ts"],"sourcesContent":["import { ReactElement } from \"react\";\nimport { boxContainsPoint } from \"@vuu-ui/vuu-utils\";\nimport { LayoutModel } from \"../layout-reducer\";\nimport { isContainer } from \"../registry/ComponentRegistry\";\nimport { getProps, typeOf } from \"../utils\";\nimport { DragDropRect, DropPos, RelativePosition } from \"./dragDropTypes\";\n\nexport const positionValues = {\n north: 1,\n east: 2,\n south: 4,\n west: 8,\n header: 16,\n centre: 32,\n absolute: 64,\n};\n\nexport const RelativeDropPosition = {\n AFTER: \"after\" as RelativePosition,\n BEFORE: \"before\" as RelativePosition,\n};\n\nexport const Position = Object.freeze({\n North: _position(\"north\"),\n East: _position(\"east\"),\n South: _position(\"south\"),\n West: _position(\"west\"),\n Header: _position(\"header\"),\n Centre: _position(\"centre\"),\n Absolute: _position(\"absolute\"),\n});\n\nfunction _position(str: keyof typeof positionValues) {\n return Object.freeze({\n offset:\n str === \"north\" || str === \"west\"\n ? 0\n : str === \"south\" || str === \"east\"\n ? 1\n : NaN,\n valueOf: function () {\n return positionValues[str];\n },\n toString: function () {\n return str;\n },\n North: str === \"north\",\n South: str === \"south\",\n East: str === \"east\",\n West: str === \"west\",\n Header: str === \"header\",\n Centre: str === \"centre\",\n NorthOrSouth: str === \"north\" || str === \"south\",\n EastOrWest: str === \"east\" || str === \"west\",\n NorthOrWest: str === \"north\" || str === \"west\",\n SouthOrEast: str === \"east\" || str === \"south\",\n Absolute: str === \"absolute\",\n });\n}\n\nconst NORTH = Position.North,\n SOUTH = Position.South,\n EAST = Position.East,\n WEST = Position.West,\n HEADER = Position.Header,\n CENTRE = Position.Centre;\n\nexport interface Measurements {\n [key: string]: DragDropRect;\n}\n\nexport class BoxModel {\n //TODO we should accept initial let,top offsets here\n // if dropTargets are supplied, we will only allow drop operations directly on these targets\n // TODO we will need to make this more flexible e.g allowing drop anywhere within these target\n static measure(\n model: ReactElement,\n dropTargetPaths: string[] = []\n ): Measurements {\n const measurements: Measurements = {};\n measureRootComponent(model, measurements, dropTargetPaths);\n return measurements;\n }\n\n static allBoxesContainingPoint(\n layout: LayoutModel,\n measurements: Measurements,\n x: number,\n y: number,\n validDropTargets?: string[]\n ) {\n return allBoxesContainingPoint(\n layout,\n measurements,\n x,\n y,\n validDropTargets\n ).reverse();\n }\n}\n\nexport function pointPositionWithinRect(\n x: number,\n y: number,\n rect: DragDropRect,\n borderZone = 30\n) {\n const width = rect.right - rect.left;\n const height = rect.bottom - rect.top;\n const posX = x - rect.left;\n const posY = y - rect.top;\n let closeToTheEdge = 0;\n\n if (posX < borderZone) closeToTheEdge += 8;\n if (posX > width - borderZone) closeToTheEdge += 2;\n if (posY < borderZone) closeToTheEdge += 1;\n if (posY > height - borderZone) closeToTheEdge += 4;\n\n return { pctX: posX / width, pctY: posY / height, closeToTheEdge };\n}\n\nexport function getPosition(\n x: number,\n y: number,\n rect: DragDropRect,\n targetOrientation?: \"row\" | \"column\"\n): DropPos {\n const { BEFORE, AFTER } = RelativeDropPosition;\n const { pctX, pctY, closeToTheEdge } = pointPositionWithinRect(x, y, rect);\n let position;\n let tab;\n\n if (targetOrientation === \"row\") {\n position = pctX < 0.5 ? WEST : EAST;\n } else if (rect.header && boxContainsPoint(rect.header, x, y)) {\n position = HEADER;\n\n if (rect.Stack) {\n const tabCount = rect.Stack.length;\n if (tabCount === 0) {\n tab = {\n index: -1,\n left: rect.left,\n positionRelativeToTab: AFTER,\n width: 0,\n };\n } else {\n //TODO account for gaps between tabs\n const targetTab = rect.Stack.find(\n ({ left, right }) => x >= left && x <= right\n );\n if (targetTab) {\n const tabWidth = targetTab.right - targetTab.left;\n tab = {\n index: rect.Stack.indexOf(targetTab),\n left: targetTab.left,\n positionRelativeToTab:\n (x - targetTab.left) / tabWidth < 0.5 ? BEFORE : AFTER,\n width: tabWidth,\n };\n } else {\n const lastTab = rect.Stack[tabCount - 1];\n tab = {\n left: lastTab.right,\n width: 0,\n index: tabCount,\n positionRelativeToTab: AFTER,\n };\n }\n }\n } else if (rect.header.titleWidth) {\n const tabWidth = rect.header.titleWidth;\n tab = {\n index: -1,\n left: rect.left,\n positionRelativeToTab:\n (x - rect.left) / tabWidth < 0.5 ? BEFORE : AFTER,\n width: tabWidth,\n };\n } else {\n tab = {\n left: rect.left,\n width: 0,\n positionRelativeToTab: BEFORE,\n index: -1,\n };\n }\n } else {\n position = getPositionWithinBox(x, y, rect, pctX, pctY);\n }\n return { position: position!, x, y, closeToTheEdge, tab };\n}\n\nfunction getPositionWithinBox(\n x: number,\n y: number,\n rect: DragDropRect,\n pctX: number,\n pctY: number\n) {\n const centerBox = getCenteredBox(rect, 0.2);\n if (boxContainsPoint(centerBox, x, y)) {\n return CENTRE;\n } else {\n const quadrant = `${pctY < 0.5 ? \"north\" : \"south\"}${\n pctX < 0.5 ? \"west\" : \"east\"\n }`;\n\n switch (quadrant) {\n case \"northwest\":\n return pctX > pctY ? NORTH : WEST;\n case \"northeast\":\n return 1 - pctX > pctY ? NORTH : EAST;\n case \"southeast\":\n return pctX > pctY ? EAST : SOUTH;\n case \"southwest\":\n return 1 - pctX > pctY ? WEST : SOUTH;\n default:\n }\n }\n}\n\nfunction getCenteredBox(\n { right, left, top, bottom }: DragDropRect,\n pctSize: number\n) {\n const pctOffset = (1 - pctSize) / 2;\n const w = (right - left) * pctOffset;\n const h = (bottom - top) * pctOffset;\n return { left: left + w, top: top + h, right: right - w, bottom: bottom - h };\n}\n\nfunction measureRootComponent(\n rootComponent: ReactElement,\n measurements: Measurements,\n dropTargets: string[]\n) {\n const {\n id,\n \"data-path\": dataPath,\n path = dataPath,\n } = getProps(rootComponent);\n const type = typeOf(rootComponent) as string;\n\n if (id && path) {\n const [rect, el] = measureComponentDomElement(rootComponent);\n measureComponent(rootComponent, rect, el, measurements);\n if (isContainer(type)) {\n collectChildMeasurements(rootComponent, measurements, dropTargets);\n }\n }\n}\n\nfunction measureComponent(\n component: LayoutModel,\n rect: DragDropRect,\n el: HTMLElement,\n measurements: Measurements\n) {\n const {\n \"data-path\": dataPath,\n path = dataPath,\n header,\n } = getProps(component);\n\n measurements[path] = rect;\n\n const type = typeOf(component);\n if (header || type === \"Stack\") {\n const query = type === \"Stack\" ? \".vuuTabstrip\" : \".vuuHeader\";\n const headerEl = el.querySelector(query);\n if (headerEl) {\n const { top, left, right, bottom } = headerEl.getBoundingClientRect();\n measurements[path].header = {\n top: Math.round(top),\n left: Math.round(left),\n right: Math.round(right),\n bottom: Math.round(bottom),\n };\n if (type === \"Stack\") {\n measurements[path].Stack = Array.from(\n headerEl.querySelectorAll(\".vuuTab\")\n )\n .map((tab) => tab.getBoundingClientRect())\n .map(({ left, right }) => ({ left, right }));\n } else {\n const titleEl = headerEl.querySelector('[class^=\"vuuHeader-title\"]');\n const { header } = measurements[path];\n if (titleEl && header) {\n header.titleWidth = titleEl.clientWidth;\n }\n }\n }\n }\n\n return measurements[path];\n}\n\nfunction collectChildMeasurements(\n component: LayoutModel,\n measurements: Measurements,\n dropTargets: string[],\n preX = 0,\n posX = 0,\n preY = 0,\n posY = 0\n) {\n const {\n children,\n \"data-path\": dataPath,\n path = dataPath,\n style,\n active = 0,\n } = getProps(component);\n\n const type = typeOf(component);\n const isFlexbox = type === \"Flexbox\";\n const isStack = type === \"Stack\";\n const isTower = isFlexbox && style.flexDirection === \"column\";\n const isTerrace = isFlexbox && style.flexDirection === \"row\";\n\n const childrenToMeasure = isStack\n ? children.filter((_child: ReactElement, idx: number) => idx === active)\n : children.filter(omitDragging);\n\n type measuredTuple = [DragDropRect, HTMLElement, ReactElement];\n // Collect all the measurements in first pass ...\n const childMeasurements: measuredTuple[] = childrenToMeasure.map(\n (child: ReactElement) => {\n const [rect, el] = measureComponentDomElement(child);\n\n return [\n {\n ...rect,\n top: rect.top - preY,\n right: rect.right + posX,\n bottom: rect.bottom + posY,\n left: rect.left - preX,\n },\n el,\n child,\n ];\n }\n );\n\n // ...so that, in the second pass, we can identify gaps ...\n const expandedMeasurements = childMeasurements.map(\n ([rect, el, child], i, all) => {\n // generate a 'local' splitter adjustment for children adjacent to splitters\n let localPreX;\n let localPosX;\n let localPreY;\n let localPosY;\n let gapPre;\n let gapPos;\n const n = all.length - 1;\n if (isTerrace) {\n gapPre = i === 0 ? 0 : rect.left - all[i - 1][0].right;\n gapPos = i === n ? 0 : all[i + 1][0].left - rect.right;\n // we don't need to divide the leading gap, as half the gap will\n // already have been assigned to the preceeding child in the\n // previous loop iteration.\n localPreX = i === 0 ? 0 : gapPre === 0 ? 0 : gapPre;\n localPosX = i === n ? 0 : gapPos === 0 ? 0 : gapPos - gapPos / 2;\n rect.left -= localPreX;\n rect.right += localPosX;\n localPreY = preY;\n localPosY = posY;\n } else if (isTower) {\n gapPre = i === 0 ? 0 : rect.top - all[i - 1][0].bottom;\n gapPos = i === n ? 0 : all[i + 1][0].top - rect.bottom;\n // we don't need to divide the leading gap, as half the gap will\n // already have been assigned to the preceeding child in the\n // previous loop iteration.\n localPreY = i === 0 ? 0 : gapPre === 0 ? 0 : gapPre;\n localPosY = i === n ? 0 : gapPos === 0 ? 0 : gapPos - gapPos / 2;\n rect.top -= localPreY;\n rect.bottom += localPosY;\n localPreX = preX;\n localPosX = posX;\n }\n\n const componentMeasurements = measureComponent(\n child,\n rect,\n el,\n measurements\n );\n\n const childType = typeOf(child) as string;\n if (isContainer(childType)) {\n collectChildMeasurements(\n child,\n measurements,\n dropTargets,\n localPreX,\n localPosX,\n localPreY,\n localPosY\n );\n }\n return componentMeasurements;\n }\n );\n if (childMeasurements.length) {\n measurements[path].children = expandedMeasurements;\n }\n}\n\nfunction omitDragging(component: ReactElement) {\n const { id } = getProps(component);\n const el = document.getElementById(id);\n if (el) {\n return el.dataset.dragging !== \"true\";\n } else {\n console.warn(`BoxModel: no element found with id #${id}`);\n return false;\n }\n}\n\nfunction measureComponentDomElement(\n component: LayoutModel\n): [DragDropRect, HTMLElement, LayoutModel] {\n const { id } = getProps(component) as { id: string };\n if (id === undefined) {\n throw Error(\"`BoxModel.measureComponentElement, component has no id\");\n }\n const el = document.getElementById(id);\n if (!el) {\n throw Error(\n \"BoxModel.measureComponentElement, no DOM element found for component\"\n );\n }\n // Note: height and width are not required for dropTarget identification, but\n // are used in sizing calculations on drop\n const { top, left, right, bottom, height, width } =\n el.getBoundingClientRect();\n let scrolling = undefined;\n const type = typeOf(component) as string;\n if (isContainer(type)) {\n const scrollHeight = el.scrollHeight;\n if (scrollHeight > height) {\n scrolling = { id, scrollHeight, scrollTop: el.scrollTop };\n }\n }\n return [\n {\n top: Math.round(top),\n left: Math.round(left),\n right: Math.round(right),\n bottom: Math.round(bottom),\n height: Math.round(height),\n width: Math.round(width),\n scrolling,\n },\n el,\n component,\n ];\n}\n\nfunction allBoxesContainingPoint(\n component: LayoutModel,\n measurements: Measurements,\n x: number,\n y: number,\n dropTargets?: string[],\n boxes: LayoutModel[] = []\n): LayoutModel[] {\n const {\n children,\n \"data-path\": dataPath,\n path = dataPath,\n } = getProps(component);\n\n const type = typeOf(component) as string;\n const rect = measurements[path];\n if (!boxContainsPoint(rect, x, y)) return boxes;\n\n if (dropTargets && dropTargets.length) {\n if (dropTargets.includes(path)) {\n boxes.push(component);\n } else if (\n dropTargets.some((dropTargetPath) => dropTargetPath.startsWith(path))\n ) {\n // keep going\n } else {\n return boxes;\n }\n } else {\n boxes.push(component);\n }\n\n if (!isContainer(type)) {\n return boxes;\n }\n\n if (rect.header && boxContainsPoint(rect.header, x, y)) {\n return boxes;\n }\n\n if (rect.scrolling) {\n scrollIntoViewIfNeccesary(rect, x, y);\n }\n\n for (let i = 0; i < children.length; i++) {\n if (type === \"Stack\" && component.props.active !== i) {\n continue;\n }\n const nestedBoxes = allBoxesContainingPoint(\n children[i],\n measurements,\n x,\n y,\n dropTargets\n );\n if (nestedBoxes.length) {\n return boxes.concat(nestedBoxes);\n }\n }\n return boxes;\n}\n\nfunction scrollIntoViewIfNeccesary(\n { top, bottom, scrolling }: DragDropRect,\n x: number,\n y: number\n) {\n if (scrolling) {\n const { id, scrollTop, scrollHeight } = scrolling;\n const height = bottom - top;\n if (scrollTop === 0 && bottom - y < 50) {\n const scrollMax = scrollHeight - height;\n const el = document.getElementById(id) as HTMLElement;\n el.scrollTo({ left: 0, top: scrollMax, behavior: \"smooth\" });\n scrolling.scrollTop = scrollMax;\n } else if (scrollTop > 0 && y - top < 50) {\n const el = document.getElementById(id) as HTMLElement;\n el.scrollTo({ left: 0, top: 0, behavior: \"smooth\" });\n scrolling.scrollTop = 0;\n } else {\n return false;\n }\n } else {\n return false;\n }\n}\n"],"names":["boxContainsPoint","getProps","typeOf","isContainer","left","right","header"],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var BoxModel = require('./BoxModel.js');
|
|
4
|
+
|
|
5
|
+
const SCALE_FACTOR = 0.4;
|
|
6
|
+
class DragState {
|
|
7
|
+
constructor(zone, mouseX, mouseY, measurements, intrinsicSize) {
|
|
8
|
+
this.init(zone, mouseX, mouseY, measurements, intrinsicSize);
|
|
9
|
+
}
|
|
10
|
+
init(zone, mouseX, mouseY, rect, intrinsicSize) {
|
|
11
|
+
const { left: x, top: y } = rect;
|
|
12
|
+
const { pctX, pctY } = BoxModel.pointPositionWithinRect(mouseX, mouseY, rect);
|
|
13
|
+
const scaleFactor = SCALE_FACTOR;
|
|
14
|
+
const leadX = pctX * rect.width;
|
|
15
|
+
const trailX = rect.width - leadX;
|
|
16
|
+
const leadY = pctY * rect.height;
|
|
17
|
+
const trailY = rect.height - leadY;
|
|
18
|
+
const scaledWidth = rect.width * scaleFactor, scaledHeight = rect.height * scaleFactor;
|
|
19
|
+
const scaleDiff = 1 - scaleFactor;
|
|
20
|
+
const leadXScaleDiff = leadX * scaleDiff;
|
|
21
|
+
const leadYScaleDiff = leadY * scaleDiff;
|
|
22
|
+
const trailXScaleDiff = trailX * scaleDiff;
|
|
23
|
+
const trailYScaleDiff = trailY * scaleDiff;
|
|
24
|
+
this.intrinsicSize = intrinsicSize;
|
|
25
|
+
this.constraint = {
|
|
26
|
+
zone: {
|
|
27
|
+
x: {
|
|
28
|
+
lo: zone.left,
|
|
29
|
+
hi: zone.right
|
|
30
|
+
},
|
|
31
|
+
y: {
|
|
32
|
+
lo: zone.top,
|
|
33
|
+
hi: zone.bottom
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
pos: {
|
|
37
|
+
x: {
|
|
38
|
+
lo: (
|
|
39
|
+
/* left */
|
|
40
|
+
zone.left - leadXScaleDiff
|
|
41
|
+
),
|
|
42
|
+
hi: (
|
|
43
|
+
/* right */
|
|
44
|
+
zone.right - rect.width + trailXScaleDiff
|
|
45
|
+
)
|
|
46
|
+
},
|
|
47
|
+
y: {
|
|
48
|
+
lo: (
|
|
49
|
+
/* top */
|
|
50
|
+
zone.top - leadYScaleDiff
|
|
51
|
+
),
|
|
52
|
+
hi: (
|
|
53
|
+
/* bottom */
|
|
54
|
+
zone.bottom - rect.height + trailYScaleDiff
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
mouse: {
|
|
59
|
+
x: {
|
|
60
|
+
lo: (
|
|
61
|
+
/* left */
|
|
62
|
+
zone.left + scaledWidth * pctX
|
|
63
|
+
),
|
|
64
|
+
hi: (
|
|
65
|
+
/* right */
|
|
66
|
+
zone.right - scaledWidth * (1 - pctX)
|
|
67
|
+
)
|
|
68
|
+
},
|
|
69
|
+
y: {
|
|
70
|
+
lo: (
|
|
71
|
+
/* top */
|
|
72
|
+
zone.top + scaledHeight * pctY
|
|
73
|
+
),
|
|
74
|
+
hi: (
|
|
75
|
+
/* bottom */
|
|
76
|
+
zone.bottom - scaledHeight * (1 - pctY)
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
this.x = {
|
|
82
|
+
pos: x,
|
|
83
|
+
lo: false,
|
|
84
|
+
hi: false,
|
|
85
|
+
mousePos: mouseX,
|
|
86
|
+
mousePct: pctX
|
|
87
|
+
};
|
|
88
|
+
this.y = {
|
|
89
|
+
pos: y,
|
|
90
|
+
lo: false,
|
|
91
|
+
hi: false,
|
|
92
|
+
mousePos: mouseY,
|
|
93
|
+
mousePct: pctY
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
outOfBounds() {
|
|
97
|
+
return this.x.lo || this.x.hi || this.y.lo || this.y.hi;
|
|
98
|
+
}
|
|
99
|
+
inBounds() {
|
|
100
|
+
return !this.outOfBounds();
|
|
101
|
+
}
|
|
102
|
+
dropX() {
|
|
103
|
+
return this.dropXY("x");
|
|
104
|
+
}
|
|
105
|
+
dropY() {
|
|
106
|
+
return this.dropXY("y");
|
|
107
|
+
}
|
|
108
|
+
hasIntrinsicSize() {
|
|
109
|
+
return this?.intrinsicSize?.height && this?.intrinsicSize?.width;
|
|
110
|
+
}
|
|
111
|
+
/*
|
|
112
|
+
* diff = mouse movement, signed int
|
|
113
|
+
* xy = 'x' or 'y'
|
|
114
|
+
*/
|
|
115
|
+
//todo, diff can be calculated in here
|
|
116
|
+
update(xy, mousePos) {
|
|
117
|
+
const state = this[xy], mouseConstraint = this.constraint.mouse[xy], posConstraint = this.constraint.pos[xy], previousPos = state.pos;
|
|
118
|
+
const diff = mousePos - state.mousePos;
|
|
119
|
+
if (diff < 0) {
|
|
120
|
+
if (state.lo) ; else if (mousePos < mouseConstraint.lo) {
|
|
121
|
+
state.lo = true;
|
|
122
|
+
state.pos = posConstraint.lo;
|
|
123
|
+
} else if (state.hi) {
|
|
124
|
+
if (mousePos < mouseConstraint.hi) {
|
|
125
|
+
state.hi = false;
|
|
126
|
+
state.pos += diff;
|
|
127
|
+
}
|
|
128
|
+
} else {
|
|
129
|
+
state.pos += diff;
|
|
130
|
+
}
|
|
131
|
+
} else if (diff > 0) {
|
|
132
|
+
if (state.hi) ; else if (mousePos > mouseConstraint.hi) {
|
|
133
|
+
state.hi = true;
|
|
134
|
+
state.pos = posConstraint.hi;
|
|
135
|
+
} else if (state.lo) {
|
|
136
|
+
if (mousePos > mouseConstraint.lo) {
|
|
137
|
+
state.lo = false;
|
|
138
|
+
state.pos += diff;
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
state.pos += diff;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
state.mousePos = mousePos;
|
|
145
|
+
return previousPos !== state.pos;
|
|
146
|
+
}
|
|
147
|
+
dropXY(dir) {
|
|
148
|
+
const pos = this[dir], rect = this.constraint.zone[dir];
|
|
149
|
+
return pos.lo ? Math.max(rect.lo, pos.mousePos) : pos.hi ? Math.min(pos.mousePos, Math.round(rect.hi) - 1) : pos.mousePos;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
exports.DragState = DragState;
|
|
154
|
+
//# sourceMappingURL=DragState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DragState.js","sources":["../../src/drag-drop/DragState.ts"],"sourcesContent":["import { pointPositionWithinRect } from './BoxModel';\nimport { DragDropRect } from './dragDropTypes';\n\nconst SCALE_FACTOR = 0.4;\n\nexport type IntrinsicSizes = {\n height?: number;\n width?: number;\n};\n\ninterface ZoneRange {\n hi: number;\n lo: number;\n}\ntype DragConstraint = {\n zone: {\n x: ZoneRange;\n y: ZoneRange;\n };\n pos: {\n x: ZoneRange;\n y: ZoneRange;\n };\n mouse: {\n x: ZoneRange;\n y: ZoneRange;\n };\n};\n\ninterface ExtendedZoneRange {\n lo: boolean;\n hi: boolean;\n mousePct: number;\n mousePos: number;\n pos: number;\n}\n\nexport class DragState {\n public constraint!: DragConstraint;\n public x!: ExtendedZoneRange;\n public y!: ExtendedZoneRange;\n public intrinsicSize: IntrinsicSizes | undefined;\n\n constructor(\n zone: DragDropRect,\n mouseX: number,\n mouseY: number,\n measurements: DragDropRect,\n intrinsicSize?: IntrinsicSizes\n ) {\n this.init(zone, mouseX, mouseY, measurements, intrinsicSize);\n }\n\n init(\n zone: DragDropRect,\n mouseX: number,\n mouseY: number,\n rect: DragDropRect,\n intrinsicSize?: IntrinsicSizes\n ) {\n const { left: x, top: y } = rect;\n\n const { pctX, pctY } = pointPositionWithinRect(mouseX, mouseY, rect);\n\n // We are applying a scale factor of 0.4 to the draggee. This is purely a visual\n // effect - the actual box size remains the original size. The 'leading' values\n // represent the difference between the visual scaled down box and the actual box.\n\n const scaleFactor = SCALE_FACTOR;\n\n const leadX = pctX * rect.width;\n const trailX = rect.width - leadX;\n const leadY = pctY * rect.height;\n const trailY = rect.height - leadY;\n\n // When we assign position to rect using css. positioning units are applied to the\n // unscaled shape, so we have to adjust values to take scaling into account.\n const scaledWidth = rect.width * scaleFactor,\n scaledHeight = rect.height * scaleFactor;\n\n const scaleDiff = 1 - scaleFactor;\n const leadXScaleDiff = leadX * scaleDiff;\n const leadYScaleDiff = leadY * scaleDiff;\n const trailXScaleDiff = trailX * scaleDiff;\n const trailYScaleDiff = trailY * scaleDiff;\n\n this.intrinsicSize = intrinsicSize;\n\n this.constraint = {\n zone: {\n x: {\n lo: zone.left,\n hi: zone.right\n },\n y: {\n lo: zone.top,\n hi: zone.bottom\n }\n },\n\n pos: {\n x: {\n lo: /* left */ zone.left - leadXScaleDiff,\n hi: /* right */ zone.right - rect.width + trailXScaleDiff\n },\n y: {\n lo: /* top */ zone.top - leadYScaleDiff,\n hi: /* bottom */ zone.bottom - rect.height + trailYScaleDiff\n }\n },\n mouse: {\n x: {\n lo: /* left */ zone.left + scaledWidth * pctX,\n hi: /* right */ zone.right - scaledWidth * (1 - pctX)\n },\n y: {\n lo: /* top */ zone.top + scaledHeight * pctY,\n hi: /* bottom */ zone.bottom - scaledHeight * (1 - pctY)\n }\n }\n };\n\n this.x = {\n pos: x,\n lo: false,\n hi: false,\n mousePos: mouseX,\n mousePct: pctX\n };\n this.y = {\n pos: y,\n lo: false,\n hi: false,\n mousePos: mouseY,\n mousePct: pctY\n };\n }\n\n outOfBounds() {\n return this.x.lo || this.x.hi || this.y.lo || this.y.hi;\n }\n\n inBounds() {\n return !this.outOfBounds();\n }\n\n dropX() {\n return this.dropXY('x');\n }\n\n dropY() {\n return this.dropXY('y');\n }\n\n hasIntrinsicSize(): number | undefined {\n return this?.intrinsicSize?.height && this?.intrinsicSize?.width;\n }\n\n /*\n * diff = mouse movement, signed int\n * xy = 'x' or 'y'\n */\n //todo, diff can be calculated in here\n update(xy: 'x' | 'y', mousePos: number) {\n const state = this[xy],\n mouseConstraint = this.constraint.mouse[xy],\n posConstraint = this.constraint.pos[xy],\n previousPos = state.pos;\n\n const diff = mousePos - state.mousePos;\n\n //xy==='x' && console.log(`update: state.lo=${state.lo}, mPos=${mousePos}, mC.lo=${mouseConstraint.lo}, prevPos=${previousPos}, diff=${diff} ` );\n\n if (diff < 0) {\n if (state.lo) {\n /* do nothing */\n } else if (mousePos < mouseConstraint.lo) {\n state.lo = true;\n state.pos = posConstraint.lo;\n } else if (state.hi) {\n if (mousePos < mouseConstraint.hi) {\n state.hi = false;\n state.pos += diff;\n }\n } else {\n state.pos += diff;\n }\n } else if (diff > 0) {\n if (state.hi) {\n /* do nothing */\n } else if (mousePos > mouseConstraint.hi) {\n state.hi = true;\n state.pos = posConstraint.hi;\n } else if (state.lo) {\n if (mousePos > mouseConstraint.lo) {\n state.lo = false;\n state.pos += diff;\n }\n } else {\n state.pos += diff;\n }\n }\n\n state.mousePos = mousePos;\n\n return previousPos !== state.pos;\n }\n\n private dropXY(this: DragState, dir: 'x' | 'y') {\n const pos = this[dir],\n rect = this.constraint.zone[dir];\n // why not do the rounding +/- 1 on the rect initially - this is all it is usef for\n return pos.lo\n ? Math.max(rect.lo, pos.mousePos)\n : pos.hi\n ? Math.min(pos.mousePos, Math.round(rect.hi) - 1)\n : pos.mousePos;\n }\n}\n"],"names":["pointPositionWithinRect"],"mappings":"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"}
|