@vuu-ui/vuu-layout 0.8.34 → 0.8.35

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