@vuu-ui/vuu-layout 0.8.32 → 0.8.34

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 (261) hide show
  1. package/cjs/Component.js +14 -0
  2. package/cjs/Component.js.map +1 -0
  3. package/cjs/DraggableLayout.css +18 -0
  4. package/cjs/DraggableLayout.js +24 -0
  5. package/cjs/DraggableLayout.js.map +1 -0
  6. package/cjs/dock-layout/DockLayout.css +36 -0
  7. package/cjs/dock-layout/DockLayout.js +27 -0
  8. package/cjs/dock-layout/DockLayout.js.map +1 -0
  9. package/cjs/dock-layout/Drawer.css +159 -0
  10. package/cjs/dock-layout/Drawer.js +87 -0
  11. package/cjs/dock-layout/Drawer.js.map +1 -0
  12. package/cjs/drag-drop/BoxModel.js +422 -0
  13. package/cjs/drag-drop/BoxModel.js.map +1 -0
  14. package/cjs/drag-drop/DragState.js +154 -0
  15. package/cjs/drag-drop/DragState.js.map +1 -0
  16. package/cjs/drag-drop/Draggable.js +192 -0
  17. package/cjs/drag-drop/Draggable.js.map +1 -0
  18. package/cjs/drag-drop/DropMenu.css +71 -0
  19. package/cjs/drag-drop/DropMenu.js +46 -0
  20. package/cjs/drag-drop/DropMenu.js.map +1 -0
  21. package/cjs/drag-drop/DropTarget.js +244 -0
  22. package/cjs/drag-drop/DropTarget.js.map +1 -0
  23. package/cjs/drag-drop/DropTargetRenderer.css +40 -0
  24. package/cjs/drag-drop/DropTargetRenderer.js +233 -0
  25. package/cjs/drag-drop/DropTargetRenderer.js.map +1 -0
  26. package/cjs/flexbox/Flexbox.css +45 -0
  27. package/cjs/flexbox/Flexbox.js +61 -0
  28. package/cjs/flexbox/Flexbox.js.map +1 -0
  29. package/cjs/flexbox/FlexboxLayout.js +30 -0
  30. package/cjs/flexbox/FlexboxLayout.js.map +1 -0
  31. package/cjs/flexbox/FluidGrid.css +134 -0
  32. package/cjs/flexbox/FluidGrid.js +78 -0
  33. package/cjs/flexbox/FluidGrid.js.map +1 -0
  34. package/cjs/flexbox/FluidGridLayout.js +14 -0
  35. package/cjs/flexbox/FluidGridLayout.js.map +1 -0
  36. package/cjs/flexbox/Splitter.css +148 -0
  37. package/cjs/flexbox/Splitter.js +113 -0
  38. package/cjs/flexbox/Splitter.js.map +1 -0
  39. package/cjs/flexbox/flexbox-utils.js +109 -0
  40. package/cjs/flexbox/flexbox-utils.js.map +1 -0
  41. package/cjs/flexbox/useResponsiveSizing.js +62 -0
  42. package/cjs/flexbox/useResponsiveSizing.js.map +1 -0
  43. package/cjs/flexbox/useSplitterResizing.js +209 -0
  44. package/cjs/flexbox/useSplitterResizing.js.map +1 -0
  45. package/cjs/index.js +132 -19
  46. package/cjs/index.js.map +1 -7
  47. package/cjs/layout-action.js +27 -0
  48. package/cjs/layout-action.js.map +1 -0
  49. package/cjs/layout-header/Header.css +9 -0
  50. package/cjs/layout-header/Header.js +122 -0
  51. package/cjs/layout-header/Header.js.map +1 -0
  52. package/cjs/layout-provider/LayoutProvider.js +178 -0
  53. package/cjs/layout-provider/LayoutProvider.js.map +1 -0
  54. package/cjs/layout-provider/LayoutProviderContext.js +14 -0
  55. package/cjs/layout-provider/LayoutProviderContext.js.map +1 -0
  56. package/cjs/layout-provider/useLayoutDragDrop.js +170 -0
  57. package/cjs/layout-provider/useLayoutDragDrop.js.map +1 -0
  58. package/cjs/layout-reducer/flexUtils.js +219 -0
  59. package/cjs/layout-reducer/flexUtils.js.map +1 -0
  60. package/cjs/layout-reducer/insert-layout-element.js +273 -0
  61. package/cjs/layout-reducer/insert-layout-element.js.map +1 -0
  62. package/cjs/layout-reducer/layout-reducer.js +198 -0
  63. package/cjs/layout-reducer/layout-reducer.js.map +1 -0
  64. package/cjs/layout-reducer/layoutTypes.js +41 -0
  65. package/cjs/layout-reducer/layoutTypes.js.map +1 -0
  66. package/cjs/layout-reducer/layoutUtils.js +226 -0
  67. package/cjs/layout-reducer/layoutUtils.js.map +1 -0
  68. package/cjs/layout-reducer/move-layout-element.js +31 -0
  69. package/cjs/layout-reducer/move-layout-element.js.map +1 -0
  70. package/cjs/layout-reducer/remove-layout-element.js +223 -0
  71. package/cjs/layout-reducer/remove-layout-element.js.map +1 -0
  72. package/cjs/layout-reducer/replace-layout-element.js +91 -0
  73. package/cjs/layout-reducer/replace-layout-element.js.map +1 -0
  74. package/cjs/layout-reducer/resize-flex-children.js +61 -0
  75. package/cjs/layout-reducer/resize-flex-children.js.map +1 -0
  76. package/cjs/layout-reducer/wrap-layout-element.js +212 -0
  77. package/cjs/layout-reducer/wrap-layout-element.js.map +1 -0
  78. package/cjs/layout-view/View.css +62 -0
  79. package/cjs/layout-view/View.js +155 -0
  80. package/cjs/layout-view/View.js.map +1 -0
  81. package/cjs/layout-view/useView.js +92 -0
  82. package/cjs/layout-view/useView.js.map +1 -0
  83. package/cjs/layout-view/useViewResize.js +42 -0
  84. package/cjs/layout-view/useViewResize.js.map +1 -0
  85. package/cjs/layout-view-actions/ViewContext.js +16 -0
  86. package/cjs/layout-view-actions/ViewContext.js.map +1 -0
  87. package/cjs/layout-view-actions/useViewActionDispatcher.js +103 -0
  88. package/cjs/layout-view-actions/useViewActionDispatcher.js.map +1 -0
  89. package/cjs/palette/Palette.css +33 -0
  90. package/cjs/palette/Palette.js +118 -0
  91. package/cjs/palette/Palette.js.map +1 -0
  92. package/cjs/placeholder/LayoutStartPanel.css +30 -0
  93. package/cjs/placeholder/LayoutStartPanel.js +51 -0
  94. package/cjs/placeholder/LayoutStartPanel.js.map +1 -0
  95. package/cjs/placeholder/Placeholder.css +17 -0
  96. package/cjs/placeholder/Placeholder.js +25 -0
  97. package/cjs/placeholder/Placeholder.js.map +1 -0
  98. package/cjs/registry/ComponentRegistry.js +27 -0
  99. package/cjs/registry/ComponentRegistry.js.map +1 -0
  100. package/cjs/responsive/breakpoints.js +36 -0
  101. package/cjs/responsive/breakpoints.js.map +1 -0
  102. package/cjs/responsive/use-breakpoints.js +76 -0
  103. package/cjs/responsive/use-breakpoints.js.map +1 -0
  104. package/cjs/responsive/useResizeObserver.js +118 -0
  105. package/cjs/responsive/useResizeObserver.js.map +1 -0
  106. package/cjs/responsive/utils.js +34 -0
  107. package/cjs/responsive/utils.js.map +1 -0
  108. package/cjs/stack/Stack.css +39 -0
  109. package/cjs/stack/Stack.js +139 -0
  110. package/cjs/stack/Stack.js.map +1 -0
  111. package/cjs/stack/StackLayout.js +122 -0
  112. package/cjs/stack/StackLayout.js.map +1 -0
  113. package/cjs/use-persistent-state.js +109 -0
  114. package/cjs/use-persistent-state.js.map +1 -0
  115. package/cjs/utils/pathUtils.js +293 -0
  116. package/cjs/utils/pathUtils.js.map +1 -0
  117. package/cjs/utils/propUtils.js +27 -0
  118. package/cjs/utils/propUtils.js.map +1 -0
  119. package/cjs/utils/refUtils.js +12 -0
  120. package/cjs/utils/refUtils.js.map +1 -0
  121. package/cjs/utils/styleUtils.js +15 -0
  122. package/cjs/utils/styleUtils.js.map +1 -0
  123. package/cjs/utils/typeOf.js +27 -0
  124. package/cjs/utils/typeOf.js.map +1 -0
  125. package/esm/Component.js +12 -0
  126. package/esm/Component.js.map +1 -0
  127. package/esm/DraggableLayout.css +18 -0
  128. package/esm/DraggableLayout.js +22 -0
  129. package/esm/DraggableLayout.js.map +1 -0
  130. package/esm/dock-layout/DockLayout.css +36 -0
  131. package/esm/dock-layout/DockLayout.js +25 -0
  132. package/esm/dock-layout/DockLayout.js.map +1 -0
  133. package/esm/dock-layout/Drawer.css +159 -0
  134. package/esm/dock-layout/Drawer.js +85 -0
  135. package/esm/dock-layout/Drawer.js.map +1 -0
  136. package/esm/drag-drop/BoxModel.js +415 -0
  137. package/esm/drag-drop/BoxModel.js.map +1 -0
  138. package/esm/drag-drop/DragState.js +152 -0
  139. package/esm/drag-drop/DragState.js.map +1 -0
  140. package/esm/drag-drop/Draggable.js +190 -0
  141. package/esm/drag-drop/Draggable.js.map +1 -0
  142. package/esm/drag-drop/DropMenu.css +71 -0
  143. package/esm/drag-drop/DropMenu.js +43 -0
  144. package/esm/drag-drop/DropMenu.js.map +1 -0
  145. package/esm/drag-drop/DropTarget.js +240 -0
  146. package/esm/drag-drop/DropTarget.js.map +1 -0
  147. package/esm/drag-drop/DropTargetRenderer.css +40 -0
  148. package/esm/drag-drop/DropTargetRenderer.js +231 -0
  149. package/esm/drag-drop/DropTargetRenderer.js.map +1 -0
  150. package/esm/flexbox/Flexbox.css +45 -0
  151. package/esm/flexbox/Flexbox.js +59 -0
  152. package/esm/flexbox/Flexbox.js.map +1 -0
  153. package/esm/flexbox/FlexboxLayout.js +28 -0
  154. package/esm/flexbox/FlexboxLayout.js.map +1 -0
  155. package/esm/flexbox/FluidGrid.css +134 -0
  156. package/esm/flexbox/FluidGrid.js +76 -0
  157. package/esm/flexbox/FluidGrid.js.map +1 -0
  158. package/esm/flexbox/FluidGridLayout.js +12 -0
  159. package/esm/flexbox/FluidGridLayout.js.map +1 -0
  160. package/esm/flexbox/Splitter.css +148 -0
  161. package/esm/flexbox/Splitter.js +111 -0
  162. package/esm/flexbox/Splitter.js.map +1 -0
  163. package/esm/flexbox/flexbox-utils.js +103 -0
  164. package/esm/flexbox/flexbox-utils.js.map +1 -0
  165. package/esm/flexbox/useResponsiveSizing.js +60 -0
  166. package/esm/flexbox/useResponsiveSizing.js.map +1 -0
  167. package/esm/flexbox/useSplitterResizing.js +207 -0
  168. package/esm/flexbox/useSplitterResizing.js.map +1 -0
  169. package/esm/index.js +36 -19
  170. package/esm/index.js.map +1 -7
  171. package/esm/layout-action.js +25 -0
  172. package/esm/layout-action.js.map +1 -0
  173. package/esm/layout-header/Header.css +9 -0
  174. package/esm/layout-header/Header.js +120 -0
  175. package/esm/layout-header/Header.js.map +1 -0
  176. package/esm/layout-provider/LayoutProvider.js +172 -0
  177. package/esm/layout-provider/LayoutProvider.js.map +1 -0
  178. package/esm/layout-provider/LayoutProviderContext.js +12 -0
  179. package/esm/layout-provider/LayoutProviderContext.js.map +1 -0
  180. package/esm/layout-provider/useLayoutDragDrop.js +168 -0
  181. package/esm/layout-provider/useLayoutDragDrop.js.map +1 -0
  182. package/esm/layout-reducer/flexUtils.js +210 -0
  183. package/esm/layout-reducer/flexUtils.js.map +1 -0
  184. package/esm/layout-reducer/insert-layout-element.js +269 -0
  185. package/esm/layout-reducer/insert-layout-element.js.map +1 -0
  186. package/esm/layout-reducer/layout-reducer.js +196 -0
  187. package/esm/layout-reducer/layout-reducer.js.map +1 -0
  188. package/esm/layout-reducer/layoutTypes.js +37 -0
  189. package/esm/layout-reducer/layoutTypes.js.map +1 -0
  190. package/esm/layout-reducer/layoutUtils.js +215 -0
  191. package/esm/layout-reducer/layoutUtils.js.map +1 -0
  192. package/esm/layout-reducer/move-layout-element.js +29 -0
  193. package/esm/layout-reducer/move-layout-element.js.map +1 -0
  194. package/esm/layout-reducer/remove-layout-element.js +221 -0
  195. package/esm/layout-reducer/remove-layout-element.js.map +1 -0
  196. package/esm/layout-reducer/replace-layout-element.js +87 -0
  197. package/esm/layout-reducer/replace-layout-element.js.map +1 -0
  198. package/esm/layout-reducer/resize-flex-children.js +58 -0
  199. package/esm/layout-reducer/resize-flex-children.js.map +1 -0
  200. package/esm/layout-reducer/wrap-layout-element.js +210 -0
  201. package/esm/layout-reducer/wrap-layout-element.js.map +1 -0
  202. package/esm/layout-view/View.css +62 -0
  203. package/esm/layout-view/View.js +153 -0
  204. package/esm/layout-view/View.js.map +1 -0
  205. package/esm/layout-view/useView.js +90 -0
  206. package/esm/layout-view/useView.js.map +1 -0
  207. package/esm/layout-view/useViewResize.js +40 -0
  208. package/esm/layout-view/useViewResize.js.map +1 -0
  209. package/esm/layout-view-actions/ViewContext.js +12 -0
  210. package/esm/layout-view-actions/ViewContext.js.map +1 -0
  211. package/esm/layout-view-actions/useViewActionDispatcher.js +101 -0
  212. package/esm/layout-view-actions/useViewActionDispatcher.js.map +1 -0
  213. package/esm/palette/Palette.css +33 -0
  214. package/esm/palette/Palette.js +115 -0
  215. package/esm/palette/Palette.js.map +1 -0
  216. package/esm/placeholder/LayoutStartPanel.css +30 -0
  217. package/esm/placeholder/LayoutStartPanel.js +49 -0
  218. package/esm/placeholder/LayoutStartPanel.js.map +1 -0
  219. package/esm/placeholder/Placeholder.css +17 -0
  220. package/esm/placeholder/Placeholder.js +23 -0
  221. package/esm/placeholder/Placeholder.js.map +1 -0
  222. package/esm/registry/ComponentRegistry.js +21 -0
  223. package/esm/registry/ComponentRegistry.js.map +1 -0
  224. package/esm/responsive/breakpoints.js +33 -0
  225. package/esm/responsive/breakpoints.js.map +1 -0
  226. package/esm/responsive/use-breakpoints.js +74 -0
  227. package/esm/responsive/use-breakpoints.js.map +1 -0
  228. package/esm/responsive/useResizeObserver.js +112 -0
  229. package/esm/responsive/useResizeObserver.js.map +1 -0
  230. package/esm/responsive/utils.js +31 -0
  231. package/esm/responsive/utils.js.map +1 -0
  232. package/esm/stack/Stack.css +39 -0
  233. package/esm/stack/Stack.js +137 -0
  234. package/esm/stack/Stack.js.map +1 -0
  235. package/esm/stack/StackLayout.js +120 -0
  236. package/esm/stack/StackLayout.js.map +1 -0
  237. package/esm/use-persistent-state.js +104 -0
  238. package/esm/use-persistent-state.js.map +1 -0
  239. package/esm/utils/pathUtils.js +280 -0
  240. package/esm/utils/pathUtils.js.map +1 -0
  241. package/esm/utils/propUtils.js +23 -0
  242. package/esm/utils/propUtils.js.map +1 -0
  243. package/esm/utils/refUtils.js +10 -0
  244. package/esm/utils/refUtils.js.map +1 -0
  245. package/esm/utils/styleUtils.js +13 -0
  246. package/esm/utils/styleUtils.js.map +1 -0
  247. package/esm/utils/typeOf.js +23 -0
  248. package/esm/utils/typeOf.js.map +1 -0
  249. package/package.json +12 -15
  250. package/types/index.d.ts +1 -1
  251. package/types/layout-header/Header.d.ts +1 -1
  252. package/types/layout-reducer/layoutTypes.d.ts +1 -1
  253. package/types/layout-view/index.d.ts +2 -4
  254. package/types/layout-view/useView.d.ts +2 -2
  255. package/types/{layout-view → layout-view-actions}/ViewContext.d.ts +1 -1
  256. package/types/layout-view-actions/index.d.ts +2 -0
  257. package/LICENSE +0 -201
  258. package/README.md +0 -1
  259. package/index.css +0 -2
  260. package/index.css.map +0 -7
  261. /package/types/{layout-view → layout-view-actions}/useViewActionDispatcher.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-layout-element.js","sources":["../../src/layout-reducer/wrap-layout-element.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { rectTuple, uuid } from \"@vuu-ui/vuu-utils\";\nimport React, { ReactElement } from \"react\";\nimport { DropPos } from \"../drag-drop/dragDropTypes\";\nimport { DropTarget } from \"../drag-drop/DropTarget\";\nimport { ComponentRegistry } from \"../registry/ComponentRegistry\";\nimport { getProp, getProps, nextStep, resetPath, typeOf } from \"../utils\";\nimport {\n createFlexbox,\n createPlaceHolder,\n flexDirection,\n getFlexStyle,\n getIntrinsicSize,\n wrapIntrinsicSizeComponentWithFlexbox,\n} from \"./flexUtils\";\nimport { LayoutModel } from \"./layoutTypes\";\nimport { applyLayoutProps, LayoutProps } from \"./layoutUtils\";\n\nexport interface LayoutSpec {\n type: \"Stack\" | \"Flexbox\";\n flexDirection: \"column\" | \"row\";\n showTabs?: boolean;\n}\n\nconst isHtmlElement = (component: LayoutModel) => {\n const [firstLetter] = typeOf(component) as string;\n return firstLetter === firstLetter.toLowerCase();\n};\n\nexport function wrap(\n container: ReactElement,\n existingComponent: ReactElement,\n newComponent: any,\n pos: DropPos,\n clientRect?: DropTarget[\"clientRect\"],\n dropRect?: DropTarget[\"dropRect\"]\n): ReactElement {\n const { children: containerChildren, path: containerPath } =\n getProps(container);\n\n const existingComponentPath = getProp(existingComponent, \"path\");\n const { idx, finalStep } = nextStep(containerPath, existingComponentPath);\n const children = finalStep\n ? updateChildren(\n container,\n containerChildren,\n existingComponent,\n newComponent,\n pos,\n clientRect,\n dropRect\n )\n : containerChildren.map((child: ReactElement, index: number) =>\n index === idx\n ? wrap(\n child,\n existingComponent,\n newComponent,\n pos,\n clientRect,\n dropRect\n )\n : child\n );\n\n return React.cloneElement(container, undefined, children);\n}\n\nfunction updateChildren(\n container: LayoutModel,\n containerChildren: ReactElement[],\n existingComponent: ReactElement,\n newComponent: ReactElement,\n pos: DropPos,\n clientRect?: DropTarget[\"clientRect\"],\n dropRect?: rectTuple\n) {\n const intrinsicSize = getIntrinsicSize(newComponent);\n\n if (intrinsicSize?.width && intrinsicSize?.height) {\n if (clientRect === undefined || dropRect === undefined) {\n throw Error(\n \"wrap-layout-element, updateChildren clientRect and dropRect must both be available\"\n );\n }\n return wrapIntrinsicSizedComponent(\n containerChildren,\n existingComponent,\n newComponent,\n pos,\n clientRect,\n dropRect\n );\n }\n return wrapFlexComponent(\n container,\n containerChildren,\n existingComponent,\n newComponent,\n pos\n );\n}\n\nfunction wrapFlexComponent(\n container: LayoutModel,\n containerChildren: ReactElement[],\n existingComponent: ReactElement,\n newComponent: ReactElement,\n pos: DropPos\n) {\n const { version = 0 } = getProps(newComponent);\n const { path: existingComponentPath, title } = getProps(existingComponent);\n const {\n type,\n flexDirection,\n showTabs: showTabsProp,\n } = getLayoutSpecForWrapper(pos);\n const [style, existingComponentStyle, newComponentStyle] =\n getWrappedFlexStyles(\n type,\n existingComponent,\n newComponent,\n flexDirection,\n pos\n );\n const targetFirst = isTargetFirst(pos);\n const active = targetFirst ? 1 : 0;\n\n const newComponentProps = {\n resizeable: true,\n style: newComponentStyle,\n version: version + 1,\n };\n const resizeProp = isHtmlElement(existingComponent)\n ? \"data-resizeable\"\n : \"resizeable\";\n\n const existingComponentProps = {\n [resizeProp]: true,\n style: existingComponentStyle,\n };\n\n const showTabs = type === \"Stack\" ? { showTabs: showTabsProp } : undefined;\n const splitterSize =\n type === \"Flexbox\"\n ? {\n splitterSize:\n (typeOf(container) === \"Flexbox\" && container.props.splitterSize) ??\n undefined,\n }\n : undefined;\n\n const id = uuid();\n const wrapper = React.createElement(\n ComponentRegistry[type],\n {\n active,\n id,\n key: id,\n path: getProp(existingComponent, \"path\"),\n flexFill: getProp(existingComponent, \"flexFill\"),\n ...splitterSize,\n ...showTabs,\n style,\n title,\n resizeable: getProp(existingComponent, \"resizeable\"),\n } as LayoutProps,\n targetFirst\n ? [\n resetPath(\n existingComponent,\n `${existingComponentPath}.0`,\n existingComponentProps\n ),\n applyLayoutProps(\n React.cloneElement(newComponent, newComponentProps),\n `${existingComponentPath}.1`\n ),\n ]\n : [\n applyLayoutProps(\n React.cloneElement(newComponent, newComponentProps),\n `${existingComponentPath}.0`\n ),\n resetPath(\n existingComponent,\n `${existingComponentPath}.1`,\n existingComponentProps\n ),\n ]\n );\n return containerChildren.map((child: ReactElement) =>\n child === existingComponent ? wrapper : child\n );\n}\n\nfunction wrapIntrinsicSizedComponent(\n containerChildren: ReactElement[],\n existingComponent: ReactElement,\n newComponent: ReactElement,\n pos: DropPos,\n clientRect: DropTarget[\"clientRect\"],\n dropRect: rectTuple\n) {\n const { flexDirection } = getLayoutSpecForWrapper(pos);\n const contraDirection = flexDirection === \"column\" ? \"row\" : \"column\";\n const targetFirst = isTargetFirst(pos);\n\n const [dropLeft, dropTop, dropRight, dropBottom] = dropRect;\n const [startPlaceholder, endPlaceholder] =\n flexDirection === \"column\"\n ? [dropTop - clientRect.top, clientRect.bottom - dropBottom]\n : [dropLeft - clientRect.left, clientRect.right - dropRight];\n const pathRoot = getProp(existingComponent, \"path\");\n let pathIndex = 0;\n\n const resizeProp = isHtmlElement(existingComponent)\n ? \"data-resizeable\"\n : \"resizeable\";\n\n const wrappedChildren = [];\n if (startPlaceholder) {\n wrappedChildren.push(\n targetFirst\n ? resetPath(existingComponent, `${pathRoot}.${pathIndex++}`, {\n [resizeProp]: true,\n style: { flexBasis: startPlaceholder, flexGrow: 1, flexShrink: 1 },\n })\n : createPlaceHolder(`${pathRoot}.${pathIndex++}`, startPlaceholder, {\n flexGrow: 0,\n flexShrink: 0,\n })\n );\n }\n wrappedChildren.push(\n wrapIntrinsicSizeComponentWithFlexbox(\n newComponent,\n contraDirection,\n `${pathRoot}.${pathIndex++}`,\n clientRect,\n dropRect\n )\n );\n if (endPlaceholder) {\n wrappedChildren.push(\n targetFirst\n ? createPlaceHolder(`${pathRoot}.${pathIndex++}`, 0)\n : resetPath(existingComponent, `${pathRoot}.${pathIndex++}`, {\n [resizeProp]: true,\n style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },\n })\n );\n }\n\n const wrapper = createFlexbox(\n flexDirection,\n existingComponent.props,\n wrappedChildren,\n pathRoot\n );\n return containerChildren.map((child) =>\n child === existingComponent ? wrapper : child\n );\n}\n\nfunction getWrappedFlexStyles(\n type: string,\n existingComponent: ReactElement,\n newComponent: ReactElement,\n flexDirection: flexDirection,\n pos: DropPos\n) {\n const style = {\n ...existingComponent.props.style,\n flexDirection,\n };\n\n const dimension =\n type === \"Flexbox\" && flexDirection === \"column\" ? \"height\" : \"width\";\n const newComponentStyle = getFlexStyle(newComponent, dimension, pos);\n const existingComponentStyle = getFlexStyle(existingComponent, dimension);\n\n return [style, existingComponentStyle, newComponentStyle];\n}\n\nconst isTargetFirst = (pos: DropPos) =>\n pos.position.SouthOrEast\n ? true\n : pos?.tab?.positionRelativeToTab === \"before\"\n ? false\n : pos.position.Header\n ? true\n : false;\n\nfunction getLayoutSpecForWrapper(pos: DropPos): LayoutSpec {\n if (pos.position.Header) {\n return {\n type: \"Stack\",\n flexDirection: \"column\",\n showTabs: true,\n };\n } else {\n return {\n type: \"Flexbox\",\n flexDirection: pos.position.EastOrWest ? \"row\" : \"column\",\n };\n }\n}\n"],"names":["flexDirection"],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ .vuuView {
2
+ border-color: var(--vuuView-borderColor, var(--salt-container-primary-borderColor));
3
+ border-width: var(--vuuView-borderWidth, 1px);
4
+ border-style: var(--vuuView-borderStyle, none);
5
+
6
+ display: flex;
7
+ flex-direction: column;
8
+ margin: var(--vuuView-margin, 0px);
9
+ min-height: 50px;
10
+ min-width: 50px;
11
+ outline: none;
12
+ overflow: hidden;
13
+ position: relative;
14
+ }
15
+
16
+ .vuuView.focus-visible:after {
17
+ content: '';
18
+ position: absolute;
19
+ top: 0;
20
+ left: 0;
21
+ right: 0;
22
+ bottom: 0;
23
+ border: dotted cornflowerblue 2px;
24
+ }
25
+
26
+ .vuuView.dragging {
27
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
28
+ }
29
+
30
+ .vuuView-main {
31
+ /* height: var(--view-content-height);
32
+ width: var(--view-content-width); */
33
+ display: flex;
34
+ flex-direction: var(--vuuView-flexDirection, column);
35
+ flex-wrap: var(--vuuView-flex-wrap, nowrap);
36
+ flex: 1;
37
+ justify-content: var(--vuuView-justify, flex-start);
38
+ overflow: hidden;
39
+ position: relative;
40
+ }
41
+
42
+ .vuuView-main > * {
43
+ flex-basis: auto;
44
+ flex-grow: var(--vuuView-flex-grow, 1);
45
+ flex-shrink: var(--vuuView-flex-shrink, 1);
46
+ }
47
+
48
+ .vuuView-collapsed .vuuView-main {
49
+ display: none;
50
+ }
51
+
52
+ .vuuView-collapsed + .Splitter {
53
+ display: none;
54
+ }
55
+
56
+ .vuuView-collapsed .Toolbar-vertical {
57
+ border-right: solid 1px var(--grey40);
58
+ }
59
+
60
+ .vuuView-collapsed .Toolbar-vertical .toolbar-title {
61
+ display: none;
62
+ }
@@ -0,0 +1,153 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useId } from '@vuu-ui/vuu-utils';
3
+ import { useForkRef } from '@salt-ds/core';
4
+ import cx from 'clsx';
5
+ import React, { forwardRef, useRef, useState, useCallback, useMemo } from 'react';
6
+ import { Header } from '../layout-header/Header.js';
7
+ import { registerComponent } from '../registry/ComponentRegistry.js';
8
+ import { useView } from './useView.js';
9
+ import { useViewResize } from './useViewResize.js';
10
+ import '../layout-provider/LayoutProviderContext.js';
11
+ import '../drag-drop/Draggable.js';
12
+ import '../drag-drop/BoxModel.js';
13
+ import { ViewContext } from '../layout-view-actions/ViewContext.js';
14
+
15
+ const classBase = "vuuView";
16
+ const getProps = (state, props) => {
17
+ if (state && props) {
18
+ return {
19
+ ...state,
20
+ ...props
21
+ };
22
+ } else
23
+ return state || props;
24
+ };
25
+ const View = forwardRef(function View2(props, forwardedRef) {
26
+ const {
27
+ Header: Header$1 = Header,
28
+ children,
29
+ className,
30
+ collapsed,
31
+ closeable,
32
+ "data-path": dataPath,
33
+ "data-resizeable": dataResizeable,
34
+ dropTargets,
35
+ expanded,
36
+ flexFill,
37
+ id: idProp,
38
+ header,
39
+ orientation = "horizontal",
40
+ path = dataPath,
41
+ resize = "responsive",
42
+ resizeable = dataResizeable,
43
+ tearOut,
44
+ style = {},
45
+ title: titleProp,
46
+ ...restProps
47
+ } = props;
48
+ const id = useId(idProp);
49
+ const rootRef = useRef(null);
50
+ const mainRef = useRef(null);
51
+ const [componentProps, _setComponentProps] = useState();
52
+ const {
53
+ contributions,
54
+ dispatchViewAction,
55
+ load,
56
+ loadSession,
57
+ onConfigChange,
58
+ onEditTitle,
59
+ purge,
60
+ restoredState,
61
+ save,
62
+ saveSession,
63
+ title
64
+ } = useView({
65
+ id,
66
+ rootRef,
67
+ path,
68
+ dropTargets,
69
+ title: titleProp
70
+ });
71
+ useViewResize({ mainRef, resize, rootRef });
72
+ const setComponentProps = useCallback((props2) => {
73
+ _setComponentProps(props2);
74
+ }, []);
75
+ const getContent = () => {
76
+ if (React.isValidElement(children) && (restoredState || componentProps)) {
77
+ return React.cloneElement(
78
+ children,
79
+ getProps(restoredState, componentProps)
80
+ );
81
+ }
82
+ return children;
83
+ };
84
+ const viewContextValue = useMemo(
85
+ () => ({
86
+ dispatch: dispatchViewAction,
87
+ id,
88
+ path,
89
+ title,
90
+ load,
91
+ loadSession,
92
+ onConfigChange,
93
+ purge,
94
+ save,
95
+ saveSession,
96
+ setComponentProps
97
+ }),
98
+ [
99
+ dispatchViewAction,
100
+ id,
101
+ load,
102
+ loadSession,
103
+ onConfigChange,
104
+ path,
105
+ purge,
106
+ save,
107
+ saveSession,
108
+ setComponentProps,
109
+ title
110
+ ]
111
+ );
112
+ const headerProps = typeof header === "object" ? header : {};
113
+ return /* @__PURE__ */ jsx(
114
+ "div",
115
+ {
116
+ ...restProps,
117
+ className: cx(classBase, className, {
118
+ [`${classBase}-collapsed`]: collapsed,
119
+ [`${classBase}-expanded`]: expanded,
120
+ [`${classBase}-resize-defer`]: resize === "defer"
121
+ }),
122
+ "data-resizeable": resizeable,
123
+ id,
124
+ ref: useForkRef(forwardedRef, rootRef),
125
+ style,
126
+ tabIndex: -1,
127
+ children: /* @__PURE__ */ jsxs(ViewContext.Provider, { value: viewContextValue, children: [
128
+ header ? /* @__PURE__ */ jsx(
129
+ Header$1,
130
+ {
131
+ ...headerProps,
132
+ collapsed,
133
+ contributions,
134
+ expanded,
135
+ closeable,
136
+ onEditTitle,
137
+ orientation,
138
+ tearOut,
139
+ title
140
+ }
141
+ ) : null,
142
+ /* @__PURE__ */ jsx("div", { className: `${classBase}-main`, ref: mainRef, children: getContent() })
143
+ ] })
144
+ }
145
+ );
146
+ });
147
+ View.displayName = "View";
148
+ const MemoView = React.memo(View);
149
+ MemoView.displayName = "View";
150
+ registerComponent("View", MemoView, "view");
151
+
152
+ export { MemoView as View };
153
+ //# sourceMappingURL=View.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"View.js","sources":["../../src/layout-view/View.tsx"],"sourcesContent":["import { useId } from \"@vuu-ui/vuu-utils\";\nimport { useForkRef } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport React, {\n ForwardedRef,\n forwardRef,\n ReactElement,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Header as VuuHeader } from \"../layout-header/Header\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\nimport { useView } from \"./useView\";\nimport { useViewResize } from \"./useViewResize\";\nimport { ViewContext, ViewContextAPI } from \"../layout-view-actions\";\nimport { ViewProps } from \"./viewTypes\";\n\nimport \"./View.css\";\n\nconst classBase = \"vuuView\";\n\ntype Props = { [key: string]: unknown };\n\nconst getProps = (state?: Props, props?: Props) => {\n if (state && props) {\n return {\n ...state,\n ...props,\n };\n } else return state || props;\n};\n\n/**\n * View is the leaf-level entity managed by the Vuu layout system. It may represent a component\n * or a group of components. It also offers an API (via useViewContext) for persistence.\n */\nconst View = forwardRef(function View(\n props: ViewProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const {\n Header = VuuHeader,\n children,\n className,\n collapsed,\n closeable,\n \"data-path\": dataPath,\n \"data-resizeable\": dataResizeable,\n dropTargets,\n expanded,\n flexFill,\n id: idProp,\n header,\n orientation = \"horizontal\",\n path = dataPath,\n resize = \"responsive\",\n resizeable = dataResizeable,\n tearOut,\n style = {},\n title: titleProp,\n ...restProps\n } = props;\n\n const id = useId(idProp);\n const rootRef = useRef<HTMLDivElement>(null);\n const mainRef = useRef<HTMLDivElement>(null);\n const [componentProps, _setComponentProps] = useState<Props>();\n const {\n contributions,\n dispatchViewAction,\n load,\n loadSession,\n onConfigChange,\n onEditTitle,\n purge,\n restoredState,\n save,\n saveSession,\n title,\n } = useView({\n id,\n rootRef,\n path,\n dropTargets,\n title: titleProp,\n });\n\n useViewResize({ mainRef, resize, rootRef });\n\n const setComponentProps = useCallback((props?: Props) => {\n _setComponentProps(props);\n }, []);\n\n const getContent = () => {\n if (React.isValidElement(children) && (restoredState || componentProps)) {\n return React.cloneElement(\n children,\n getProps(restoredState, componentProps)\n );\n }\n return children;\n };\n\n const viewContextValue: ViewContextAPI = useMemo(\n () => ({\n dispatch: dispatchViewAction,\n id,\n path,\n title,\n load,\n loadSession,\n onConfigChange,\n purge,\n save,\n saveSession,\n setComponentProps,\n }),\n [\n dispatchViewAction,\n id,\n load,\n loadSession,\n onConfigChange,\n path,\n purge,\n save,\n saveSession,\n setComponentProps,\n title,\n ]\n );\n\n const headerProps = typeof header === \"object\" ? header : {};\n\n return (\n <div\n {...restProps}\n className={cx(classBase, className, {\n [`${classBase}-collapsed`]: collapsed,\n [`${classBase}-expanded`]: expanded,\n [`${classBase}-resize-defer`]: resize === \"defer\",\n })}\n data-resizeable={resizeable}\n id={id}\n ref={useForkRef(forwardedRef, rootRef)}\n style={style}\n tabIndex={-1}\n >\n <ViewContext.Provider value={viewContextValue}>\n {header ? (\n <Header\n {...headerProps}\n collapsed={collapsed}\n contributions={contributions}\n expanded={expanded}\n closeable={closeable}\n onEditTitle={onEditTitle}\n orientation={orientation}\n tearOut={tearOut}\n title={title}\n />\n ) : null}\n <div className={`${classBase}-main`} ref={mainRef}>\n {getContent()}\n </div>\n </ViewContext.Provider>\n </div>\n );\n});\nView.displayName = \"View\";\n\ninterface ViewComponentType {\n (\n props: ViewProps & {\n ref?: ForwardedRef<HTMLDivElement>;\n }\n ): ReactElement<ViewProps>;\n displayName?: string;\n}\n\nconst MemoView = React.memo(View) as ViewComponentType;\n\nMemoView.displayName = \"View\";\n\nregisterComponent(\"View\", MemoView, \"view\");\n\nexport { MemoView as View };\n"],"names":["View","Header","VuuHeader","props"],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { useMemo, useCallback } from 'react';
2
+ import { useLayoutProviderDispatch } from '../layout-provider/LayoutProvider.js';
3
+ import '../layout-provider/LayoutProviderContext.js';
4
+ import { usePersistentState } from '../use-persistent-state.js';
5
+ import { useViewActionDispatcher } from '../layout-view-actions/useViewActionDispatcher.js';
6
+
7
+ const useView = ({
8
+ id,
9
+ rootRef,
10
+ path,
11
+ dropTargets,
12
+ title: titleProp
13
+ }) => {
14
+ const layoutDispatch = useLayoutProviderDispatch();
15
+ const {
16
+ loadState,
17
+ loadSessionState,
18
+ purgeState,
19
+ saveState,
20
+ saveSessionState
21
+ } = usePersistentState();
22
+ const [dispatchViewAction, contributions] = useViewActionDispatcher(
23
+ id,
24
+ rootRef,
25
+ path,
26
+ dropTargets
27
+ );
28
+ const title = useMemo(
29
+ () => loadState("view-title") ?? titleProp,
30
+ [loadState, titleProp]
31
+ );
32
+ const onEditTitle = useCallback(
33
+ (title2) => {
34
+ if (path) {
35
+ layoutDispatch({ type: "set-title", path, title: title2 });
36
+ }
37
+ },
38
+ [layoutDispatch, path]
39
+ );
40
+ const restoredState = useMemo(() => loadState(id), [id, loadState]);
41
+ const load = useCallback(
42
+ (key) => loadState(id, key),
43
+ [id, loadState]
44
+ );
45
+ const purge = useCallback(
46
+ (key) => {
47
+ purgeState(id, key);
48
+ layoutDispatch({ type: "save" });
49
+ },
50
+ [id, layoutDispatch, purgeState]
51
+ );
52
+ const save = useCallback(
53
+ (state, key) => {
54
+ saveState(id, key, state);
55
+ layoutDispatch({ type: "save" });
56
+ },
57
+ [id, layoutDispatch, saveState]
58
+ );
59
+ const loadSession = useCallback(
60
+ (key) => loadSessionState(id, key),
61
+ [id, loadSessionState]
62
+ );
63
+ const saveSession = useCallback(
64
+ (state, key) => saveSessionState(id, key, state),
65
+ [id, saveSessionState]
66
+ );
67
+ const onConfigChange = useCallback(
68
+ ({ type: key, ...config }) => {
69
+ const { [key]: data } = config;
70
+ save(data, key);
71
+ },
72
+ [save]
73
+ );
74
+ return {
75
+ contributions,
76
+ dispatchViewAction,
77
+ load,
78
+ loadSession,
79
+ onConfigChange,
80
+ onEditTitle,
81
+ purge,
82
+ restoredState,
83
+ save,
84
+ saveSession,
85
+ title
86
+ };
87
+ };
88
+
89
+ export { useView };
90
+ //# sourceMappingURL=useView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useView.js","sources":["../../src/layout-view/useView.tsx"],"sourcesContent":["import { RefObject, useCallback, useMemo } from \"react\";\nimport { useLayoutProviderDispatch } from \"../layout-provider\";\nimport { usePersistentState } from \"../use-persistent-state\";\nimport { useViewActionDispatcher } from \"../layout-view-actions/useViewActionDispatcher\";\n\nexport interface ViewHookProps {\n id: string;\n rootRef: RefObject<HTMLDivElement>;\n path?: string;\n dropTargets?: string[];\n title?: string;\n}\n\nexport const useView = ({\n id,\n rootRef,\n path,\n dropTargets,\n title: titleProp,\n}: ViewHookProps) => {\n const layoutDispatch = useLayoutProviderDispatch();\n\n const {\n loadState,\n loadSessionState,\n purgeState,\n saveState,\n saveSessionState,\n } = usePersistentState();\n\n const [dispatchViewAction, contributions] = useViewActionDispatcher(\n id,\n rootRef,\n path,\n dropTargets\n );\n\n const title = useMemo(\n () => loadState(\"view-title\") ?? titleProp,\n [loadState, titleProp]\n );\n\n const onEditTitle = useCallback(\n (title: string) => {\n if (path) {\n layoutDispatch({ type: \"set-title\", path, title });\n }\n },\n [layoutDispatch, path]\n );\n\n const restoredState = useMemo(() => loadState(id), [id, loadState]);\n\n const load = useCallback(\n (key?: string) => loadState(id, key),\n [id, loadState]\n );\n\n const purge = useCallback(\n (key) => {\n purgeState(id, key);\n layoutDispatch({ type: \"save\" });\n },\n [id, layoutDispatch, purgeState]\n );\n\n const save = useCallback(\n (state, key) => {\n saveState(id, key, state);\n layoutDispatch({ type: \"save\" });\n },\n [id, layoutDispatch, saveState]\n );\n const loadSession = useCallback(\n (key?: string) => loadSessionState(id, key),\n [id, loadSessionState]\n );\n const saveSession = useCallback(\n (state, key) => saveSessionState(id, key, state),\n [id, saveSessionState]\n );\n\n const onConfigChange = useCallback(\n ({ type: key, ...config }) => {\n const { [key]: data } = config;\n save(data, key);\n },\n [save]\n );\n\n return {\n contributions,\n dispatchViewAction,\n load,\n loadSession,\n onConfigChange,\n onEditTitle,\n purge,\n restoredState,\n save,\n saveSession,\n title,\n };\n};\n"],"names":["title"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { useRef, useCallback } from 'react';
2
+ import { useResizeObserver, WidthHeight } from '../responsive/useResizeObserver.js';
3
+
4
+ const NO_MEASUREMENT = [];
5
+ const useViewResize = ({
6
+ mainRef,
7
+ resize = "responsive",
8
+ rootRef
9
+ }) => {
10
+ const deferResize = resize === "defer";
11
+ const mainSize = useRef({});
12
+ const resizeHandle = useRef();
13
+ const setMainSize = useCallback(() => {
14
+ if (mainRef.current) {
15
+ mainRef.current.style.height = mainSize.current.height + "px";
16
+ mainRef.current.style.width = mainSize.current.width + "px";
17
+ }
18
+ resizeHandle.current = void 0;
19
+ }, [mainRef]);
20
+ const onResize = useCallback(
21
+ ({ height, width }) => {
22
+ mainSize.current.height = height;
23
+ mainSize.current.width = width;
24
+ if (resizeHandle.current !== null) {
25
+ clearTimeout(resizeHandle.current);
26
+ }
27
+ resizeHandle.current = window.setTimeout(setMainSize, 40);
28
+ },
29
+ [setMainSize]
30
+ );
31
+ useResizeObserver(
32
+ rootRef,
33
+ deferResize ? WidthHeight : NO_MEASUREMENT,
34
+ onResize,
35
+ deferResize
36
+ );
37
+ };
38
+
39
+ export { useViewResize };
40
+ //# sourceMappingURL=useViewResize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useViewResize.js","sources":["../../src/layout-view/useViewResize.ts"],"sourcesContent":["import { useResizeObserver, WidthHeight } from \"../responsive\";\nimport { RefObject, useCallback, useRef } from \"react\";\n\nconst NO_MEASUREMENT: string[] = [];\n\ntype size = {\n height?: number;\n width?: number;\n};\n\nexport interface ViewResizeHookProps {\n mainRef: RefObject<HTMLDivElement>;\n resize?: \"defer\" | \"responsive\";\n rootRef: RefObject<HTMLDivElement>;\n}\n\nexport const useViewResize = ({\n mainRef,\n resize = \"responsive\",\n rootRef,\n}: ViewResizeHookProps) => {\n const deferResize = resize === \"defer\";\n\n const mainSize = useRef<size>({});\n const resizeHandle = useRef<number>();\n\n const setMainSize = useCallback(() => {\n if (mainRef.current) {\n mainRef.current.style.height = mainSize.current.height + \"px\";\n mainRef.current.style.width = mainSize.current.width + \"px\";\n }\n resizeHandle.current = undefined;\n }, [mainRef]);\n\n const onResize = useCallback(\n ({ height, width }) => {\n mainSize.current.height = height;\n mainSize.current.width = width;\n if (resizeHandle.current !== null) {\n clearTimeout(resizeHandle.current);\n }\n resizeHandle.current = window.setTimeout(setMainSize, 40);\n },\n [setMainSize]\n );\n\n useResizeObserver(\n rootRef,\n deferResize ? WidthHeight : NO_MEASUREMENT,\n onResize,\n deferResize\n );\n};\n"],"names":[],"mappings":";;;AAGA,MAAM,iBAA2B,EAAC,CAAA;AAa3B,MAAM,gBAAgB,CAAC;AAAA,EAC5B,OAAA;AAAA,EACA,MAAS,GAAA,YAAA;AAAA,EACT,OAAA;AACF,CAA2B,KAAA;AACzB,EAAA,MAAM,cAAc,MAAW,KAAA,OAAA,CAAA;AAE/B,EAAM,MAAA,QAAA,GAAW,MAAa,CAAA,EAAE,CAAA,CAAA;AAChC,EAAA,MAAM,eAAe,MAAe,EAAA,CAAA;AAEpC,EAAM,MAAA,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAA,OAAA,CAAQ,OAAQ,CAAA,KAAA,CAAM,MAAS,GAAA,QAAA,CAAS,QAAQ,MAAS,GAAA,IAAA,CAAA;AACzD,MAAA,OAAA,CAAQ,OAAQ,CAAA,KAAA,CAAM,KAAQ,GAAA,QAAA,CAAS,QAAQ,KAAQ,GAAA,IAAA,CAAA;AAAA,KACzD;AACA,IAAA,YAAA,CAAa,OAAU,GAAA,KAAA,CAAA,CAAA;AAAA,GACzB,EAAG,CAAC,OAAO,CAAC,CAAA,CAAA;AAEZ,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IACf,CAAC,EAAE,MAAQ,EAAA,KAAA,EAAY,KAAA;AACrB,MAAA,QAAA,CAAS,QAAQ,MAAS,GAAA,MAAA,CAAA;AAC1B,MAAA,QAAA,CAAS,QAAQ,KAAQ,GAAA,KAAA,CAAA;AACzB,MAAI,IAAA,YAAA,CAAa,YAAY,IAAM,EAAA;AACjC,QAAA,YAAA,CAAa,aAAa,OAAO,CAAA,CAAA;AAAA,OACnC;AACA,MAAA,YAAA,CAAa,OAAU,GAAA,MAAA,CAAO,UAAW,CAAA,WAAA,EAAa,EAAE,CAAA,CAAA;AAAA,KAC1D;AAAA,IACA,CAAC,WAAW,CAAA;AAAA,GACd,CAAA;AAEA,EAAA,iBAAA;AAAA,IACE,OAAA;AAAA,IACA,cAAc,WAAc,GAAA,cAAA;AAAA,IAC5B,QAAA;AAAA,IACA,WAAA;AAAA,GACF,CAAA;AACF;;;;"}
@@ -0,0 +1,12 @@
1
+ import React, { useContext } from 'react';
2
+
3
+ const NO_CONTEXT = { dispatch: null };
4
+ const ViewContext = React.createContext(NO_CONTEXT);
5
+ const useViewDispatch = () => {
6
+ const context = useContext(ViewContext);
7
+ return context?.dispatch ?? null;
8
+ };
9
+ const useViewContext = () => useContext(ViewContext);
10
+
11
+ export { ViewContext, useViewContext, useViewDispatch };
12
+ //# sourceMappingURL=ViewContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewContext.js","sources":["../../src/layout-view-actions/ViewContext.ts"],"sourcesContent":["import React, { SyntheticEvent, useContext } from \"react\";\nimport { ViewAction } from \"../layout-view/viewTypes\";\n\nexport type QueryReponse = { [key: string]: unknown };\n\nexport type ViewDispatch = <Action extends ViewAction = ViewAction>(\n action: Action,\n evt?: SyntheticEvent\n) => Promise<boolean | QueryReponse | void>;\n\n/**\n * This API is available to any Feature hosted within Vuu (as all Features are wrapped\n * with View component). It offers metadata about the View as well as access to the\n * Vuu persistencew API;\n */\nexport interface ViewContextAPI {\n /**\n * dispatcher for View actions. These are a subset of LayoutActions, specifically for\n * View manipulation\n */\n dispatch?: ViewDispatch | null;\n id?: string;\n load?: (key?: string) => unknown;\n loadSession?: (key?: string) => unknown;\n onConfigChange?: (config: unknown) => void;\n path?: string;\n purge?: (key: string) => void;\n save?: (state: unknown, key: string) => void;\n saveSession?: (state: unknown, key: string) => void;\n setComponentProps: (props: { [key: string]: unknown }) => void;\n title?: string;\n}\n\nconst NO_CONTEXT = { dispatch: null } as ViewContextAPI;\nexport const ViewContext = React.createContext<ViewContextAPI>(NO_CONTEXT);\n\nexport const useViewDispatch = () => {\n const context = useContext(ViewContext);\n return context?.dispatch ?? null;\n};\n\nexport const useViewContext = () => useContext(ViewContext);\n"],"names":[],"mappings":";;AAiCA,MAAM,UAAA,GAAa,EAAE,QAAA,EAAU,IAAK,EAAA,CAAA;AACvB,MAAA,WAAA,GAAc,KAAM,CAAA,aAAA,CAA8B,UAAU,EAAA;AAElE,MAAM,kBAAkB,MAAM;AACnC,EAAM,MAAA,OAAA,GAAU,WAAW,WAAW,CAAA,CAAA;AACtC,EAAA,OAAO,SAAS,QAAY,IAAA,IAAA,CAAA;AAC9B,EAAA;AAEa,MAAA,cAAA,GAAiB,MAAM,UAAA,CAAW,WAAW;;;;"}
@@ -0,0 +1,101 @@
1
+ import { useState, useCallback } from 'react';
2
+ import { useLayoutProviderDispatch } from '../layout-provider/LayoutProvider.js';
3
+ import '../layout-provider/LayoutProviderContext.js';
4
+ import { usePersistentState } from '../use-persistent-state.js';
5
+
6
+ const useViewActionDispatcher = (id, root, viewPath, dropTargets) => {
7
+ const { loadSessionState, purgeSessionState, purgeState, saveSessionState } = usePersistentState();
8
+ const [contributions, setContributions] = useState(
9
+ loadSessionState(id, "contributions") ?? []
10
+ );
11
+ const dispatchLayoutAction = useLayoutProviderDispatch();
12
+ const updateContributions = useCallback(
13
+ (location, content) => {
14
+ const updatedContributions = contributions.concat([
15
+ { location, content }
16
+ ]);
17
+ saveSessionState(id, "contributions", updatedContributions);
18
+ setContributions(updatedContributions);
19
+ },
20
+ [contributions, id, saveSessionState]
21
+ );
22
+ const clearContributions = useCallback(() => {
23
+ purgeSessionState(id, "contributions");
24
+ setContributions([]);
25
+ }, [id, purgeSessionState]);
26
+ const handleRemove = useCallback(() => {
27
+ const ds = loadSessionState(id, "data-source");
28
+ if (ds) {
29
+ ds.unsubscribe();
30
+ }
31
+ purgeSessionState(id);
32
+ purgeState(id);
33
+ dispatchLayoutAction({ type: "remove", path: viewPath });
34
+ }, [
35
+ dispatchLayoutAction,
36
+ id,
37
+ loadSessionState,
38
+ purgeSessionState,
39
+ purgeState,
40
+ viewPath
41
+ ]);
42
+ const handleMouseDown = useCallback(
43
+ async (evt, index, preDragActivity) => {
44
+ evt.stopPropagation();
45
+ const dragRect = root.current?.getBoundingClientRect();
46
+ return new Promise((resolve, reject) => {
47
+ dispatchLayoutAction({
48
+ type: "drag-start",
49
+ evt,
50
+ path: index === void 0 ? viewPath : `${viewPath}.${index}`,
51
+ dragRect,
52
+ preDragActivity,
53
+ dropTargets,
54
+ resolveDragStart: resolve,
55
+ rejectDragStart: reject
56
+ });
57
+ });
58
+ },
59
+ [root, dispatchLayoutAction, viewPath, dropTargets]
60
+ );
61
+ const dispatchAction = useCallback(
62
+ async (action, evt) => {
63
+ const { type } = action;
64
+ switch (type) {
65
+ case "maximize":
66
+ case "minimize":
67
+ case "restore":
68
+ return dispatchLayoutAction({ type, path: action.path ?? viewPath });
69
+ case "remove":
70
+ return handleRemove();
71
+ case "mousedown":
72
+ return handleMouseDown(evt, action.index, action.preDragActivity);
73
+ case "add-toolbar-contribution":
74
+ return updateContributions(action.location, action.content);
75
+ case "remove-toolbar-contribution":
76
+ return clearContributions();
77
+ case "query":
78
+ return dispatchLayoutAction({
79
+ type,
80
+ path: action.path,
81
+ query: action.query
82
+ });
83
+ default: {
84
+ return void 0;
85
+ }
86
+ }
87
+ },
88
+ [
89
+ dispatchLayoutAction,
90
+ viewPath,
91
+ handleRemove,
92
+ handleMouseDown,
93
+ updateContributions,
94
+ clearContributions
95
+ ]
96
+ );
97
+ return [dispatchAction, contributions];
98
+ };
99
+
100
+ export { useViewActionDispatcher };
101
+ //# sourceMappingURL=useViewActionDispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useViewActionDispatcher.js","sources":["../../src/layout-view-actions/useViewActionDispatcher.ts"],"sourcesContent":["import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport {\n ReactElement,\n RefObject,\n SyntheticEvent,\n useCallback,\n useState,\n} from \"react\";\nimport { useLayoutProviderDispatch } from \"../layout-provider\";\nimport { DragStartAction } from \"../layout-reducer\";\nimport { usePersistentState } from \"../use-persistent-state\";\nimport { QueryReponse, ViewDispatch } from \"./ViewContext\";\nimport { ViewAction } from \"../layout-view/viewTypes\";\n\nexport type ContributionLocation = \"post-title\" | \"pre-title\";\n\nexport type Contribution = {\n index?: number;\n location?: ContributionLocation;\n content: ReactElement;\n};\n\nexport const useViewActionDispatcher = (\n id: string,\n root: RefObject<HTMLDivElement>,\n viewPath?: string,\n dropTargets?: string[]\n): [ViewDispatch, Contribution[] | undefined] => {\n const { loadSessionState, purgeSessionState, purgeState, saveSessionState } =\n usePersistentState();\n\n const [contributions, setContributions] = useState<Contribution[]>(\n loadSessionState(id, \"contributions\") ?? []\n );\n const dispatchLayoutAction = useLayoutProviderDispatch();\n const updateContributions = useCallback(\n (location: ContributionLocation, content: ReactElement) => {\n const updatedContributions = contributions.concat([\n { location, content },\n ]);\n saveSessionState(id, \"contributions\", updatedContributions);\n setContributions(updatedContributions);\n },\n [contributions, id, saveSessionState]\n );\n\n const clearContributions = useCallback(() => {\n purgeSessionState(id, \"contributions\");\n setContributions([]);\n }, [id, purgeSessionState]);\n\n const handleRemove = useCallback(() => {\n const ds = loadSessionState(id, \"data-source\") as DataSource;\n if (ds) {\n ds.unsubscribe();\n }\n purgeSessionState(id);\n purgeState(id);\n dispatchLayoutAction({ type: \"remove\", path: viewPath });\n }, [\n dispatchLayoutAction,\n id,\n loadSessionState,\n purgeSessionState,\n purgeState,\n viewPath,\n ]);\n\n const handleMouseDown = useCallback(\n async (evt, index, preDragActivity): Promise<boolean> => {\n evt.stopPropagation();\n const dragRect = root.current?.getBoundingClientRect();\n return new Promise((resolve, reject) => {\n dispatchLayoutAction({\n type: \"drag-start\",\n evt,\n path: index === undefined ? viewPath : `${viewPath}.${index}`,\n dragRect,\n preDragActivity,\n dropTargets,\n resolveDragStart: resolve,\n rejectDragStart: reject,\n } as DragStartAction);\n });\n },\n [root, dispatchLayoutAction, viewPath, dropTargets]\n );\n\n const dispatchAction = useCallback(\n async <A extends ViewAction = ViewAction>(\n action: A,\n evt?: SyntheticEvent\n ): Promise<boolean | QueryReponse | void> => {\n const { type } = action;\n switch (type) {\n case \"maximize\":\n case \"minimize\":\n case \"restore\":\n return dispatchLayoutAction({ type, path: action.path ?? viewPath });\n case \"remove\":\n return handleRemove();\n case \"mousedown\":\n return handleMouseDown(evt, action.index, action.preDragActivity);\n case \"add-toolbar-contribution\":\n return updateContributions(action.location, action.content);\n case \"remove-toolbar-contribution\":\n return clearContributions();\n case \"query\":\n return dispatchLayoutAction({\n type,\n path: action.path,\n query: action.query,\n });\n return;\n default: {\n return undefined;\n }\n }\n },\n [\n dispatchLayoutAction,\n viewPath,\n handleRemove,\n handleMouseDown,\n updateContributions,\n clearContributions,\n ]\n );\n\n return [dispatchAction, contributions];\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ .vuuPalette {
2
+ --vuuList-borderStyle: none;
3
+ }
4
+
5
+ .vuuPalette-horizontal {
6
+ align-items: center;
7
+ display: flex;
8
+ }
9
+
10
+ .vuuPaletteItem {
11
+ --vuu-icon-color: var(--salt-content-primary-foreground);
12
+ --vuu-icon-left: 0;
13
+ --vuu-icon-size: 16px;
14
+ --vuu-icon-top: 11px;
15
+ --list-item-text-padding: 0 0 0 calc(var(--salt-size-unit) * 3);
16
+ border-bottom: solid 1px var(--salt-separable-tertiary-borderColor);
17
+ padding-left: 12px;
18
+ font-size: 12px;
19
+ font-weight: 600;
20
+ }
21
+
22
+ .vuuSimpleDraggableWrapper > .vuuPaletteItem {
23
+ --vuu-icon-color: var(--salt-selectable-foreground);
24
+
25
+ }
26
+
27
+ .salt-theme .vuuPaletteItem {
28
+ font-size: 11px;
29
+ font-weight: normal;
30
+
31
+ }
32
+
33
+