@vuu-ui/vuu-layout 0.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +1 -0
- package/cjs/Component.js +14 -0
- package/cjs/Component.js.map +1 -0
- package/cjs/DraggableLayout.css.js +6 -0
- package/cjs/DraggableLayout.css.js.map +1 -0
- package/cjs/DraggableLayout.js +33 -0
- package/cjs/DraggableLayout.js.map +1 -0
- package/cjs/dock-layout/DockLayout.css.js +6 -0
- package/cjs/dock-layout/DockLayout.css.js.map +1 -0
- package/cjs/dock-layout/DockLayout.js +36 -0
- package/cjs/dock-layout/DockLayout.js.map +1 -0
- package/cjs/dock-layout/Drawer.css.js +6 -0
- package/cjs/dock-layout/Drawer.css.js.map +1 -0
- package/cjs/dock-layout/Drawer.js +96 -0
- package/cjs/dock-layout/Drawer.js.map +1 -0
- package/cjs/drag-drop/BoxModel.js +422 -0
- package/cjs/drag-drop/BoxModel.js.map +1 -0
- package/cjs/drag-drop/DragState.js +154 -0
- package/cjs/drag-drop/DragState.js.map +1 -0
- package/cjs/drag-drop/Draggable.js +192 -0
- package/cjs/drag-drop/Draggable.js.map +1 -0
- package/cjs/drag-drop/DropMenu.css.js +6 -0
- package/cjs/drag-drop/DropMenu.css.js.map +1 -0
- package/cjs/drag-drop/DropMenu.js +55 -0
- package/cjs/drag-drop/DropMenu.js.map +1 -0
- package/cjs/drag-drop/DropTarget.js +244 -0
- package/cjs/drag-drop/DropTarget.js.map +1 -0
- package/cjs/drag-drop/DropTargetRenderer.js +244 -0
- package/cjs/drag-drop/DropTargetRenderer.js.map +1 -0
- package/cjs/flexbox/Flexbox.css.js +6 -0
- package/cjs/flexbox/Flexbox.css.js.map +1 -0
- package/cjs/flexbox/Flexbox.js +70 -0
- package/cjs/flexbox/Flexbox.js.map +1 -0
- package/cjs/flexbox/FlexboxLayout.js +30 -0
- package/cjs/flexbox/FlexboxLayout.js.map +1 -0
- package/cjs/flexbox/FluidGrid.css.js +6 -0
- package/cjs/flexbox/FluidGrid.css.js.map +1 -0
- package/cjs/flexbox/FluidGrid.js +87 -0
- package/cjs/flexbox/FluidGrid.js.map +1 -0
- package/cjs/flexbox/FluidGridLayout.js +14 -0
- package/cjs/flexbox/FluidGridLayout.js.map +1 -0
- package/cjs/flexbox/Splitter.css.js +6 -0
- package/cjs/flexbox/Splitter.css.js.map +1 -0
- package/cjs/flexbox/Splitter.js +122 -0
- package/cjs/flexbox/Splitter.js.map +1 -0
- package/cjs/flexbox/flexbox-utils.js +109 -0
- package/cjs/flexbox/flexbox-utils.js.map +1 -0
- package/cjs/flexbox/useResponsiveSizing.js +62 -0
- package/cjs/flexbox/useResponsiveSizing.js.map +1 -0
- package/cjs/flexbox/useSplitterResizing.js +209 -0
- package/cjs/flexbox/useSplitterResizing.js.map +1 -0
- package/cjs/index.js +133 -0
- package/cjs/index.js.map +1 -0
- package/cjs/layout-action.js +27 -0
- package/cjs/layout-action.js.map +1 -0
- package/cjs/layout-header/Header.css.js +6 -0
- package/cjs/layout-header/Header.css.js.map +1 -0
- package/cjs/layout-header/Header.js +131 -0
- package/cjs/layout-header/Header.js.map +1 -0
- package/cjs/layout-provider/LayoutProvider.js +178 -0
- package/cjs/layout-provider/LayoutProvider.js.map +1 -0
- package/cjs/layout-provider/LayoutProviderContext.js +14 -0
- package/cjs/layout-provider/LayoutProviderContext.js.map +1 -0
- package/cjs/layout-provider/useLayoutDragDrop.js +172 -0
- package/cjs/layout-provider/useLayoutDragDrop.js.map +1 -0
- package/cjs/layout-reducer/flexUtils.js +219 -0
- package/cjs/layout-reducer/flexUtils.js.map +1 -0
- package/cjs/layout-reducer/insert-layout-element.js +273 -0
- package/cjs/layout-reducer/insert-layout-element.js.map +1 -0
- package/cjs/layout-reducer/layout-reducer.js +198 -0
- package/cjs/layout-reducer/layout-reducer.js.map +1 -0
- package/cjs/layout-reducer/layoutTypes.js +41 -0
- package/cjs/layout-reducer/layoutTypes.js.map +1 -0
- package/cjs/layout-reducer/layoutUtils.js +226 -0
- package/cjs/layout-reducer/layoutUtils.js.map +1 -0
- package/cjs/layout-reducer/move-layout-element.js +31 -0
- package/cjs/layout-reducer/move-layout-element.js.map +1 -0
- package/cjs/layout-reducer/remove-layout-element.js +223 -0
- package/cjs/layout-reducer/remove-layout-element.js.map +1 -0
- package/cjs/layout-reducer/replace-layout-element.js +91 -0
- package/cjs/layout-reducer/replace-layout-element.js.map +1 -0
- package/cjs/layout-reducer/resize-flex-children.js +61 -0
- package/cjs/layout-reducer/resize-flex-children.js.map +1 -0
- package/cjs/layout-reducer/wrap-layout-element.js +212 -0
- package/cjs/layout-reducer/wrap-layout-element.js.map +1 -0
- package/cjs/layout-view/View.css.js +6 -0
- package/cjs/layout-view/View.css.js.map +1 -0
- package/cjs/layout-view/View.js +164 -0
- package/cjs/layout-view/View.js.map +1 -0
- package/cjs/layout-view/useView.js +92 -0
- package/cjs/layout-view/useView.js.map +1 -0
- package/cjs/layout-view/useViewResize.js +42 -0
- package/cjs/layout-view/useViewResize.js.map +1 -0
- package/cjs/layout-view-actions/ViewContext.js +16 -0
- package/cjs/layout-view-actions/ViewContext.js.map +1 -0
- package/cjs/layout-view-actions/useViewActionDispatcher.js +103 -0
- package/cjs/layout-view-actions/useViewActionDispatcher.js.map +1 -0
- package/cjs/palette/Palette.css.js +6 -0
- package/cjs/palette/Palette.css.js.map +1 -0
- package/cjs/palette/Palette.js +127 -0
- package/cjs/palette/Palette.js.map +1 -0
- package/cjs/placeholder/LayoutStartPanel.css.js +6 -0
- package/cjs/placeholder/LayoutStartPanel.css.js.map +1 -0
- package/cjs/placeholder/LayoutStartPanel.js +60 -0
- package/cjs/placeholder/LayoutStartPanel.js.map +1 -0
- package/cjs/placeholder/Placeholder.css.js +6 -0
- package/cjs/placeholder/Placeholder.css.js.map +1 -0
- package/cjs/placeholder/Placeholder.js +34 -0
- package/cjs/placeholder/Placeholder.js.map +1 -0
- package/cjs/registry/ComponentRegistry.js +27 -0
- package/cjs/registry/ComponentRegistry.js.map +1 -0
- package/cjs/responsive/breakpoints.js +36 -0
- package/cjs/responsive/breakpoints.js.map +1 -0
- package/cjs/responsive/use-breakpoints.js +76 -0
- package/cjs/responsive/use-breakpoints.js.map +1 -0
- package/cjs/responsive/useResizeObserver.js +118 -0
- package/cjs/responsive/useResizeObserver.js.map +1 -0
- package/cjs/responsive/utils.js +34 -0
- package/cjs/responsive/utils.js.map +1 -0
- package/cjs/stack/Stack.css.js +6 -0
- package/cjs/stack/Stack.css.js.map +1 -0
- package/cjs/stack/Stack.js +148 -0
- package/cjs/stack/Stack.js.map +1 -0
- package/cjs/stack/StackLayout.js +122 -0
- package/cjs/stack/StackLayout.js.map +1 -0
- package/cjs/use-persistent-state.js +109 -0
- package/cjs/use-persistent-state.js.map +1 -0
- package/cjs/utils/pathUtils.js +293 -0
- package/cjs/utils/pathUtils.js.map +1 -0
- package/cjs/utils/propUtils.js +27 -0
- package/cjs/utils/propUtils.js.map +1 -0
- package/cjs/utils/refUtils.js +12 -0
- package/cjs/utils/refUtils.js.map +1 -0
- package/cjs/utils/styleUtils.js +15 -0
- package/cjs/utils/styleUtils.js.map +1 -0
- package/cjs/utils/typeOf.js +27 -0
- package/cjs/utils/typeOf.js.map +1 -0
- package/esm/Component.js +12 -0
- package/esm/Component.js.map +1 -0
- package/esm/DraggableLayout.css.js +4 -0
- package/esm/DraggableLayout.css.js.map +1 -0
- package/esm/DraggableLayout.js +31 -0
- package/esm/DraggableLayout.js.map +1 -0
- package/esm/dock-layout/DockLayout.css.js +4 -0
- package/esm/dock-layout/DockLayout.css.js.map +1 -0
- package/esm/dock-layout/DockLayout.js +34 -0
- package/esm/dock-layout/DockLayout.js.map +1 -0
- package/esm/dock-layout/Drawer.css.js +4 -0
- package/esm/dock-layout/Drawer.css.js.map +1 -0
- package/esm/dock-layout/Drawer.js +94 -0
- package/esm/dock-layout/Drawer.js.map +1 -0
- package/esm/drag-drop/BoxModel.js +415 -0
- package/esm/drag-drop/BoxModel.js.map +1 -0
- package/esm/drag-drop/DragState.js +152 -0
- package/esm/drag-drop/DragState.js.map +1 -0
- package/esm/drag-drop/Draggable.js +190 -0
- package/esm/drag-drop/Draggable.js.map +1 -0
- package/esm/drag-drop/DropMenu.css.js +4 -0
- package/esm/drag-drop/DropMenu.css.js.map +1 -0
- package/esm/drag-drop/DropMenu.js +52 -0
- package/esm/drag-drop/DropMenu.js.map +1 -0
- package/esm/drag-drop/DropTarget.js +240 -0
- package/esm/drag-drop/DropTarget.js.map +1 -0
- package/esm/drag-drop/DropTargetRenderer.js +242 -0
- package/esm/drag-drop/DropTargetRenderer.js.map +1 -0
- package/esm/flexbox/Flexbox.css.js +4 -0
- package/esm/flexbox/Flexbox.css.js.map +1 -0
- package/esm/flexbox/Flexbox.js +68 -0
- package/esm/flexbox/Flexbox.js.map +1 -0
- package/esm/flexbox/FlexboxLayout.js +28 -0
- package/esm/flexbox/FlexboxLayout.js.map +1 -0
- package/esm/flexbox/FluidGrid.css.js +4 -0
- package/esm/flexbox/FluidGrid.css.js.map +1 -0
- package/esm/flexbox/FluidGrid.js +85 -0
- package/esm/flexbox/FluidGrid.js.map +1 -0
- package/esm/flexbox/FluidGridLayout.js +12 -0
- package/esm/flexbox/FluidGridLayout.js.map +1 -0
- package/esm/flexbox/Splitter.css.js +4 -0
- package/esm/flexbox/Splitter.css.js.map +1 -0
- package/esm/flexbox/Splitter.js +120 -0
- package/esm/flexbox/Splitter.js.map +1 -0
- package/esm/flexbox/flexbox-utils.js +103 -0
- package/esm/flexbox/flexbox-utils.js.map +1 -0
- package/esm/flexbox/useResponsiveSizing.js +60 -0
- package/esm/flexbox/useResponsiveSizing.js.map +1 -0
- package/esm/flexbox/useSplitterResizing.js +207 -0
- package/esm/flexbox/useSplitterResizing.js.map +1 -0
- package/esm/index.js +37 -0
- package/esm/index.js.map +1 -0
- package/esm/layout-action.js +25 -0
- package/esm/layout-action.js.map +1 -0
- package/esm/layout-header/Header.css.js +4 -0
- package/esm/layout-header/Header.css.js.map +1 -0
- package/esm/layout-header/Header.js +129 -0
- package/esm/layout-header/Header.js.map +1 -0
- package/esm/layout-provider/LayoutProvider.js +172 -0
- package/esm/layout-provider/LayoutProvider.js.map +1 -0
- package/esm/layout-provider/LayoutProviderContext.js +12 -0
- package/esm/layout-provider/LayoutProviderContext.js.map +1 -0
- package/esm/layout-provider/useLayoutDragDrop.js +170 -0
- package/esm/layout-provider/useLayoutDragDrop.js.map +1 -0
- package/esm/layout-reducer/flexUtils.js +210 -0
- package/esm/layout-reducer/flexUtils.js.map +1 -0
- package/esm/layout-reducer/insert-layout-element.js +269 -0
- package/esm/layout-reducer/insert-layout-element.js.map +1 -0
- package/esm/layout-reducer/layout-reducer.js +196 -0
- package/esm/layout-reducer/layout-reducer.js.map +1 -0
- package/esm/layout-reducer/layoutTypes.js +37 -0
- package/esm/layout-reducer/layoutTypes.js.map +1 -0
- package/esm/layout-reducer/layoutUtils.js +215 -0
- package/esm/layout-reducer/layoutUtils.js.map +1 -0
- package/esm/layout-reducer/move-layout-element.js +29 -0
- package/esm/layout-reducer/move-layout-element.js.map +1 -0
- package/esm/layout-reducer/remove-layout-element.js +221 -0
- package/esm/layout-reducer/remove-layout-element.js.map +1 -0
- package/esm/layout-reducer/replace-layout-element.js +87 -0
- package/esm/layout-reducer/replace-layout-element.js.map +1 -0
- package/esm/layout-reducer/resize-flex-children.js +58 -0
- package/esm/layout-reducer/resize-flex-children.js.map +1 -0
- package/esm/layout-reducer/wrap-layout-element.js +210 -0
- package/esm/layout-reducer/wrap-layout-element.js.map +1 -0
- package/esm/layout-view/View.css.js +4 -0
- package/esm/layout-view/View.css.js.map +1 -0
- package/esm/layout-view/View.js +162 -0
- package/esm/layout-view/View.js.map +1 -0
- package/esm/layout-view/useView.js +90 -0
- package/esm/layout-view/useView.js.map +1 -0
- package/esm/layout-view/useViewResize.js +40 -0
- package/esm/layout-view/useViewResize.js.map +1 -0
- package/esm/layout-view-actions/ViewContext.js +12 -0
- package/esm/layout-view-actions/ViewContext.js.map +1 -0
- package/esm/layout-view-actions/useViewActionDispatcher.js +101 -0
- package/esm/layout-view-actions/useViewActionDispatcher.js.map +1 -0
- package/esm/palette/Palette.css.js +4 -0
- package/esm/palette/Palette.css.js.map +1 -0
- package/esm/palette/Palette.js +124 -0
- package/esm/palette/Palette.js.map +1 -0
- package/esm/placeholder/LayoutStartPanel.css.js +4 -0
- package/esm/placeholder/LayoutStartPanel.css.js.map +1 -0
- package/esm/placeholder/LayoutStartPanel.js +58 -0
- package/esm/placeholder/LayoutStartPanel.js.map +1 -0
- package/esm/placeholder/Placeholder.css.js +4 -0
- package/esm/placeholder/Placeholder.css.js.map +1 -0
- package/esm/placeholder/Placeholder.js +32 -0
- package/esm/placeholder/Placeholder.js.map +1 -0
- package/esm/registry/ComponentRegistry.js +21 -0
- package/esm/registry/ComponentRegistry.js.map +1 -0
- package/esm/responsive/breakpoints.js +33 -0
- package/esm/responsive/breakpoints.js.map +1 -0
- package/esm/responsive/use-breakpoints.js +74 -0
- package/esm/responsive/use-breakpoints.js.map +1 -0
- package/esm/responsive/useResizeObserver.js +112 -0
- package/esm/responsive/useResizeObserver.js.map +1 -0
- package/esm/responsive/utils.js +31 -0
- package/esm/responsive/utils.js.map +1 -0
- package/esm/stack/Stack.css.js +4 -0
- package/esm/stack/Stack.css.js.map +1 -0
- package/esm/stack/Stack.js +146 -0
- package/esm/stack/Stack.js.map +1 -0
- package/esm/stack/StackLayout.js +120 -0
- package/esm/stack/StackLayout.js.map +1 -0
- package/esm/use-persistent-state.js +104 -0
- package/esm/use-persistent-state.js.map +1 -0
- package/esm/utils/pathUtils.js +280 -0
- package/esm/utils/pathUtils.js.map +1 -0
- package/esm/utils/propUtils.js +23 -0
- package/esm/utils/propUtils.js.map +1 -0
- package/esm/utils/refUtils.js +10 -0
- package/esm/utils/refUtils.js.map +1 -0
- package/esm/utils/styleUtils.js +13 -0
- package/esm/utils/styleUtils.js.map +1 -0
- package/esm/utils/typeOf.js +23 -0
- package/esm/utils/typeOf.js.map +1 -0
- package/package.json +43 -0
- package/types/Component.d.ts +7 -0
- package/types/DraggableLayout.d.ts +6 -0
- package/types/debug.d.ts +2 -0
- package/types/dock-layout/DockLayout.d.ts +9 -0
- package/types/dock-layout/Drawer.d.ts +17 -0
- package/types/dock-layout/index.d.ts +2 -0
- package/types/drag-drop/BoxModel.d.ts +143 -0
- package/types/drag-drop/DragState.d.ts +46 -0
- package/types/drag-drop/Draggable.d.ts +24 -0
- package/types/drag-drop/DropMenu.d.ts +9 -0
- package/types/drag-drop/DropTarget.d.ts +61 -0
- package/types/drag-drop/DropTargetRenderer.d.ts +17 -0
- package/types/drag-drop/dragDropTypes.d.ts +51 -0
- package/types/drag-drop/index.d.ts +4 -0
- package/types/flexbox/Flexbox.d.ts +4 -0
- package/types/flexbox/FlexboxLayout.d.ts +6 -0
- package/types/flexbox/FluidGrid.d.ts +6 -0
- package/types/flexbox/FluidGridLayout.d.ts +6 -0
- package/types/flexbox/Splitter.d.ts +12 -0
- package/types/flexbox/flexbox-utils.d.ts +12 -0
- package/types/flexbox/flexboxTypes.d.ts +51 -0
- package/types/flexbox/index.d.ts +4 -0
- package/types/flexbox/useResponsiveSizing.d.ts +10 -0
- package/types/flexbox/useSplitterResizing.d.ts +2 -0
- package/types/index.d.ts +18 -0
- package/types/layout-action.d.ts +22 -0
- package/types/layout-header/ActionButton.d.ts +8 -0
- package/types/layout-header/Header.d.ts +12 -0
- package/types/layout-header/index.d.ts +1 -0
- package/types/layout-provider/LayoutProvider.d.ts +15 -0
- package/types/layout-provider/LayoutProviderContext.d.ts +9 -0
- package/types/layout-provider/index.d.ts +2 -0
- package/types/layout-provider/useLayoutDragDrop.d.ts +4 -0
- package/types/layout-reducer/flexUtils.d.ts +22 -0
- package/types/layout-reducer/index.d.ts +4 -0
- package/types/layout-reducer/insert-layout-element.d.ts +8 -0
- package/types/layout-reducer/layout-reducer.d.ts +3 -0
- package/types/layout-reducer/layoutTypes.d.ts +193 -0
- package/types/layout-reducer/layoutUtils.d.ts +38 -0
- package/types/layout-reducer/move-layout-element.d.ts +3 -0
- package/types/layout-reducer/remove-layout-element.d.ts +3 -0
- package/types/layout-reducer/replace-layout-element.d.ts +6 -0
- package/types/layout-reducer/resize-flex-children.d.ts +4 -0
- package/types/layout-reducer/wrap-layout-element.d.ts +9 -0
- package/types/layout-view/View.d.ts +10 -0
- package/types/layout-view/index.d.ts +2 -0
- package/types/layout-view/useView.d.ts +21 -0
- package/types/layout-view/useViewResize.d.ts +7 -0
- package/types/layout-view/viewTypes.d.ts +21 -0
- package/types/layout-view-actions/ViewContext.d.ts +33 -0
- package/types/layout-view-actions/index.d.ts +2 -0
- package/types/layout-view-actions/useViewActionDispatcher.d.ts +9 -0
- package/types/palette/Palette.d.ts +21 -0
- package/types/palette/index.d.ts +1 -0
- package/types/placeholder/LayoutStartPanel.d.ts +5 -0
- package/types/placeholder/Placeholder.d.ts +17 -0
- package/types/placeholder/index.d.ts +1 -0
- package/types/registry/ComponentRegistry.d.ts +13 -0
- package/types/registry/index.d.ts +1 -0
- package/types/responsive/breakpoints.d.ts +4 -0
- package/types/responsive/index.d.ts +3 -0
- package/types/responsive/measureMinimumNodeSize.d.ts +1 -0
- package/types/responsive/overflowUtils.d.ts +2 -0
- package/types/responsive/use-breakpoints.d.ts +7 -0
- package/types/responsive/useResizeObserver.d.ts +13 -0
- package/types/responsive/utils.d.ts +6 -0
- package/types/stack/Stack.d.ts +3 -0
- package/types/stack/StackLayout.d.ts +6 -0
- package/types/stack/index.d.ts +3 -0
- package/types/stack/stackTypes.d.ts +22 -0
- package/types/tabs/TabPanel.d.ts +7 -0
- package/types/tabs/index.d.ts +1 -0
- package/types/tools/config-wrapper/ConfigWrapper.d.ts +2 -0
- package/types/tools/config-wrapper/index.d.ts +1 -0
- package/types/tools/devtools-box/layout-configurator.d.ts +31 -0
- package/types/tools/devtools-tree/layout-tree-viewer.d.ts +5 -0
- package/types/tools/index.d.ts +3 -0
- package/types/use-persistent-state.d.ts +11 -0
- package/types/utils/index.d.ts +5 -0
- package/types/utils/pathUtils.d.ts +31 -0
- package/types/utils/propUtils.d.ts +5 -0
- package/types/utils/refUtils.d.ts +2 -0
- package/types/utils/styleUtils.d.ts +3 -0
- package/types/utils/typeOf.d.ts +5 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
const WidthHeight = ["height", "width"];
|
|
6
|
+
const HeightOnly = ["height"];
|
|
7
|
+
const WidthOnly = ["width"];
|
|
8
|
+
const observedMap = /* @__PURE__ */ new WeakMap();
|
|
9
|
+
const getTargetSize = (element, contentRect, dimension) => {
|
|
10
|
+
switch (dimension) {
|
|
11
|
+
case "height":
|
|
12
|
+
return contentRect.height;
|
|
13
|
+
case "scrollHeight":
|
|
14
|
+
return element.scrollHeight;
|
|
15
|
+
case "scrollWidth":
|
|
16
|
+
return element.scrollWidth;
|
|
17
|
+
case "width":
|
|
18
|
+
return contentRect.width;
|
|
19
|
+
default:
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const resizeObserver = new ResizeObserver(
|
|
24
|
+
(entries) => {
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
const { target, contentRect } = entry;
|
|
27
|
+
const observedTarget = observedMap.get(target);
|
|
28
|
+
if (observedTarget) {
|
|
29
|
+
const { onResize, measurements } = observedTarget;
|
|
30
|
+
let sizeChanged = false;
|
|
31
|
+
for (const [dimension, size] of Object.entries(measurements)) {
|
|
32
|
+
const newSize = getTargetSize(
|
|
33
|
+
target,
|
|
34
|
+
contentRect,
|
|
35
|
+
dimension
|
|
36
|
+
);
|
|
37
|
+
if (newSize !== size) {
|
|
38
|
+
sizeChanged = true;
|
|
39
|
+
measurements[dimension] = newSize;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (sizeChanged) {
|
|
43
|
+
onResize && onResize(measurements);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
function useResizeObserver(ref, dimensions, onResize, reportInitialSize = false) {
|
|
50
|
+
const dimensionsRef = React.useRef(dimensions);
|
|
51
|
+
const measure = React.useCallback((target) => {
|
|
52
|
+
const rect = target.getBoundingClientRect();
|
|
53
|
+
return dimensionsRef.current.reduce(
|
|
54
|
+
(map, dim) => {
|
|
55
|
+
map[dim] = getTargetSize(target, rect, dim);
|
|
56
|
+
return map;
|
|
57
|
+
},
|
|
58
|
+
{}
|
|
59
|
+
);
|
|
60
|
+
}, []);
|
|
61
|
+
React.useLayoutEffect(() => {
|
|
62
|
+
const target = ref.current;
|
|
63
|
+
let cleanedUp = false;
|
|
64
|
+
async function registerObserver() {
|
|
65
|
+
observedMap.set(target, { measurements: {} });
|
|
66
|
+
cleanedUp = false;
|
|
67
|
+
const { fonts } = document;
|
|
68
|
+
if (fonts) {
|
|
69
|
+
await fonts.ready;
|
|
70
|
+
}
|
|
71
|
+
if (!cleanedUp) {
|
|
72
|
+
const observedTarget = observedMap.get(target);
|
|
73
|
+
if (observedTarget) {
|
|
74
|
+
const measurements = measure(target);
|
|
75
|
+
observedTarget.measurements = measurements;
|
|
76
|
+
resizeObserver.observe(target);
|
|
77
|
+
if (reportInitialSize) {
|
|
78
|
+
onResize(measurements);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (target) {
|
|
84
|
+
if (observedMap.has(target)) {
|
|
85
|
+
throw Error(
|
|
86
|
+
"useResizeObserver attemping to observe same element twice"
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
void registerObserver();
|
|
90
|
+
}
|
|
91
|
+
return () => {
|
|
92
|
+
if (target && observedMap.has(target)) {
|
|
93
|
+
resizeObserver.unobserve(target);
|
|
94
|
+
observedMap.delete(target);
|
|
95
|
+
cleanedUp = true;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}, [ref, measure, reportInitialSize, onResize]);
|
|
99
|
+
React.useLayoutEffect(() => {
|
|
100
|
+
const target = ref.current;
|
|
101
|
+
const record = observedMap.get(target);
|
|
102
|
+
if (record) {
|
|
103
|
+
if (dimensionsRef.current !== dimensions) {
|
|
104
|
+
dimensionsRef.current = dimensions;
|
|
105
|
+
const measurements = measure(target);
|
|
106
|
+
record.measurements = measurements;
|
|
107
|
+
}
|
|
108
|
+
record.onResize = onResize;
|
|
109
|
+
}
|
|
110
|
+
}, [dimensions, measure, ref, onResize]);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
exports.HeightOnly = HeightOnly;
|
|
114
|
+
exports.WidthHeight = WidthHeight;
|
|
115
|
+
exports.WidthOnly = WidthOnly;
|
|
116
|
+
exports.resizeObserver = resizeObserver;
|
|
117
|
+
exports.useResizeObserver = useResizeObserver;
|
|
118
|
+
//# sourceMappingURL=useResizeObserver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useResizeObserver.js","sources":["../../src/responsive/useResizeObserver.ts"],"sourcesContent":["/* eslint-disable no-restricted-syntax */\nimport { useCallback, useLayoutEffect, useRef, RefObject } from \"react\";\nexport const WidthHeight = [\"height\", \"width\"];\nexport const HeightOnly = [\"height\"];\nexport const WidthOnly = [\"width\"];\n\nexport type measurements<T = string | number> = {\n height?: T;\n scrollHeight?: T;\n scrollWidth?: T;\n width?: T;\n};\ntype measuredDimension = keyof measurements<number>;\n\nexport type ResizeHandler = (measurements: measurements<number>) => void;\n\ntype observedDetails = {\n onResize?: ResizeHandler;\n measurements: measurements<number>;\n};\nconst observedMap = new WeakMap<HTMLElement, observedDetails>();\n\nconst getTargetSize = (\n element: HTMLElement,\n contentRect: DOMRectReadOnly,\n dimension: measuredDimension\n): number => {\n switch (dimension) {\n case \"height\":\n return contentRect.height;\n case \"scrollHeight\":\n return element.scrollHeight;\n case \"scrollWidth\":\n return element.scrollWidth;\n case \"width\":\n return contentRect.width;\n default:\n return 0;\n }\n};\n\nexport const resizeObserver = new ResizeObserver(\n (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, contentRect } = entry;\n const observedTarget = observedMap.get(target as HTMLElement);\n if (observedTarget) {\n const { onResize, measurements } = observedTarget;\n let sizeChanged = false;\n for (const [dimension, size] of Object.entries(measurements)) {\n const newSize = getTargetSize(\n target as HTMLElement,\n contentRect,\n dimension as measuredDimension\n );\n if (newSize !== size) {\n sizeChanged = true;\n measurements[dimension as measuredDimension] = newSize;\n }\n }\n if (sizeChanged) {\n onResize && onResize(measurements);\n }\n }\n }\n }\n);\n\n// TODO use an optional lag (default to false) to ask to fire onResize\n// with initial size\n// Note asking for scrollHeight alone will not trigger onResize, this is only triggered by height,\n// with scrollHeight returned as an auxilliary value\nexport function useResizeObserver(\n ref: RefObject<Element | HTMLElement | null>,\n dimensions: string[],\n onResize: ResizeHandler,\n reportInitialSize = false\n): void {\n const dimensionsRef = useRef(dimensions);\n const measure = useCallback((target: HTMLElement): measurements<number> => {\n const rect = target.getBoundingClientRect();\n return dimensionsRef.current.reduce(\n (map: { [key: string]: number }, dim) => {\n map[dim] = getTargetSize(target, rect, dim as measuredDimension);\n return map;\n },\n {}\n );\n }, []);\n\n // TODO use ref to store resizeHandler here\n // resize handler registered with REsizeObserver will never change\n // use ref to store user onResize callback here\n // resizeHandler will call user callback.current\n\n // Keep this effect separate in case user inadvertently passes different\n // dimensions or callback instance each time - we only ever want to\n // initiate new observation when ref changes.\n useLayoutEffect(() => {\n const target = ref.current as HTMLElement;\n let cleanedUp = false;\n\n async function registerObserver() {\n // Create the map entry immediately. useEffect may fire below\n // before fonts are ready and attempt to update entry\n observedMap.set(target, { measurements: {} as measurements<number> });\n cleanedUp = false;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { fonts } = document as any;\n if (fonts) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n await fonts.ready;\n }\n if (!cleanedUp) {\n const observedTarget = observedMap.get(target);\n if (observedTarget) {\n const measurements = measure(target);\n observedTarget.measurements = measurements;\n resizeObserver.observe(target);\n if (reportInitialSize) {\n onResize(measurements);\n }\n }\n }\n }\n\n if (target) {\n // TODO might we want multiple callers to attach a listener to the same element ?\n if (observedMap.has(target)) {\n throw Error(\n \"useResizeObserver attemping to observe same element twice\"\n );\n }\n void registerObserver();\n }\n return () => {\n if (target && observedMap.has(target)) {\n resizeObserver.unobserve(target);\n observedMap.delete(target);\n cleanedUp = true;\n }\n };\n }, [ref, measure, reportInitialSize, onResize]);\n\n useLayoutEffect(() => {\n const target = ref.current as HTMLElement;\n const record = observedMap.get(target);\n if (record) {\n if (dimensionsRef.current !== dimensions) {\n dimensionsRef.current = dimensions;\n const measurements = measure(target);\n record.measurements = measurements;\n }\n // Might not have changed, but no harm ...\n record.onResize = onResize;\n }\n }, [dimensions, measure, ref, onResize]);\n\n // TODO might be a good idea to ref and return the current measurememnts. That way, derived hooks\n // e.g useBreakpoints don't have to measure and client cn make onResize callback simpler\n}\n"],"names":["useRef","useCallback","useLayoutEffect"],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const COLLAPSIBLE = "data-collapsible";
|
|
4
|
+
const RESPONSIVE_ATTRIBUTE = {
|
|
5
|
+
[COLLAPSIBLE]: true,
|
|
6
|
+
"data-pad-start": true,
|
|
7
|
+
"data-pad-end": true
|
|
8
|
+
};
|
|
9
|
+
const isResponsiveAttribute = (propName) => RESPONSIVE_ATTRIBUTE[propName] ?? false;
|
|
10
|
+
const isCollapsible = (propName) => propName === COLLAPSIBLE;
|
|
11
|
+
const COLLAPSIBLE_VALUE = {
|
|
12
|
+
dynamic: "dynamic",
|
|
13
|
+
instant: "instant",
|
|
14
|
+
true: "instant"
|
|
15
|
+
};
|
|
16
|
+
const collapsibleValue = (value) => COLLAPSIBLE_VALUE[value] ?? "none";
|
|
17
|
+
const extractResponsiveProps = (props) => {
|
|
18
|
+
return Object.keys(props).reduce(
|
|
19
|
+
(result, propName) => {
|
|
20
|
+
const [toolbarProps, rest] = result;
|
|
21
|
+
if (isResponsiveAttribute(propName)) {
|
|
22
|
+
const value = isCollapsible(propName) ? collapsibleValue(props[propName]) : props[propName];
|
|
23
|
+
toolbarProps[propName] = value;
|
|
24
|
+
rest[propName] = void 0;
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
},
|
|
28
|
+
[{}, {}]
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
exports.extractResponsiveProps = extractResponsiveProps;
|
|
33
|
+
exports.isResponsiveAttribute = isResponsiveAttribute;
|
|
34
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../src/responsive/utils.ts"],"sourcesContent":["const COLLAPSIBLE = 'data-collapsible';\n\nconst RESPONSIVE_ATTRIBUTE: { [key: string]: boolean } = {\n [COLLAPSIBLE]: true,\n 'data-pad-start': true,\n 'data-pad-end': true\n};\n\nexport const isResponsiveAttribute = (propName: string): boolean =>\n RESPONSIVE_ATTRIBUTE[propName] ?? false;\n\nconst isCollapsible = (propName: string) => propName === COLLAPSIBLE;\n\nconst COLLAPSIBLE_VALUE: { [key: string]: string } = {\n dynamic: 'dynamic',\n instant: 'instant',\n true: 'instant'\n};\n\nconst collapsibleValue = (value: string) => COLLAPSIBLE_VALUE[value] ?? 'none';\n\ntype Props = { [key: string]: any };\nexport const extractResponsiveProps = (props: Props) => {\n return Object.keys(props).reduce<[Props, Props]>(\n (result, propName) => {\n const [toolbarProps, rest] = result;\n if (isResponsiveAttribute(propName)) {\n const value = isCollapsible(propName) ? collapsibleValue(props[propName]) : props[propName];\n\n toolbarProps[propName] = value;\n rest[propName] = undefined;\n }\n return result;\n },\n [{}, {}]\n );\n};\n"],"names":[],"mappings":";;AAAA,MAAM,WAAc,GAAA,kBAAA,CAAA;AAEpB,MAAM,oBAAmD,GAAA;AAAA,EACvD,CAAC,WAAW,GAAG,IAAA;AAAA,EACf,gBAAkB,EAAA,IAAA;AAAA,EAClB,cAAgB,EAAA,IAAA;AAClB,CAAA,CAAA;AAEO,MAAM,qBAAwB,GAAA,CAAC,QACpC,KAAA,oBAAA,CAAqB,QAAQ,CAAK,IAAA,MAAA;AAEpC,MAAM,aAAA,GAAgB,CAAC,QAAA,KAAqB,QAAa,KAAA,WAAA,CAAA;AAEzD,MAAM,iBAA+C,GAAA;AAAA,EACnD,OAAS,EAAA,SAAA;AAAA,EACT,OAAS,EAAA,SAAA;AAAA,EACT,IAAM,EAAA,SAAA;AACR,CAAA,CAAA;AAEA,MAAM,gBAAmB,GAAA,CAAC,KAAkB,KAAA,iBAAA,CAAkB,KAAK,CAAK,IAAA,MAAA,CAAA;AAG3D,MAAA,sBAAA,GAAyB,CAAC,KAAiB,KAAA;AACtD,EAAO,OAAA,MAAA,CAAO,IAAK,CAAA,KAAK,CAAE,CAAA,MAAA;AAAA,IACxB,CAAC,QAAQ,QAAa,KAAA;AACpB,MAAM,MAAA,CAAC,YAAc,EAAA,IAAI,CAAI,GAAA,MAAA,CAAA;AAC7B,MAAI,IAAA,qBAAA,CAAsB,QAAQ,CAAG,EAAA;AACnC,QAAM,MAAA,KAAA,GAAQ,aAAc,CAAA,QAAQ,CAAI,GAAA,gBAAA,CAAiB,MAAM,QAAQ,CAAC,CAAI,GAAA,KAAA,CAAM,QAAQ,CAAA,CAAA;AAE1F,QAAA,YAAA,CAAa,QAAQ,CAAI,GAAA,KAAA,CAAA;AACzB,QAAA,IAAA,CAAK,QAAQ,CAAI,GAAA,KAAA,CAAA,CAAA;AAAA,OACnB;AACA,MAAO,OAAA,MAAA,CAAA;AAAA,KACT;AAAA,IACA,CAAC,EAAI,EAAA,EAAE,CAAA;AAAA,GACT,CAAA;AACF;;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var stackCss = ".vuuTabs {\n display: flex;\n box-sizing: border-box;\n flex-direction: column;\n}\n\n.vuuTabs-horizontal {\n --vuu-tabs-border-style: none solid none none;\n flex-direction: row;\n}\n\n.vuuTabs .Toolbar:before {\n left: 0;\n width: 100%;\n bottom: 0;\n height: 1px;\n content: '';\n position: absolute;\n background: var(--grey60);\n}\n\n.vuuTabs-tabPanel {\n display: flex;\n flex: 1; \n flex-direction: column;\n}\n\n.vuuTabs-tabPanel > * {\n flex: 1 1 auto;\n}\n\n.vuuTabHeader + .vuuView > .vuuHeader {\n height: 0;\n overflow: hidden;\n}\n\n.Layout-svg-button {\n --spacing-medium: 5px;\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = stackCss;
|
|
6
|
+
//# sourceMappingURL=Stack.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stack.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
|
|
5
|
+
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
6
|
+
var cx = require('clsx');
|
|
7
|
+
var styles = require('@salt-ds/styles');
|
|
8
|
+
var window = require('@salt-ds/window');
|
|
9
|
+
var React = require('react');
|
|
10
|
+
var layoutUtils = require('../layout-reducer/layoutUtils.js');
|
|
11
|
+
var Stack$1 = require('./Stack.css.js');
|
|
12
|
+
|
|
13
|
+
const classBase = "vuuTabs";
|
|
14
|
+
const getDefaultTabIcon = () => void 0;
|
|
15
|
+
const getChildElements = (children) => {
|
|
16
|
+
const elements = [];
|
|
17
|
+
React.Children.forEach(children, (child) => {
|
|
18
|
+
if (React.isValidElement(child)) {
|
|
19
|
+
elements.push(child);
|
|
20
|
+
} else {
|
|
21
|
+
console.warn(`Stack has unexpected child element type`);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
return elements;
|
|
25
|
+
};
|
|
26
|
+
const DefaultTabstripProps = {
|
|
27
|
+
allowAddTab: false,
|
|
28
|
+
allowCloseTab: false,
|
|
29
|
+
allowRenameTab: false
|
|
30
|
+
};
|
|
31
|
+
const Stack = React.forwardRef(function Stack2({
|
|
32
|
+
TabstripProps: TabstripProps2 = DefaultTabstripProps,
|
|
33
|
+
active = 0,
|
|
34
|
+
children,
|
|
35
|
+
className: classNameProp,
|
|
36
|
+
getTabIcon = getDefaultTabIcon,
|
|
37
|
+
getTabLabel = layoutUtils.getDefaultTabLabel,
|
|
38
|
+
id: idProp,
|
|
39
|
+
keyBoardActivation = "manual",
|
|
40
|
+
// onMouseDown,
|
|
41
|
+
onAddTab,
|
|
42
|
+
onMoveTab,
|
|
43
|
+
onTabClose,
|
|
44
|
+
onTabEdit,
|
|
45
|
+
onTabSelectionChanged,
|
|
46
|
+
showTabs = "top",
|
|
47
|
+
style
|
|
48
|
+
}, ref) {
|
|
49
|
+
const targetWindow = window.useWindow();
|
|
50
|
+
styles.useComponentCssInjection({
|
|
51
|
+
testId: "vuu-stack",
|
|
52
|
+
css: Stack$1,
|
|
53
|
+
window: targetWindow
|
|
54
|
+
});
|
|
55
|
+
const id = vuuUtils.useId(idProp);
|
|
56
|
+
const tabLabels = React.useRef([]);
|
|
57
|
+
const {
|
|
58
|
+
allowCloseTab,
|
|
59
|
+
allowRenameTab,
|
|
60
|
+
className: tabstripClassName
|
|
61
|
+
} = TabstripProps2;
|
|
62
|
+
const handleExitEditMode = React.useCallback(
|
|
63
|
+
(_oldText, newText, _allowDeactivation, tabIndex) => {
|
|
64
|
+
onTabEdit?.(tabIndex, newText);
|
|
65
|
+
},
|
|
66
|
+
[onTabEdit]
|
|
67
|
+
);
|
|
68
|
+
const activeChild = () => {
|
|
69
|
+
if (React.isValidElement(children)) {
|
|
70
|
+
return children;
|
|
71
|
+
}
|
|
72
|
+
if (Array.isArray(children)) {
|
|
73
|
+
return children[active] ?? null;
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
};
|
|
77
|
+
const renderTabs = () => getChildElements(children).map((child2, idx) => {
|
|
78
|
+
const {
|
|
79
|
+
closeable = allowCloseTab,
|
|
80
|
+
id: childId = `${id}-${idx}`,
|
|
81
|
+
"data-tab-location": tabLocation
|
|
82
|
+
} = child2.props;
|
|
83
|
+
const label = getTabLabel(child2, idx, tabLabels.current);
|
|
84
|
+
tabLabels.current.push(label);
|
|
85
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
86
|
+
vuuUiControls.Tab,
|
|
87
|
+
{
|
|
88
|
+
ariaControls: childId,
|
|
89
|
+
"data-icon": getTabIcon(child2, idx),
|
|
90
|
+
id: `${childId}-tab`,
|
|
91
|
+
index: idx,
|
|
92
|
+
label,
|
|
93
|
+
location: tabLocation,
|
|
94
|
+
closeable,
|
|
95
|
+
editable: allowRenameTab
|
|
96
|
+
},
|
|
97
|
+
childId
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
const child = activeChild();
|
|
101
|
+
const isHorizontal = showTabs === "left" || showTabs === "right";
|
|
102
|
+
const tabstripOrientation = isHorizontal ? "vertical" : "horizontal";
|
|
103
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
104
|
+
"div",
|
|
105
|
+
{
|
|
106
|
+
className: cx(classBase, classNameProp, {
|
|
107
|
+
[`${classBase}-horizontal`]: isHorizontal
|
|
108
|
+
}),
|
|
109
|
+
style,
|
|
110
|
+
id,
|
|
111
|
+
ref,
|
|
112
|
+
children: [
|
|
113
|
+
showTabs ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
114
|
+
vuuUiControls.Tabstrip,
|
|
115
|
+
{
|
|
116
|
+
...TabstripProps2,
|
|
117
|
+
activeTabIndex: TabstripProps2?.activeTabIndex ?? (child === null ? -1 : active),
|
|
118
|
+
allowDragDrop: TabstripProps2.allowDragDrop !== false,
|
|
119
|
+
animateSelectionThumb: true,
|
|
120
|
+
className: cx("vuuTabHeader", tabstripClassName),
|
|
121
|
+
"aria-label": "data tabs",
|
|
122
|
+
keyBoardActivation,
|
|
123
|
+
onActiveChange: onTabSelectionChanged,
|
|
124
|
+
onAddTab,
|
|
125
|
+
onCloseTab: onTabClose,
|
|
126
|
+
onExitEditMode: handleExitEditMode,
|
|
127
|
+
onMoveTab,
|
|
128
|
+
orientation: tabstripOrientation,
|
|
129
|
+
children: renderTabs()
|
|
130
|
+
}
|
|
131
|
+
) : null,
|
|
132
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
133
|
+
"div",
|
|
134
|
+
{
|
|
135
|
+
"aria-labelledby": `${id}-${active}`,
|
|
136
|
+
className: `${classBase}-tabPanel`,
|
|
137
|
+
role: "tabpanel",
|
|
138
|
+
children: child
|
|
139
|
+
}
|
|
140
|
+
)
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
});
|
|
145
|
+
Stack.displayName = "Stack";
|
|
146
|
+
|
|
147
|
+
exports.Stack = Stack;
|
|
148
|
+
//# sourceMappingURL=Stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stack.js","sources":["../../src/stack/Stack.tsx"],"sourcesContent":["import { Tab, Tabstrip, TabstripProps } from \"@vuu-ui/vuu-ui-controls\";\nimport { useId } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport React, {\n ForwardedRef,\n forwardRef,\n ReactElement,\n ReactNode,\n useCallback,\n useRef,\n} from \"react\";\nimport { getDefaultTabLabel } from \"../layout-reducer\";\nimport { StackProps } from \"./stackTypes\";\n\nimport stackCss from \"./Stack.css\";\n\nconst classBase = \"vuuTabs\";\n\nconst getDefaultTabIcon = () => undefined;\n\nconst getChildElements = <T extends ReactElement = ReactElement>(\n children: ReactNode\n): T[] => {\n const elements: T[] = [];\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n elements.push(child as T);\n } else {\n console.warn(`Stack has unexpected child element type`);\n }\n });\n return elements;\n};\n\nconst DefaultTabstripProps: Partial<TabstripProps> = {\n allowAddTab: false,\n allowCloseTab: false,\n allowRenameTab: false,\n};\n\nexport const Stack = forwardRef(function Stack(\n {\n TabstripProps = DefaultTabstripProps,\n active = 0,\n children,\n className: classNameProp,\n getTabIcon = getDefaultTabIcon,\n getTabLabel = getDefaultTabLabel,\n id: idProp,\n keyBoardActivation = \"manual\",\n // onMouseDown,\n onAddTab,\n onMoveTab,\n onTabClose,\n onTabEdit,\n onTabSelectionChanged,\n showTabs = \"top\",\n style,\n }: StackProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-stack\",\n css: stackCss,\n window: targetWindow,\n });\n\n const id = useId(idProp);\n const tabLabels = useRef<string[]>([]);\n const {\n allowCloseTab,\n allowRenameTab,\n className: tabstripClassName,\n } = TabstripProps;\n\n const handleExitEditMode = useCallback(\n (\n _oldText: string,\n newText: string,\n _allowDeactivation: boolean,\n tabIndex: number\n ) => {\n onTabEdit?.(tabIndex, newText);\n },\n [onTabEdit]\n );\n\n const activeChild = () => {\n //TODO need to inject an id if child does not have one, so we can\n // establish the aria-controls relationship. In a Vuu layout, there\n // will always be an id.\n if (React.isValidElement(children)) {\n return children;\n }\n if (Array.isArray(children)) {\n return children[active] ?? null;\n }\n return null;\n };\n\n const renderTabs = () =>\n getChildElements(children).map((child, idx) => {\n const {\n closeable = allowCloseTab,\n id: childId = `${id}-${idx}`,\n \"data-tab-location\": tabLocation,\n } = child.props;\n const label = getTabLabel(child, idx, tabLabels.current);\n tabLabels.current.push(label);\n return (\n <Tab\n ariaControls={childId}\n data-icon={getTabIcon(child, idx)}\n key={childId}\n id={`${childId}-tab`}\n index={idx}\n label={label}\n location={tabLocation}\n closeable={closeable}\n editable={allowRenameTab}\n />\n );\n });\n\n const child = activeChild();\n const isHorizontal = showTabs === \"left\" || showTabs === \"right\";\n const tabstripOrientation = isHorizontal ? \"vertical\" : \"horizontal\";\n\n return (\n <div\n className={cx(classBase, classNameProp, {\n [`${classBase}-horizontal`]: isHorizontal,\n })}\n style={style}\n id={id}\n ref={ref}\n >\n {showTabs ? (\n <Tabstrip\n {...TabstripProps}\n activeTabIndex={\n TabstripProps?.activeTabIndex ?? (child === null ? -1 : active)\n }\n allowDragDrop={TabstripProps.allowDragDrop !== false}\n animateSelectionThumb\n className={cx(\"vuuTabHeader\", tabstripClassName)}\n aria-label=\"data tabs\"\n keyBoardActivation={keyBoardActivation}\n onActiveChange={onTabSelectionChanged}\n onAddTab={onAddTab}\n onCloseTab={onTabClose}\n onExitEditMode={handleExitEditMode}\n onMoveTab={onMoveTab}\n orientation={tabstripOrientation}\n >\n {renderTabs()}\n </Tabstrip>\n ) : null}\n <div\n aria-labelledby={`${id}-${active}`}\n className={`${classBase}-tabPanel`}\n role=\"tabpanel\"\n >\n {child}\n </div>\n </div>\n );\n});\nStack.displayName = \"Stack\";\n"],"names":["forwardRef","Stack","TabstripProps","getDefaultTabLabel","useWindow","useComponentCssInjection","stackCss","useId","useRef","useCallback","child","jsx","Tab","jsxs","Tabstrip"],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
5
|
+
var React = require('react');
|
|
6
|
+
var LayoutProvider = require('../layout-provider/LayoutProvider.js');
|
|
7
|
+
require('../layout-provider/LayoutProviderContext.js');
|
|
8
|
+
var useViewActionDispatcher = require('../layout-view-actions/useViewActionDispatcher.js');
|
|
9
|
+
require('../layout-view-actions/ViewContext.js');
|
|
10
|
+
var ComponentRegistry = require('../registry/ComponentRegistry.js');
|
|
11
|
+
var usePersistentState = require('../use-persistent-state.js');
|
|
12
|
+
var Stack = require('./Stack.js');
|
|
13
|
+
var layoutUtils = require('../layout-reducer/layoutUtils.js');
|
|
14
|
+
var Placeholder = require('../placeholder/Placeholder.js');
|
|
15
|
+
|
|
16
|
+
const defaultCreateNewChild = () => /* @__PURE__ */ jsxRuntime.jsx(
|
|
17
|
+
Placeholder.Placeholder,
|
|
18
|
+
{
|
|
19
|
+
resizeable: true,
|
|
20
|
+
style: { flexGrow: 1, flexShrink: 0, flexBasis: 0 }
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
const StackLayout = (props) => {
|
|
24
|
+
const ref = React.useRef(null);
|
|
25
|
+
const dispatch = LayoutProvider.useLayoutProviderDispatch();
|
|
26
|
+
const { loadState } = usePersistentState.usePersistentState();
|
|
27
|
+
const {
|
|
28
|
+
createNewChild: createNewChildProp,
|
|
29
|
+
id: idProp,
|
|
30
|
+
onTabSelectionChanged,
|
|
31
|
+
path,
|
|
32
|
+
...restProps
|
|
33
|
+
} = props;
|
|
34
|
+
const { children } = props;
|
|
35
|
+
const id = vuuUtils.useId(idProp);
|
|
36
|
+
const [dispatchViewAction] = useViewActionDispatcher.useViewActionDispatcher(id, ref, path);
|
|
37
|
+
const createNewChildFromContext = LayoutProvider.useLayoutCreateNewChild();
|
|
38
|
+
const createNewChild = createNewChildProp ?? createNewChildFromContext ?? defaultCreateNewChild;
|
|
39
|
+
const handleTabSelection = (nextIdx) => {
|
|
40
|
+
if (path) {
|
|
41
|
+
dispatch({ type: "switch-tab", id, path, nextIdx });
|
|
42
|
+
onTabSelectionChanged?.(nextIdx);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const handleTabClose = React.useCallback(
|
|
46
|
+
(tabIndex) => {
|
|
47
|
+
if (Array.isArray(children)) {
|
|
48
|
+
const {
|
|
49
|
+
props: { "data-path": dataPath, path: path2 = dataPath }
|
|
50
|
+
} = children[tabIndex];
|
|
51
|
+
dispatch({ type: "remove", path: path2 });
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
[children, dispatch]
|
|
55
|
+
);
|
|
56
|
+
const handleTabAdd = React.useCallback(() => {
|
|
57
|
+
if (path) {
|
|
58
|
+
const tabIndex = React.Children.count(children);
|
|
59
|
+
const component = createNewChild(tabIndex);
|
|
60
|
+
dispatch({
|
|
61
|
+
type: "add",
|
|
62
|
+
path,
|
|
63
|
+
component
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}, [children, createNewChild, dispatch, path]);
|
|
67
|
+
const handleMoveTab = React.useCallback(
|
|
68
|
+
(fromIndex, toIndex) => {
|
|
69
|
+
if (path) {
|
|
70
|
+
dispatch({
|
|
71
|
+
fromIndex,
|
|
72
|
+
toIndex,
|
|
73
|
+
path,
|
|
74
|
+
type: "move-child"
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
[dispatch, path]
|
|
79
|
+
);
|
|
80
|
+
const handleMouseDown = async (e, index) => {
|
|
81
|
+
let readyToDrag;
|
|
82
|
+
const preDragActivity = async () => new Promise((resolve) => {
|
|
83
|
+
console.log("preDragActivity: Ok, gonna release the drag");
|
|
84
|
+
readyToDrag = resolve;
|
|
85
|
+
});
|
|
86
|
+
const dragging = await dispatchViewAction(
|
|
87
|
+
{ type: "mousedown", index, preDragActivity },
|
|
88
|
+
e
|
|
89
|
+
);
|
|
90
|
+
if (dragging) {
|
|
91
|
+
readyToDrag?.(void 0);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const handleTabEdit = (tabIndex, text) => {
|
|
95
|
+
dispatch({ type: "set-title", path: `${path}.${tabIndex}`, title: text });
|
|
96
|
+
};
|
|
97
|
+
const getTabLabel = (component, idx, existingLabels) => {
|
|
98
|
+
const { id: id2, title } = component.props;
|
|
99
|
+
return loadState(id2, "view-title") || title || // This will normally never be called as title is always assigned in layout model
|
|
100
|
+
layoutUtils.getDefaultTabLabel(component, idx, existingLabels);
|
|
101
|
+
};
|
|
102
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
103
|
+
Stack.Stack,
|
|
104
|
+
{
|
|
105
|
+
...restProps,
|
|
106
|
+
id,
|
|
107
|
+
getTabLabel,
|
|
108
|
+
onMouseDown: handleMouseDown,
|
|
109
|
+
onMoveTab: handleMoveTab,
|
|
110
|
+
onAddTab: handleTabAdd,
|
|
111
|
+
onTabClose: handleTabClose,
|
|
112
|
+
onTabEdit: handleTabEdit,
|
|
113
|
+
onTabSelectionChanged: handleTabSelection,
|
|
114
|
+
ref
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
};
|
|
118
|
+
StackLayout.displayName = "Stack";
|
|
119
|
+
ComponentRegistry.registerComponent("Stack", StackLayout, "container");
|
|
120
|
+
|
|
121
|
+
exports.StackLayout = StackLayout;
|
|
122
|
+
//# sourceMappingURL=StackLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackLayout.js","sources":["../../src/stack/StackLayout.tsx"],"sourcesContent":["import { useId } from \"@vuu-ui/vuu-utils\";\nimport React, { useCallback, useRef } from \"react\";\nimport {\n useLayoutCreateNewChild,\n useLayoutProviderDispatch,\n} from \"../layout-provider\";\nimport { useViewActionDispatcher } from \"../layout-view-actions\";\nimport { registerComponent } from \"../registry/ComponentRegistry\";\nimport { usePersistentState } from \"../use-persistent-state\";\nimport { Stack } from \"./Stack\";\nimport { StackProps, TabLabelFactory } from \"./stackTypes\";\nimport { getDefaultTabLabel } from \"../layout-reducer\";\nimport { Placeholder } from \"../placeholder\";\n\nconst defaultCreateNewChild = () => (\n <Placeholder\n resizeable\n style={{ flexGrow: 1, flexShrink: 0, flexBasis: 0 }}\n />\n);\n\nexport const StackLayout = (props: StackProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const dispatch = useLayoutProviderDispatch();\n const { loadState } = usePersistentState();\n\n const {\n createNewChild: createNewChildProp,\n id: idProp,\n onTabSelectionChanged,\n path,\n ...restProps\n } = props;\n\n const { children } = props;\n\n const id = useId(idProp);\n\n const [dispatchViewAction] = useViewActionDispatcher(id, ref, path);\n const createNewChildFromContext = useLayoutCreateNewChild();\n const createNewChild =\n createNewChildProp ?? createNewChildFromContext ?? defaultCreateNewChild;\n\n const handleTabSelection = (nextIdx: number) => {\n if (path) {\n dispatch({ type: \"switch-tab\", id, path, nextIdx });\n onTabSelectionChanged?.(nextIdx);\n }\n };\n\n const handleTabClose = useCallback(\n (tabIndex: number) => {\n if (Array.isArray(children)) {\n const {\n props: { \"data-path\": dataPath, path = dataPath },\n } = children[tabIndex];\n dispatch({ type: \"remove\", path });\n }\n },\n [children, dispatch]\n );\n\n const handleTabAdd = useCallback(() => {\n if (path) {\n const tabIndex = React.Children.count(children);\n const component = createNewChild(tabIndex);\n dispatch({\n type: \"add\",\n path,\n component,\n });\n }\n }, [children, createNewChild, dispatch, path]);\n\n const handleMoveTab = useCallback(\n (fromIndex: number, toIndex: number) => {\n if (path) {\n dispatch({\n fromIndex,\n toIndex,\n path,\n type: \"move-child\",\n });\n }\n },\n [dispatch, path]\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleMouseDown = async (e: any, index: number) => {\n let readyToDrag: undefined | ((value: unknown) => void);\n\n const preDragActivity = async () =>\n new Promise((resolve) => {\n console.log(\"preDragActivity: Ok, gonna release the drag\");\n readyToDrag = resolve;\n });\n\n const dragging = await dispatchViewAction(\n { type: \"mousedown\", index, preDragActivity },\n e\n );\n\n if (dragging) {\n readyToDrag?.(undefined);\n }\n };\n\n const handleTabEdit = (tabIndex: number, text: string) => {\n dispatch({ type: \"set-title\", path: `${path}.${tabIndex}`, title: text });\n };\n\n const getTabLabel: TabLabelFactory = (component, idx, existingLabels) => {\n const { id, title } = component.props;\n return (\n loadState(id, \"view-title\") ||\n title ||\n // This will normally never be called as title is always assigned in layout model\n getDefaultTabLabel(component, idx, existingLabels)\n );\n };\n\n return (\n <Stack\n {...restProps}\n id={id}\n getTabLabel={getTabLabel}\n onMouseDown={handleMouseDown}\n onMoveTab={handleMoveTab}\n onAddTab={handleTabAdd}\n onTabClose={handleTabClose}\n onTabEdit={handleTabEdit}\n onTabSelectionChanged={handleTabSelection}\n ref={ref}\n />\n );\n};\nStackLayout.displayName = \"Stack\";\n\nregisterComponent(\"Stack\", StackLayout, \"container\");\n"],"names":["jsx","Placeholder","useRef","useLayoutProviderDispatch","usePersistentState","useId","useViewActionDispatcher","useLayoutCreateNewChild","useCallback","path","id","getDefaultTabLabel","Stack","registerComponent"],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
const persistentState = /* @__PURE__ */ new Map();
|
|
6
|
+
const sessionState = /* @__PURE__ */ new Map();
|
|
7
|
+
const getPersistentState = (id) => persistentState.get(id);
|
|
8
|
+
const hasPersistentState = (id) => persistentState.has(id);
|
|
9
|
+
const setPersistentState = (id, value) => persistentState.set(id, value);
|
|
10
|
+
const usePersistentState = () => {
|
|
11
|
+
const loadSessionState = React.useCallback((id, key) => {
|
|
12
|
+
const state = sessionState.get(id);
|
|
13
|
+
if (state) {
|
|
14
|
+
if (key !== void 0 && state[key] !== void 0) {
|
|
15
|
+
return state[key];
|
|
16
|
+
}
|
|
17
|
+
if (key !== void 0) {
|
|
18
|
+
return void 0;
|
|
19
|
+
}
|
|
20
|
+
return state;
|
|
21
|
+
}
|
|
22
|
+
}, []);
|
|
23
|
+
const saveSessionState = React.useCallback((id, key, data) => {
|
|
24
|
+
if (key === void 0) {
|
|
25
|
+
sessionState.set(id, data);
|
|
26
|
+
} else if (sessionState.has(id)) {
|
|
27
|
+
const state = sessionState.get(id);
|
|
28
|
+
sessionState.set(id, {
|
|
29
|
+
...state,
|
|
30
|
+
[key]: data
|
|
31
|
+
});
|
|
32
|
+
} else {
|
|
33
|
+
sessionState.set(id, { [key]: data });
|
|
34
|
+
}
|
|
35
|
+
}, []);
|
|
36
|
+
const purgeSessionState = React.useCallback((id, key) => {
|
|
37
|
+
if (sessionState.has(id)) {
|
|
38
|
+
if (key === void 0) {
|
|
39
|
+
sessionState.delete(id);
|
|
40
|
+
} else {
|
|
41
|
+
const state = sessionState.get(id);
|
|
42
|
+
if (state[key]) {
|
|
43
|
+
const { [key]: _doomedState, ...rest } = sessionState.get(id);
|
|
44
|
+
if (Object.keys(rest).length > 0) {
|
|
45
|
+
sessionState.set(id, rest);
|
|
46
|
+
} else {
|
|
47
|
+
sessionState.delete(id);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}, []);
|
|
53
|
+
const loadState = React.useCallback((id, key) => {
|
|
54
|
+
const state = persistentState.get(id);
|
|
55
|
+
if (state) {
|
|
56
|
+
if (key !== void 0) {
|
|
57
|
+
return state[key];
|
|
58
|
+
}
|
|
59
|
+
return state;
|
|
60
|
+
}
|
|
61
|
+
}, []);
|
|
62
|
+
const saveState = React.useCallback(
|
|
63
|
+
(id, key, data) => {
|
|
64
|
+
if (key === void 0) {
|
|
65
|
+
persistentState.set(id, data);
|
|
66
|
+
} else if (persistentState.has(id)) {
|
|
67
|
+
const state = persistentState.get(id);
|
|
68
|
+
persistentState.set(id, {
|
|
69
|
+
...state,
|
|
70
|
+
[key]: data
|
|
71
|
+
});
|
|
72
|
+
} else {
|
|
73
|
+
persistentState.set(id, { [key]: data });
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
[]
|
|
77
|
+
);
|
|
78
|
+
const purgeState = React.useCallback((id, key) => {
|
|
79
|
+
if (persistentState.has(id)) {
|
|
80
|
+
if (key === void 0) {
|
|
81
|
+
persistentState.delete(id);
|
|
82
|
+
} else {
|
|
83
|
+
const state = persistentState.get(id);
|
|
84
|
+
if (state[key]) {
|
|
85
|
+
const { [key]: _doomedState, ...rest } = persistentState.get(id);
|
|
86
|
+
if (Object.keys(rest).length > 0) {
|
|
87
|
+
persistentState.set(id, rest);
|
|
88
|
+
} else {
|
|
89
|
+
persistentState.delete(id);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}, []);
|
|
95
|
+
return {
|
|
96
|
+
loadSessionState,
|
|
97
|
+
loadState,
|
|
98
|
+
saveSessionState,
|
|
99
|
+
saveState,
|
|
100
|
+
purgeState,
|
|
101
|
+
purgeSessionState
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
exports.getPersistentState = getPersistentState;
|
|
106
|
+
exports.hasPersistentState = hasPersistentState;
|
|
107
|
+
exports.setPersistentState = setPersistentState;
|
|
108
|
+
exports.usePersistentState = usePersistentState;
|
|
109
|
+
//# sourceMappingURL=use-persistent-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-persistent-state.js","sources":["../src/use-persistent-state.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useCallback } from \"react\";\n\n/**\n * Persistent state is stored at module level (i.e singleton-style)\n * It is kept at this level, rather than passed to the target component(s)\n * so that it endures across the unmount/mount lifecycle journey of any\n * individual component. e.g when switching between tabs, components are\n * unmounted and mounted. They re-request their persistent state on re-mount.\n * Persistent state is populated as the serialized layout schema is processed\n * (see layoutFromJSON).\n */\nconst persistentState = new Map<string, any>();\nconst sessionState = new Map<string, any>();\n\nexport const getPersistentState = (id: string) => persistentState.get(id);\nexport const hasPersistentState = (id: string) => persistentState.has(id);\nexport const setPersistentState = (id: string, value: any) =>\n persistentState.set(id, value);\n\nexport const usePersistentState = () => {\n const loadSessionState = useCallback((id, key) => {\n const state = sessionState.get(id);\n if (state) {\n if (key !== undefined && state[key] !== undefined) {\n return state[key];\n }\n if (key !== undefined) {\n return undefined;\n }\n return state;\n }\n }, []);\n\n const saveSessionState = useCallback((id, key, data) => {\n if (key === undefined) {\n sessionState.set(id, data);\n } else if (sessionState.has(id)) {\n const state = sessionState.get(id);\n sessionState.set(id, {\n ...state,\n [key]: data,\n });\n } else {\n sessionState.set(id, { [key]: data });\n }\n }, []);\n\n const purgeSessionState = useCallback((id: string, key?: string) => {\n if (sessionState.has(id)) {\n if (key === undefined) {\n sessionState.delete(id);\n } else {\n const state = sessionState.get(id);\n if (state[key]) {\n const { [key]: _doomedState, ...rest } = sessionState.get(id);\n if (Object.keys(rest).length > 0) {\n sessionState.set(id, rest);\n } else {\n sessionState.delete(id);\n }\n }\n }\n }\n }, []);\n\n const loadState = useCallback((id: string, key?: string) => {\n const state = persistentState.get(id);\n if (state) {\n if (key !== undefined) {\n return state[key];\n }\n return state;\n }\n }, []);\n\n const saveState = useCallback(\n (id: string, key: string | undefined, data: unknown) => {\n if (key === undefined) {\n persistentState.set(id, data);\n } else if (persistentState.has(id)) {\n const state = persistentState.get(id);\n persistentState.set(id, {\n ...state,\n [key]: data,\n });\n } else {\n persistentState.set(id, { [key]: data });\n }\n },\n []\n );\n\n const purgeState = useCallback((id: string, key?: string) => {\n if (persistentState.has(id)) {\n if (key === undefined) {\n persistentState.delete(id);\n } else {\n const state = persistentState.get(id);\n if (state[key]) {\n const { [key]: _doomedState, ...rest } = persistentState.get(id);\n if (Object.keys(rest).length > 0) {\n persistentState.set(id, rest);\n } else {\n persistentState.delete(id);\n }\n }\n }\n }\n }, []);\n\n return {\n loadSessionState,\n loadState,\n saveSessionState,\n saveState,\n purgeState,\n purgeSessionState,\n };\n};\n"],"names":["useCallback"],"mappings":"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"}
|