@hitachivantara/uikit-react-pentaho 0.7.1 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Canvas/BottomPanel/BottomPanel.cjs +7 -0
- package/dist/cjs/Canvas/CanvasContext.cjs +33 -0
- package/dist/cjs/Canvas/SidePanel/SidePanel.cjs +21 -3
- package/dist/cjs/Canvas/SidePanel/useResizable.cjs +2 -6
- package/dist/cjs/Canvas/Toolbar/Toolbar.cjs +29 -13
- package/dist/cjs/Canvas/Toolbar/Toolbar.styles.cjs +2 -2
- package/dist/cjs/index.cjs +4 -0
- package/dist/esm/Canvas/BottomPanel/BottomPanel.js +7 -0
- package/dist/esm/Canvas/BottomPanel/BottomPanel.js.map +1 -1
- package/dist/esm/Canvas/CanvasContext.js +33 -0
- package/dist/esm/Canvas/CanvasContext.js.map +1 -0
- package/dist/esm/Canvas/SidePanel/SidePanel.js +22 -4
- package/dist/esm/Canvas/SidePanel/SidePanel.js.map +1 -1
- package/dist/esm/Canvas/SidePanel/useResizable.js +2 -6
- package/dist/esm/Canvas/SidePanel/useResizable.js.map +1 -1
- package/dist/esm/Canvas/Toolbar/Toolbar.js +29 -13
- package/dist/esm/Canvas/Toolbar/Toolbar.js.map +1 -1
- package/dist/esm/Canvas/Toolbar/Toolbar.styles.js +2 -2
- package/dist/esm/Canvas/Toolbar/Toolbar.styles.js.map +1 -1
- package/dist/esm/index.js +5 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/types/index.d.ts +29 -1
- package/package.json +3 -3
|
@@ -4,6 +4,7 @@ const jsxRuntime = require("react/jsx-runtime");
|
|
|
4
4
|
const react = require("react");
|
|
5
5
|
const reactResizeDetector = require("react-resize-detector");
|
|
6
6
|
const uikitReactCore = require("@hitachivantara/uikit-react-core");
|
|
7
|
+
const CanvasContext = require("../CanvasContext.cjs");
|
|
7
8
|
const BottomPanel_styles = require("./BottomPanel.styles.cjs");
|
|
8
9
|
const PanelTabs = require("../PanelTabs/PanelTabs.cjs");
|
|
9
10
|
const PanelTab = require("../PanelTab/PanelTab.cjs");
|
|
@@ -25,6 +26,8 @@ const HvCanvasBottomPanel = react.forwardRef((props, ref) => {
|
|
|
25
26
|
...others
|
|
26
27
|
} = uikitReactCore.useDefaultProps("HvCanvasBottomPanel", props);
|
|
27
28
|
const { classes, cx } = BottomPanel_styles.useClasses(classesProp);
|
|
29
|
+
const canvasContext = CanvasContext.useCanvasContext();
|
|
30
|
+
const sidePanelWidth = canvasContext?.sidePanelWidth ?? 0;
|
|
28
31
|
const id = uikitReactCore.useUniqueId(idProp);
|
|
29
32
|
const { width: tabWidth = 0, ref: tabRef } = reactResizeDetector.useResizeDetector({
|
|
30
33
|
handleHeight: false
|
|
@@ -75,6 +78,10 @@ const HvCanvasBottomPanel = react.forwardRef((props, ref) => {
|
|
|
75
78
|
},
|
|
76
79
|
className
|
|
77
80
|
),
|
|
81
|
+
style: {
|
|
82
|
+
width: `calc(100% - ${sidePanelWidth}px - 2 * ${uikitReactCore.theme.space.sm})`,
|
|
83
|
+
right: uikitReactCore.theme.space.sm
|
|
84
|
+
},
|
|
78
85
|
...others,
|
|
79
86
|
children: [
|
|
80
87
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: classes.tabsRoot, children: [
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const HvCanvasContext = react.createContext(null);
|
|
6
|
+
const HvCanvasProvider = ({
|
|
7
|
+
children
|
|
8
|
+
}) => {
|
|
9
|
+
const [sidePanelOpen, setSidePanelOpen] = react.useState(false);
|
|
10
|
+
const [width, setWidth] = react.useState(0);
|
|
11
|
+
const handleSidePanelWidth = react.useCallback((newWidth) => {
|
|
12
|
+
setWidth(newWidth);
|
|
13
|
+
}, []);
|
|
14
|
+
const handleSidePanelOpen = react.useCallback((open) => {
|
|
15
|
+
setSidePanelOpen(open);
|
|
16
|
+
}, []);
|
|
17
|
+
const value = react.useMemo(
|
|
18
|
+
() => ({
|
|
19
|
+
sidePanelOpen,
|
|
20
|
+
handleSidePanelOpen,
|
|
21
|
+
sidePanelWidth: sidePanelOpen ? width : 0,
|
|
22
|
+
handleSidePanelWidth
|
|
23
|
+
}),
|
|
24
|
+
[sidePanelOpen, handleSidePanelOpen, width, handleSidePanelWidth]
|
|
25
|
+
);
|
|
26
|
+
return /* @__PURE__ */ jsxRuntime.jsx(HvCanvasContext.Provider, { value, children });
|
|
27
|
+
};
|
|
28
|
+
const useCanvasContext = () => {
|
|
29
|
+
return react.useContext(HvCanvasContext);
|
|
30
|
+
};
|
|
31
|
+
exports.HvCanvasContext = HvCanvasContext;
|
|
32
|
+
exports.HvCanvasProvider = HvCanvasProvider;
|
|
33
|
+
exports.useCanvasContext = useCanvasContext;
|
|
@@ -4,6 +4,7 @@ const jsxRuntime = require("react/jsx-runtime");
|
|
|
4
4
|
const react = require("react");
|
|
5
5
|
const uikitReactCore = require("@hitachivantara/uikit-react-core");
|
|
6
6
|
const uikitReactIcons = require("@hitachivantara/uikit-react-icons");
|
|
7
|
+
const CanvasContext = require("../CanvasContext.cjs");
|
|
7
8
|
const SidePanel_styles = require("./SidePanel.styles.cjs");
|
|
8
9
|
const useResizable = require("./useResizable.cjs");
|
|
9
10
|
const PanelTabs = require("../PanelTabs/PanelTabs.cjs");
|
|
@@ -22,12 +23,20 @@ const HvCanvasSidePanel = react.forwardRef((props, ref) => {
|
|
|
22
23
|
onToggle,
|
|
23
24
|
onTabChange,
|
|
24
25
|
labels: labelsProp,
|
|
26
|
+
minWidth = 100,
|
|
27
|
+
maxWidth = 500,
|
|
28
|
+
initialWidth = 320,
|
|
29
|
+
onResize,
|
|
25
30
|
className,
|
|
26
31
|
children,
|
|
27
32
|
classes: classesProp,
|
|
28
33
|
...others
|
|
29
34
|
} = uikitReactCore.useDefaultProps("HvCanvasSidePanel", props);
|
|
30
35
|
const id = uikitReactCore.useUniqueId(idProp);
|
|
36
|
+
const canvasContext = CanvasContext.useCanvasContext();
|
|
37
|
+
const handleSidePanelWidth = canvasContext?.handleSidePanelWidth;
|
|
38
|
+
const sidePanelOpen = canvasContext?.sidePanelOpen;
|
|
39
|
+
const handleSidePanelOpen = canvasContext?.handleSidePanelOpen;
|
|
31
40
|
const { classes, cx } = SidePanel_styles.useClasses(classesProp);
|
|
32
41
|
const labels = uikitReactCore.useLabels(DEFAULT_LABELS, labelsProp);
|
|
33
42
|
const [open, setOpen] = uikitReactCore.useControlled(openProp, Boolean(defaultOpen));
|
|
@@ -35,14 +44,23 @@ const HvCanvasSidePanel = react.forwardRef((props, ref) => {
|
|
|
35
44
|
tabProp,
|
|
36
45
|
tabs?.[0]?.id ?? "none"
|
|
37
46
|
);
|
|
47
|
+
react.useEffect(() => {
|
|
48
|
+
handleSidePanelWidth?.(initialWidth);
|
|
49
|
+
}, [initialWidth]);
|
|
50
|
+
const updateWidth = (width2) => {
|
|
51
|
+
handleSidePanelWidth?.(width2);
|
|
52
|
+
onResize?.(width2);
|
|
53
|
+
};
|
|
38
54
|
const { width, isDragging, getContainerProps, getSeparatorProps } = useResizable.useResizable({
|
|
39
55
|
ref,
|
|
40
|
-
initialWidth
|
|
41
|
-
minWidth
|
|
42
|
-
maxWidth
|
|
56
|
+
initialWidth,
|
|
57
|
+
minWidth,
|
|
58
|
+
maxWidth,
|
|
59
|
+
onResize: updateWidth
|
|
43
60
|
});
|
|
44
61
|
const handleTogglePanel = (event) => {
|
|
45
62
|
setOpen((prev) => !prev);
|
|
63
|
+
handleSidePanelOpen?.(!sidePanelOpen);
|
|
46
64
|
onToggle?.(event, !open);
|
|
47
65
|
};
|
|
48
66
|
const handleTabChange = (event, tabId) => {
|
|
@@ -3,12 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const react = require("react");
|
|
4
4
|
const uikitReactCore = require("@hitachivantara/uikit-react-core");
|
|
5
5
|
const useResizable = (resizableOptions) => {
|
|
6
|
-
const {
|
|
7
|
-
ref,
|
|
8
|
-
initialWidth = 320,
|
|
9
|
-
minWidth = 100,
|
|
10
|
-
maxWidth = 600
|
|
11
|
-
} = resizableOptions;
|
|
6
|
+
const { ref, initialWidth, minWidth, maxWidth, onResize } = resizableOptions;
|
|
12
7
|
const [width, setWidth] = react.useState(initialWidth);
|
|
13
8
|
const [isHover, setIsHover] = react.useState(false);
|
|
14
9
|
const [isDragging, setIsDragging] = react.useState(false);
|
|
@@ -20,6 +15,7 @@ const useResizable = (resizableOptions) => {
|
|
|
20
15
|
const newWidth = event.clientX - rect.left;
|
|
21
16
|
if (newWidth >= minWidth && newWidth <= maxWidth) {
|
|
22
17
|
setWidth(newWidth);
|
|
18
|
+
onResize?.(newWidth);
|
|
23
19
|
}
|
|
24
20
|
}
|
|
25
21
|
};
|
|
@@ -4,6 +4,8 @@ const jsxRuntime = require("react/jsx-runtime");
|
|
|
4
4
|
const react = require("react");
|
|
5
5
|
const uikitReactCore = require("@hitachivantara/uikit-react-core");
|
|
6
6
|
const uikitReactIcons = require("@hitachivantara/uikit-react-icons");
|
|
7
|
+
const uikitReactUtils = require("@hitachivantara/uikit-react-utils");
|
|
8
|
+
const CanvasContext = require("../CanvasContext.cjs");
|
|
7
9
|
const Toolbar_styles = require("./Toolbar.styles.cjs");
|
|
8
10
|
const DEFAULT_LABELS = {
|
|
9
11
|
back: "Back"
|
|
@@ -15,6 +17,7 @@ const HvCanvasToolbar = react.forwardRef(
|
|
|
15
17
|
backButton,
|
|
16
18
|
labels: labelsProp,
|
|
17
19
|
className,
|
|
20
|
+
style,
|
|
18
21
|
children,
|
|
19
22
|
backButtonProps,
|
|
20
23
|
classes: classesProp,
|
|
@@ -22,20 +25,33 @@ const HvCanvasToolbar = react.forwardRef(
|
|
|
22
25
|
} = uikitReactCore.useDefaultProps("HvCanvasToolbar", props);
|
|
23
26
|
const { classes, cx } = Toolbar_styles.useClasses(classesProp);
|
|
24
27
|
const labels = uikitReactCore.useLabels(DEFAULT_LABELS, labelsProp);
|
|
28
|
+
const canvasContext = CanvasContext.useCanvasContext();
|
|
29
|
+
const sidePanelWidth = canvasContext?.sidePanelWidth ?? 0;
|
|
25
30
|
const title = typeof titleProp === "string" ? /* @__PURE__ */ jsxRuntime.jsx(uikitReactCore.HvTypography, { variant: "title4", children: titleProp }) : titleProp;
|
|
26
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
31
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
32
|
+
"div",
|
|
33
|
+
{
|
|
34
|
+
ref,
|
|
35
|
+
className: cx(classes.root, className),
|
|
36
|
+
style: uikitReactUtils.mergeStyles(style, {
|
|
37
|
+
"--sidepanel-width": `${sidePanelWidth}px`
|
|
38
|
+
}),
|
|
39
|
+
...others,
|
|
40
|
+
children: [
|
|
41
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: classes.back, children: backButton ?? /* @__PURE__ */ jsxRuntime.jsx(
|
|
42
|
+
uikitReactCore.HvIconButton,
|
|
43
|
+
{
|
|
44
|
+
title: labels.back,
|
|
45
|
+
variant: "primaryGhost",
|
|
46
|
+
...backButtonProps,
|
|
47
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(uikitReactIcons.Previous, {})
|
|
48
|
+
}
|
|
49
|
+
) }),
|
|
50
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: classes.title, children: title }),
|
|
51
|
+
children && /* @__PURE__ */ jsxRuntime.jsx("div", { className: classes.actions, children })
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
);
|
|
39
55
|
}
|
|
40
56
|
);
|
|
41
57
|
exports.canvasToolbarClasses = Toolbar_styles.staticClasses;
|
|
@@ -3,14 +3,14 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const uikitReactCore = require("@hitachivantara/uikit-react-core");
|
|
4
4
|
const { staticClasses, useClasses } = uikitReactCore.createClasses("HvCanvasToolbar", {
|
|
5
5
|
root: {
|
|
6
|
-
width:
|
|
6
|
+
width: `calc(100% - var(--sidepanel-width) - 2 * ${uikitReactCore.theme.space.sm})`,
|
|
7
7
|
height: 54,
|
|
8
8
|
display: "flex",
|
|
9
9
|
alignItems: "center",
|
|
10
10
|
borderRadius: uikitReactCore.theme.radii.full,
|
|
11
11
|
backgroundColor: uikitReactCore.theme.colors.atmo1,
|
|
12
12
|
position: "absolute",
|
|
13
|
-
right:
|
|
13
|
+
right: uikitReactCore.theme.space.sm,
|
|
14
14
|
top: 0,
|
|
15
15
|
transition: "width 0.3s ease"
|
|
16
16
|
},
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -12,6 +12,7 @@ const Toolbar_styles = require("./Canvas/Toolbar/Toolbar.styles.cjs");
|
|
|
12
12
|
const Toolbar = require("./Canvas/Toolbar/Toolbar.cjs");
|
|
13
13
|
const ToolbarTabs_styles = require("./Canvas/ToolbarTabs/ToolbarTabs.styles.cjs");
|
|
14
14
|
const ToolbarTabs = require("./Canvas/ToolbarTabs/ToolbarTabs.cjs");
|
|
15
|
+
const CanvasContext = require("./Canvas/CanvasContext.cjs");
|
|
15
16
|
exports.canvasBottomPanelClasses = BottomPanel_styles.staticClasses;
|
|
16
17
|
exports.HvCanvasBottomPanel = BottomPanel.HvCanvasBottomPanel;
|
|
17
18
|
exports.canvasPanelTabClasses = PanelTab_styles.staticClasses;
|
|
@@ -24,3 +25,6 @@ exports.canvasToolbarClasses = Toolbar_styles.staticClasses;
|
|
|
24
25
|
exports.HvCanvasToolbar = Toolbar.HvCanvasToolbar;
|
|
25
26
|
exports.canvasToolbarTabsClasses = ToolbarTabs_styles.staticClasses;
|
|
26
27
|
exports.HvCanvasToolbarTabs = ToolbarTabs.HvCanvasToolbarTabs;
|
|
28
|
+
exports.HvCanvasContext = CanvasContext.HvCanvasContext;
|
|
29
|
+
exports.HvCanvasProvider = CanvasContext.HvCanvasProvider;
|
|
30
|
+
exports.useCanvasContext = CanvasContext.useCanvasContext;
|
|
@@ -2,6 +2,7 @@ import { jsxs, jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef, useMemo } from "react";
|
|
3
3
|
import { useResizeDetector } from "react-resize-detector";
|
|
4
4
|
import { useDefaultProps, useUniqueId, useControlled, theme, HvActionsGeneric, HvPanel } from "@hitachivantara/uikit-react-core";
|
|
5
|
+
import { useCanvasContext } from "../CanvasContext.js";
|
|
5
6
|
import { useClasses } from "./BottomPanel.styles.js";
|
|
6
7
|
import { staticClasses } from "./BottomPanel.styles.js";
|
|
7
8
|
import { HvCanvasPanelTabs } from "../PanelTabs/PanelTabs.js";
|
|
@@ -24,6 +25,8 @@ const HvCanvasBottomPanel = forwardRef((props, ref) => {
|
|
|
24
25
|
...others
|
|
25
26
|
} = useDefaultProps("HvCanvasBottomPanel", props);
|
|
26
27
|
const { classes, cx } = useClasses(classesProp);
|
|
28
|
+
const canvasContext = useCanvasContext();
|
|
29
|
+
const sidePanelWidth = canvasContext?.sidePanelWidth ?? 0;
|
|
27
30
|
const id = useUniqueId(idProp);
|
|
28
31
|
const { width: tabWidth = 0, ref: tabRef } = useResizeDetector({
|
|
29
32
|
handleHeight: false
|
|
@@ -74,6 +77,10 @@ const HvCanvasBottomPanel = forwardRef((props, ref) => {
|
|
|
74
77
|
},
|
|
75
78
|
className
|
|
76
79
|
),
|
|
80
|
+
style: {
|
|
81
|
+
width: `calc(100% - ${sidePanelWidth}px - 2 * ${theme.space.sm})`,
|
|
82
|
+
right: theme.space.sm
|
|
83
|
+
},
|
|
77
84
|
...others,
|
|
78
85
|
children: [
|
|
79
86
|
/* @__PURE__ */ jsxs("div", { className: classes.tabsRoot, children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomPanel.js","sources":["../../../../src/Canvas/BottomPanel/BottomPanel.tsx"],"sourcesContent":["import { forwardRef, useMemo } from \"react\";\nimport { useResizeDetector } from \"react-resize-detector\";\nimport {\n ExtractNames,\n HvActionGeneric,\n HvActionsGeneric,\n HvActionsGenericProps,\n HvBaseProps,\n HvPanel,\n theme,\n useControlled,\n useDefaultProps,\n useUniqueId,\n} from \"@hitachivantara/uikit-react-core\";\n\nimport { HvCanvasPanelTab } from \"../PanelTab\";\nimport { HvCanvasPanelTabs, HvCanvasPanelTabsProps } from \"../PanelTabs\";\nimport { staticClasses, useClasses } from \"./BottomPanel.styles\";\n\nexport { staticClasses as canvasBottomPanelClasses };\n\nexport type HvCanvasBottomPanelClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvCanvasBottomPanelProps extends HvBaseProps {\n /** Open state of the bottom panel. */\n open?: boolean;\n /** Minimize state of the bottom panel tabs'. */\n minimize?: boolean;\n /** List of tabs visible on the panel. */\n tabs: {\n id: string | number;\n title: React.ReactNode | ((overflowing: boolean) => React.ReactNode);\n }[];\n /** Id of the selected tab if it needs to be controlled. */\n selectedTabId?: string | number;\n /** Callback triggered when a tab changes/is clicked. */\n onTabChange?: (\n event: React.SyntheticEvent | null,\n tabId: string | number | null,\n ) => void;\n /**\n * Actions to be rendered in the left side of a tab.\n * If more than one action is provided, a dropdown menu will be used.\n * These actions are not shown when the tab content is overflowing.\n */\n leftActions?: HvActionsGenericProps[\"actions\"];\n /**\n * Actions to be rendered in the right side of a tab.\n * If more than two actions are provided, a dropdown menu will be used to display the remaining actions.\n * These actions are not shown when the tab content is overflowing.\n */\n rightActions?: HvActionsGenericProps[\"actions\"];\n /**\n * Actions to be rendered in the right side of a tab when the tab content is overflowing.\n * These actions will replace both `leftActions` and `rightActions`.\n */\n overflowActions?: HvActionsGenericProps[\"actions\"];\n /** Callback triggered when an action is clicked. */\n onAction?: (\n event: React.SyntheticEvent,\n action: HvActionGeneric,\n tabId: string | number,\n ) => void;\n /** A Jss Object used to override or extend the styles applied. */\n classes?: HvCanvasBottomPanelClasses;\n}\n\n/**\n * A bottom panel component to use in a canvas context.\n */\nexport const HvCanvasBottomPanel = forwardRef<\n HTMLDivElement,\n HvCanvasBottomPanelProps\n>((props, ref) => {\n const {\n id: idProp,\n className,\n children,\n open,\n tabs,\n minimize,\n leftActions,\n rightActions,\n overflowActions,\n selectedTabId: selectedTabIdProp,\n classes: classesProp,\n onTabChange,\n onAction,\n ...others\n } = useDefaultProps(\"HvCanvasBottomPanel\", props);\n\n const { classes, cx } = useClasses(classesProp);\n\n const id = useUniqueId(idProp);\n\n // Tab resize detector: to position tab actions and set the panel top right border radius\n const { width: tabWidth = 0, ref: tabRef } = useResizeDetector({\n handleHeight: false,\n });\n // Tab panel resize detector: to set the panel top right border radius\n const { width: panelWidth = 0, ref: panelRef } = useResizeDetector({\n handleHeight: false,\n });\n\n // Left actions resize detector: to position tab title according with actions\n const { width: leftActionWidth = 32, ref: leftActionRef } = useResizeDetector(\n {\n handleHeight: false,\n refreshMode: \"debounce\",\n refreshOptions: {\n trailing: true,\n },\n },\n );\n // Right actions resize detector: to position tab title according with actions\n const { width: rightActionWidth = 32, ref: rightActionRef } =\n useResizeDetector({\n handleHeight: false,\n refreshMode: \"debounce\",\n refreshOptions: {\n trailing: true,\n },\n });\n\n const overflowing = useMemo(() => {\n const availableWidth =\n tabWidth -\n (leftActions ? leftActionWidth : 0) -\n (rightActions ? rightActionWidth : 0);\n\n return availableWidth < 60;\n }, [leftActionWidth, leftActions, rightActionWidth, rightActions, tabWidth]);\n\n const [selectedTab, setSelectedTab] = useControlled<string | number | null>(\n selectedTabIdProp,\n tabs[0].id,\n );\n\n const handleTabChange: HvCanvasPanelTabsProps[\"onChange\"] = (\n event,\n tabId,\n ) => {\n setSelectedTab(tabId);\n onTabChange?.(event, tabId);\n };\n\n return (\n <div\n id={id}\n ref={ref}\n className={cx(\n classes.root,\n {\n [classes.closed]: !open,\n [classes.minimized]: minimize,\n [classes.multipleTabs]: tabs.length > 1,\n [classes.overflowing]: overflowing,\n },\n className,\n )}\n {...others}\n >\n <div className={classes.tabsRoot}>\n <HvCanvasPanelTabs\n style={{\n // @ts-ignore\n \"--left-actions-width\":\n overflowing || !leftActions\n ? theme.space.sm\n : `calc(${leftActionWidth}px + ${theme.space.xs})`,\n \"--right-actions-width\":\n !rightActions || (overflowing && !overflowActions)\n ? theme.space.sm\n : `calc(${overflowing ? 32 : rightActionWidth}px + ${theme.space.xs})`,\n }}\n onChange={handleTabChange}\n value={selectedTab}\n >\n {tabs.map((tab, index) => (\n <HvCanvasPanelTab\n ref={index === 0 ? tabRef : undefined}\n key={tab.id}\n id={`${id}-${tab.id}`}\n value={tab.id}\n className={classes.tab}\n >\n <div className={classes.tabTitle}>\n {typeof tab.title === \"function\"\n ? tab.title(overflowing)\n : tab.title}\n </div>\n </HvCanvasPanelTab>\n ))}\n </HvCanvasPanelTabs>\n {/* For accessibility purposes, these buttons cannot be children of a tablist so they are rendered as HvCanvasTabs sibling. */}\n {leftActions || rightActions || overflowActions\n ? tabs.map((tab, index) => {\n const btnsDisabled = selectedTab !== tab.id && !minimize;\n return (\n <div\n key={tab.id}\n style={{\n // @ts-ignore\n \"--tab-width\": `${tabWidth}px`,\n \"--right\": `calc((${index} + 1) * var(--tab-width))`,\n \"--left\": `calc(${index} * var(--tab-width))`,\n }}\n >\n {leftActions && !overflowing && (\n <div\n ref={leftActionRef}\n className={cx(classes.leftActions, {\n [classes.actionsDisabled]: btnsDisabled,\n })}\n >\n <HvActionsGeneric\n maxVisibleActions={1}\n actions={leftActions}\n disabled={btnsDisabled}\n onAction={(event, action) =>\n onAction?.(event, action, tab.id)\n }\n variant=\"secondaryGhost\"\n iconOnly\n />\n </div>\n )}\n {rightActions && !overflowing && (\n <div\n ref={rightActionRef}\n className={cx(classes.rightActions, {\n [classes.actionsDisabled]: btnsDisabled,\n })}\n >\n <HvActionsGeneric\n maxVisibleActions={2}\n actions={rightActions}\n disabled={btnsDisabled}\n onAction={(event, action) =>\n onAction?.(event, action, tab.id)\n }\n variant=\"secondaryGhost\"\n iconOnly\n />\n </div>\n )}\n {overflowActions && overflowing && (\n <div\n className={cx(classes.rightActions, {\n [classes.actionsDisabled]: btnsDisabled,\n })}\n >\n <HvActionsGeneric\n maxVisibleActions={0}\n actions={overflowActions}\n disabled={btnsDisabled}\n onAction={(event, action) =>\n onAction?.(event, action, tab.id)\n }\n variant=\"secondaryGhost\"\n iconOnly\n />\n </div>\n )}\n </div>\n );\n })\n : null}\n </div>\n <HvPanel\n ref={panelRef}\n role=\"tabpanel\"\n aria-labelledby={`${id}-${selectedTab}`}\n className={classes.content}\n style={{\n // @ts-ignore\n \"--right-border-radius\":\n tabWidth * tabs.length >= panelWidth ? \"0px\" : \"16px\",\n }}\n >\n {children}\n </HvPanel>\n </div>\n );\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BottomPanel.js","sources":["../../../../src/Canvas/BottomPanel/BottomPanel.tsx"],"sourcesContent":["import { forwardRef, useMemo } from \"react\";\nimport { useResizeDetector } from \"react-resize-detector\";\nimport {\n ExtractNames,\n HvActionGeneric,\n HvActionsGeneric,\n HvActionsGenericProps,\n HvBaseProps,\n HvPanel,\n theme,\n useControlled,\n useDefaultProps,\n useUniqueId,\n} from \"@hitachivantara/uikit-react-core\";\n\nimport { useCanvasContext } from \"../CanvasContext\";\nimport { HvCanvasPanelTab } from \"../PanelTab\";\nimport { HvCanvasPanelTabs, HvCanvasPanelTabsProps } from \"../PanelTabs\";\nimport { staticClasses, useClasses } from \"./BottomPanel.styles\";\n\nexport { staticClasses as canvasBottomPanelClasses };\n\nexport type HvCanvasBottomPanelClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvCanvasBottomPanelProps extends HvBaseProps {\n /** Open state of the bottom panel. */\n open?: boolean;\n /** Minimize state of the bottom panel tabs'. */\n minimize?: boolean;\n /** List of tabs visible on the panel. */\n tabs: {\n id: string | number;\n title: React.ReactNode | ((overflowing: boolean) => React.ReactNode);\n }[];\n /** Id of the selected tab if it needs to be controlled. */\n selectedTabId?: string | number;\n /** Callback triggered when a tab changes/is clicked. */\n onTabChange?: (\n event: React.SyntheticEvent | null,\n tabId: string | number | null,\n ) => void;\n /**\n * Actions to be rendered in the left side of a tab.\n * If more than one action is provided, a dropdown menu will be used.\n * These actions are not shown when the tab content is overflowing.\n */\n leftActions?: HvActionsGenericProps[\"actions\"];\n /**\n * Actions to be rendered in the right side of a tab.\n * If more than two actions are provided, a dropdown menu will be used to display the remaining actions.\n * These actions are not shown when the tab content is overflowing.\n */\n rightActions?: HvActionsGenericProps[\"actions\"];\n /**\n * Actions to be rendered in the right side of a tab when the tab content is overflowing.\n * These actions will replace both `leftActions` and `rightActions`.\n */\n overflowActions?: HvActionsGenericProps[\"actions\"];\n /** Callback triggered when an action is clicked. */\n onAction?: (\n event: React.SyntheticEvent,\n action: HvActionGeneric,\n tabId: string | number,\n ) => void;\n /** A Jss Object used to override or extend the styles applied. */\n classes?: HvCanvasBottomPanelClasses;\n}\n\n/**\n * A bottom panel component to use in a canvas context.\n */\nexport const HvCanvasBottomPanel = forwardRef<\n HTMLDivElement,\n HvCanvasBottomPanelProps\n>((props, ref) => {\n const {\n id: idProp,\n className,\n children,\n open,\n tabs,\n minimize,\n leftActions,\n rightActions,\n overflowActions,\n selectedTabId: selectedTabIdProp,\n classes: classesProp,\n onTabChange,\n onAction,\n ...others\n } = useDefaultProps(\"HvCanvasBottomPanel\", props);\n\n const { classes, cx } = useClasses(classesProp);\n\n const canvasContext = useCanvasContext();\n const sidePanelWidth = canvasContext?.sidePanelWidth ?? 0;\n\n const id = useUniqueId(idProp);\n\n // Tab resize detector: to position tab actions and set the panel top right border radius\n const { width: tabWidth = 0, ref: tabRef } = useResizeDetector({\n handleHeight: false,\n });\n // Tab panel resize detector: to set the panel top right border radius\n const { width: panelWidth = 0, ref: panelRef } = useResizeDetector({\n handleHeight: false,\n });\n\n // Left actions resize detector: to position tab title according with actions\n const { width: leftActionWidth = 32, ref: leftActionRef } = useResizeDetector(\n {\n handleHeight: false,\n refreshMode: \"debounce\",\n refreshOptions: {\n trailing: true,\n },\n },\n );\n // Right actions resize detector: to position tab title according with actions\n const { width: rightActionWidth = 32, ref: rightActionRef } =\n useResizeDetector({\n handleHeight: false,\n refreshMode: \"debounce\",\n refreshOptions: {\n trailing: true,\n },\n });\n\n const overflowing = useMemo(() => {\n const availableWidth =\n tabWidth -\n (leftActions ? leftActionWidth : 0) -\n (rightActions ? rightActionWidth : 0);\n\n return availableWidth < 60;\n }, [leftActionWidth, leftActions, rightActionWidth, rightActions, tabWidth]);\n\n const [selectedTab, setSelectedTab] = useControlled<string | number | null>(\n selectedTabIdProp,\n tabs[0].id,\n );\n\n const handleTabChange: HvCanvasPanelTabsProps[\"onChange\"] = (\n event,\n tabId,\n ) => {\n setSelectedTab(tabId);\n onTabChange?.(event, tabId);\n };\n\n return (\n <div\n id={id}\n ref={ref}\n className={cx(\n classes.root,\n {\n [classes.closed]: !open,\n [classes.minimized]: minimize,\n [classes.multipleTabs]: tabs.length > 1,\n [classes.overflowing]: overflowing,\n },\n className,\n )}\n style={{\n width: `calc(100% - ${sidePanelWidth}px - 2 * ${theme.space.sm})`,\n right: theme.space.sm,\n }}\n {...others}\n >\n <div className={classes.tabsRoot}>\n <HvCanvasPanelTabs\n style={{\n // @ts-ignore\n \"--left-actions-width\":\n overflowing || !leftActions\n ? theme.space.sm\n : `calc(${leftActionWidth}px + ${theme.space.xs})`,\n \"--right-actions-width\":\n !rightActions || (overflowing && !overflowActions)\n ? theme.space.sm\n : `calc(${overflowing ? 32 : rightActionWidth}px + ${theme.space.xs})`,\n }}\n onChange={handleTabChange}\n value={selectedTab}\n >\n {tabs.map((tab, index) => (\n <HvCanvasPanelTab\n ref={index === 0 ? tabRef : undefined}\n key={tab.id}\n id={`${id}-${tab.id}`}\n value={tab.id}\n className={classes.tab}\n >\n <div className={classes.tabTitle}>\n {typeof tab.title === \"function\"\n ? tab.title(overflowing)\n : tab.title}\n </div>\n </HvCanvasPanelTab>\n ))}\n </HvCanvasPanelTabs>\n {/* For accessibility purposes, these buttons cannot be children of a tablist so they are rendered as HvCanvasTabs sibling. */}\n {leftActions || rightActions || overflowActions\n ? tabs.map((tab, index) => {\n const btnsDisabled = selectedTab !== tab.id && !minimize;\n return (\n <div\n key={tab.id}\n style={{\n // @ts-ignore\n \"--tab-width\": `${tabWidth}px`,\n \"--right\": `calc((${index} + 1) * var(--tab-width))`,\n \"--left\": `calc(${index} * var(--tab-width))`,\n }}\n >\n {leftActions && !overflowing && (\n <div\n ref={leftActionRef}\n className={cx(classes.leftActions, {\n [classes.actionsDisabled]: btnsDisabled,\n })}\n >\n <HvActionsGeneric\n maxVisibleActions={1}\n actions={leftActions}\n disabled={btnsDisabled}\n onAction={(event, action) =>\n onAction?.(event, action, tab.id)\n }\n variant=\"secondaryGhost\"\n iconOnly\n />\n </div>\n )}\n {rightActions && !overflowing && (\n <div\n ref={rightActionRef}\n className={cx(classes.rightActions, {\n [classes.actionsDisabled]: btnsDisabled,\n })}\n >\n <HvActionsGeneric\n maxVisibleActions={2}\n actions={rightActions}\n disabled={btnsDisabled}\n onAction={(event, action) =>\n onAction?.(event, action, tab.id)\n }\n variant=\"secondaryGhost\"\n iconOnly\n />\n </div>\n )}\n {overflowActions && overflowing && (\n <div\n className={cx(classes.rightActions, {\n [classes.actionsDisabled]: btnsDisabled,\n })}\n >\n <HvActionsGeneric\n maxVisibleActions={0}\n actions={overflowActions}\n disabled={btnsDisabled}\n onAction={(event, action) =>\n onAction?.(event, action, tab.id)\n }\n variant=\"secondaryGhost\"\n iconOnly\n />\n </div>\n )}\n </div>\n );\n })\n : null}\n </div>\n <HvPanel\n ref={panelRef}\n role=\"tabpanel\"\n aria-labelledby={`${id}-${selectedTab}`}\n className={classes.content}\n style={{\n // @ts-ignore\n \"--right-border-radius\":\n tabWidth * tabs.length >= panelWidth ? \"0px\" : \"16px\",\n }}\n >\n {children}\n </HvPanel>\n </div>\n );\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useState, useCallback, useMemo, useContext } from "react";
|
|
3
|
+
const HvCanvasContext = createContext(null);
|
|
4
|
+
const HvCanvasProvider = ({
|
|
5
|
+
children
|
|
6
|
+
}) => {
|
|
7
|
+
const [sidePanelOpen, setSidePanelOpen] = useState(false);
|
|
8
|
+
const [width, setWidth] = useState(0);
|
|
9
|
+
const handleSidePanelWidth = useCallback((newWidth) => {
|
|
10
|
+
setWidth(newWidth);
|
|
11
|
+
}, []);
|
|
12
|
+
const handleSidePanelOpen = useCallback((open) => {
|
|
13
|
+
setSidePanelOpen(open);
|
|
14
|
+
}, []);
|
|
15
|
+
const value = useMemo(
|
|
16
|
+
() => ({
|
|
17
|
+
sidePanelOpen,
|
|
18
|
+
handleSidePanelOpen,
|
|
19
|
+
sidePanelWidth: sidePanelOpen ? width : 0,
|
|
20
|
+
handleSidePanelWidth
|
|
21
|
+
}),
|
|
22
|
+
[sidePanelOpen, handleSidePanelOpen, width, handleSidePanelWidth]
|
|
23
|
+
);
|
|
24
|
+
return /* @__PURE__ */ jsx(HvCanvasContext.Provider, { value, children });
|
|
25
|
+
};
|
|
26
|
+
const useCanvasContext = () => {
|
|
27
|
+
return useContext(HvCanvasContext);
|
|
28
|
+
};
|
|
29
|
+
export {
|
|
30
|
+
HvCanvasContext,
|
|
31
|
+
HvCanvasProvider,
|
|
32
|
+
useCanvasContext
|
|
33
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanvasContext.js","sources":["../../../src/Canvas/CanvasContext.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\n\ntype HvCanvasContextValue = {\n sidePanelOpen: boolean;\n handleSidePanelOpen: (open: boolean) => void;\n sidePanelWidth: number;\n handleSidePanelWidth: (width: number) => void;\n};\n\nexport const HvCanvasContext = createContext<HvCanvasContextValue | null>(null);\n\nexport const HvCanvasProvider = ({\n children,\n}: {\n children: React.ReactNode;\n onSidePanelResize?: (width: number) => void;\n}) => {\n const [sidePanelOpen, setSidePanelOpen] = useState(false);\n const [width, setWidth] = useState(0);\n\n const handleSidePanelWidth = useCallback((newWidth: number) => {\n setWidth(newWidth);\n }, []);\n\n const handleSidePanelOpen = useCallback((open: boolean) => {\n setSidePanelOpen(open);\n }, []);\n\n const value = useMemo(\n () => ({\n sidePanelOpen,\n handleSidePanelOpen,\n sidePanelWidth: sidePanelOpen ? width : 0,\n handleSidePanelWidth,\n }),\n [sidePanelOpen, handleSidePanelOpen, width, handleSidePanelWidth],\n );\n\n return (\n <HvCanvasContext.Provider value={value}>\n {children}\n </HvCanvasContext.Provider>\n );\n};\n\nexport const useCanvasContext = () => {\n return useContext(HvCanvasContext);\n};\n"],"names":[],"mappings":";;AAea,MAAA,kBAAkB,cAA2C,IAAI;AAEvE,MAAM,mBAAmB,CAAC;AAAA,EAC/B;AACF,MAGM;AACJ,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AACxD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,CAAC;AAE9B,QAAA,uBAAuB,YAAY,CAAC,aAAqB;AAC7D,aAAS,QAAQ;AAAA,EACnB,GAAG,EAAE;AAEC,QAAA,sBAAsB,YAAY,CAAC,SAAkB;AACzD,qBAAiB,IAAI;AAAA,EACvB,GAAG,EAAE;AAEL,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,gBAAgB,gBAAgB,QAAQ;AAAA,MACxC;AAAA,IAAA;AAAA,IAEF,CAAC,eAAe,qBAAqB,OAAO,oBAAoB;AAAA,EAClE;AAEA,SACG,oBAAA,gBAAgB,UAAhB,EAAyB,OACvB,SACH,CAAA;AAEJ;AAEO,MAAM,mBAAmB,MAAM;AACpC,SAAO,WAAW,eAAe;AACnC;"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef } from "react";
|
|
2
|
+
import { forwardRef, useEffect } from "react";
|
|
3
3
|
import { useDefaultProps, useUniqueId, useLabels, useControlled, HvPanel, HvIconButton } from "@hitachivantara/uikit-react-core";
|
|
4
4
|
import { End } from "@hitachivantara/uikit-react-icons";
|
|
5
|
+
import { useCanvasContext } from "../CanvasContext.js";
|
|
5
6
|
import { useClasses } from "./SidePanel.styles.js";
|
|
6
7
|
import { staticClasses } from "./SidePanel.styles.js";
|
|
7
8
|
import { useResizable } from "./useResizable.js";
|
|
@@ -21,12 +22,20 @@ const HvCanvasSidePanel = forwardRef((props, ref) => {
|
|
|
21
22
|
onToggle,
|
|
22
23
|
onTabChange,
|
|
23
24
|
labels: labelsProp,
|
|
25
|
+
minWidth = 100,
|
|
26
|
+
maxWidth = 500,
|
|
27
|
+
initialWidth = 320,
|
|
28
|
+
onResize,
|
|
24
29
|
className,
|
|
25
30
|
children,
|
|
26
31
|
classes: classesProp,
|
|
27
32
|
...others
|
|
28
33
|
} = useDefaultProps("HvCanvasSidePanel", props);
|
|
29
34
|
const id = useUniqueId(idProp);
|
|
35
|
+
const canvasContext = useCanvasContext();
|
|
36
|
+
const handleSidePanelWidth = canvasContext?.handleSidePanelWidth;
|
|
37
|
+
const sidePanelOpen = canvasContext?.sidePanelOpen;
|
|
38
|
+
const handleSidePanelOpen = canvasContext?.handleSidePanelOpen;
|
|
30
39
|
const { classes, cx } = useClasses(classesProp);
|
|
31
40
|
const labels = useLabels(DEFAULT_LABELS, labelsProp);
|
|
32
41
|
const [open, setOpen] = useControlled(openProp, Boolean(defaultOpen));
|
|
@@ -34,14 +43,23 @@ const HvCanvasSidePanel = forwardRef((props, ref) => {
|
|
|
34
43
|
tabProp,
|
|
35
44
|
tabs?.[0]?.id ?? "none"
|
|
36
45
|
);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
handleSidePanelWidth?.(initialWidth);
|
|
48
|
+
}, [initialWidth]);
|
|
49
|
+
const updateWidth = (width2) => {
|
|
50
|
+
handleSidePanelWidth?.(width2);
|
|
51
|
+
onResize?.(width2);
|
|
52
|
+
};
|
|
37
53
|
const { width, isDragging, getContainerProps, getSeparatorProps } = useResizable({
|
|
38
54
|
ref,
|
|
39
|
-
initialWidth
|
|
40
|
-
minWidth
|
|
41
|
-
maxWidth
|
|
55
|
+
initialWidth,
|
|
56
|
+
minWidth,
|
|
57
|
+
maxWidth,
|
|
58
|
+
onResize: updateWidth
|
|
42
59
|
});
|
|
43
60
|
const handleTogglePanel = (event) => {
|
|
44
61
|
setOpen((prev) => !prev);
|
|
62
|
+
handleSidePanelOpen?.(!sidePanelOpen);
|
|
45
63
|
onToggle?.(event, !open);
|
|
46
64
|
};
|
|
47
65
|
const handleTabChange = (event, tabId) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SidePanel.js","sources":["../../../../src/Canvas/SidePanel/SidePanel.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport {\n ExtractNames,\n HvBaseProps,\n HvIconButton,\n HvPanel,\n useControlled,\n useDefaultProps,\n useLabels,\n useUniqueId,\n} from \"@hitachivantara/uikit-react-core\";\nimport { End } from \"@hitachivantara/uikit-react-icons\";\n\nimport { HvCanvasPanelTab } from \"../PanelTab\";\nimport { HvCanvasPanelTabs, HvCanvasPanelTabsProps } from \"../PanelTabs\";\nimport { staticClasses, useClasses } from \"./SidePanel.styles\";\nimport { useResizable } from \"./useResizable\";\n\nexport { staticClasses as canvasSidePanelClasses };\n\nexport type HvCanvasSidePanelClasses = ExtractNames<typeof useClasses>;\n\nconst DEFAULT_LABELS = {\n open: \"Open\",\n close: \"Close\",\n};\n\nexport interface HvCanvasSidePanelProps\n extends HvBaseProps<HTMLDivElement, \"onToggle\"> {\n /** When controlled, defines id the panel is open or not. */\n open?: boolean;\n /** When uncontrolled, defines the initial state of the panel. */\n defaultOpen?: boolean;\n /** List of tabs visible on the panel. */\n tabs?: {\n id: string | number;\n content: React.ReactNode;\n }[];\n /** Id of the selected tab if it needs to be controlled. */\n tab?: string | number;\n /** Callback triggered whenever the panel toggles. */\n onToggle?: (\n event: React.MouseEvent | React.KeyboardEvent,\n open: boolean,\n ) => void;\n /** Callback triggered when a tab changes/is clicked. */\n onTabChange?: (\n event: React.SyntheticEvent | null,\n tabId: string | number | null,\n ) => void;\n /** An object containing all the labels. */\n labels?: Partial<typeof DEFAULT_LABELS>;\n /** The content that will be rendered within the canvas panel. */\n children?: React.ReactNode;\n /** A Jss Object used to override or extend the styles applied. */\n classes?: HvCanvasSidePanelClasses;\n}\n\n/**\n * A side panel component to use in a canvas context.\n */\nexport const HvCanvasSidePanel = forwardRef<\n HTMLDivElement,\n HvCanvasSidePanelProps\n>((props, ref) => {\n const {\n id: idProp,\n tab: tabProp,\n open: openProp,\n defaultOpen = false,\n tabs,\n onToggle,\n onTabChange,\n labels: labelsProp,\n className,\n children,\n classes: classesProp,\n ...others\n } = useDefaultProps(\"HvCanvasSidePanel\", props);\n\n const id = useUniqueId(idProp);\n\n const { classes, cx } = useClasses(classesProp);\n\n const labels = useLabels(DEFAULT_LABELS, labelsProp);\n\n const [open, setOpen] = useControlled(openProp, Boolean(defaultOpen));\n const [selectedTab, setSelectedTab] = useControlled<string | number | null>(\n tabProp,\n tabs?.[0]?.id ?? \"none\",\n );\n\n const { width, isDragging, getContainerProps, getSeparatorProps } =\n useResizable({\n ref,\n initialWidth
|
|
1
|
+
{"version":3,"file":"SidePanel.js","sources":["../../../../src/Canvas/SidePanel/SidePanel.tsx"],"sourcesContent":["import { forwardRef, useEffect } from \"react\";\nimport {\n ExtractNames,\n HvBaseProps,\n HvIconButton,\n HvPanel,\n useControlled,\n useDefaultProps,\n useLabels,\n useUniqueId,\n} from \"@hitachivantara/uikit-react-core\";\nimport { End } from \"@hitachivantara/uikit-react-icons\";\n\nimport { useCanvasContext } from \"../CanvasContext\";\nimport { HvCanvasPanelTab } from \"../PanelTab\";\nimport { HvCanvasPanelTabs, HvCanvasPanelTabsProps } from \"../PanelTabs\";\nimport { staticClasses, useClasses } from \"./SidePanel.styles\";\nimport { useResizable } from \"./useResizable\";\n\nexport { staticClasses as canvasSidePanelClasses };\n\nexport type HvCanvasSidePanelClasses = ExtractNames<typeof useClasses>;\n\nconst DEFAULT_LABELS = {\n open: \"Open\",\n close: \"Close\",\n};\n\nexport interface HvCanvasSidePanelProps\n extends HvBaseProps<HTMLDivElement, \"onToggle\" | \"onResize\"> {\n /** When controlled, defines id the panel is open or not. */\n open?: boolean;\n /** When uncontrolled, defines the initial state of the panel. */\n defaultOpen?: boolean;\n /** List of tabs visible on the panel. */\n tabs?: {\n id: string | number;\n content: React.ReactNode;\n }[];\n /** Id of the selected tab if it needs to be controlled. */\n tab?: string | number;\n /** Callback triggered whenever the panel toggles. */\n onToggle?: (\n event: React.MouseEvent | React.KeyboardEvent,\n open: boolean,\n ) => void;\n /** Callback triggered when a tab changes/is clicked. */\n onTabChange?: (\n event: React.SyntheticEvent | null,\n tabId: string | number | null,\n ) => void;\n /** An object containing all the labels. */\n labels?: Partial<typeof DEFAULT_LABELS>;\n /** The minimum width of the side panel. */\n minWidth?: number;\n /** The maximum width of the side panel. */\n maxWidth?: number;\n /** The initial width of the side panel. */\n initialWidth?: number;\n /** Callback triggered when the panel width changes. */\n onResize?: (width: number) => void;\n /** The content that will be rendered within the canvas panel. */\n children?: React.ReactNode;\n /** A Jss Object used to override or extend the styles applied. */\n classes?: HvCanvasSidePanelClasses;\n}\n\n/**\n * A side panel component to use in a canvas context.\n */\nexport const HvCanvasSidePanel = forwardRef<\n HTMLDivElement,\n HvCanvasSidePanelProps\n>((props, ref) => {\n const {\n id: idProp,\n tab: tabProp,\n open: openProp,\n defaultOpen = false,\n tabs,\n onToggle,\n onTabChange,\n labels: labelsProp,\n minWidth = 100,\n maxWidth = 500,\n initialWidth = 320,\n onResize,\n className,\n children,\n classes: classesProp,\n ...others\n } = useDefaultProps(\"HvCanvasSidePanel\", props);\n\n const id = useUniqueId(idProp);\n\n const canvasContext = useCanvasContext();\n const handleSidePanelWidth = canvasContext?.handleSidePanelWidth;\n const sidePanelOpen = canvasContext?.sidePanelOpen;\n const handleSidePanelOpen = canvasContext?.handleSidePanelOpen;\n\n const { classes, cx } = useClasses(classesProp);\n\n const labels = useLabels(DEFAULT_LABELS, labelsProp);\n\n const [open, setOpen] = useControlled(openProp, Boolean(defaultOpen));\n const [selectedTab, setSelectedTab] = useControlled<string | number | null>(\n tabProp,\n tabs?.[0]?.id ?? \"none\",\n );\n\n useEffect(() => {\n handleSidePanelWidth?.(initialWidth);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialWidth]);\n\n const updateWidth = (width: number) => {\n handleSidePanelWidth?.(width);\n onResize?.(width);\n };\n\n const { width, isDragging, getContainerProps, getSeparatorProps } =\n useResizable({\n ref,\n initialWidth,\n minWidth,\n maxWidth,\n onResize: updateWidth,\n });\n\n const handleTogglePanel = (event: React.MouseEvent | React.KeyboardEvent) => {\n setOpen((prev) => !prev);\n handleSidePanelOpen?.(!sidePanelOpen);\n onToggle?.(event, !open);\n };\n\n const handleTabChange: HvCanvasPanelTabsProps[\"onChange\"] = (\n event,\n tabId,\n ) => {\n setSelectedTab(tabId);\n onTabChange?.(event, tabId);\n };\n\n return (\n <>\n <div\n id={id}\n className={cx(classes.root, className, {\n [classes.open]: open,\n [classes.close]: !open,\n })}\n {...getContainerProps({ style: { ...(!open && { width: 0 }) } })}\n {...others}\n >\n {tabs && (\n <HvCanvasPanelTabs\n className={classes.tabs}\n value={selectedTab}\n onChange={handleTabChange}\n >\n {tabs.map((tab) => (\n <HvCanvasPanelTab\n key={tab.id}\n id={`${id}-${tab.id}`}\n value={tab.id}\n >\n {tab.content}\n </HvCanvasPanelTab>\n ))}\n </HvCanvasPanelTabs>\n )}\n <HvPanel\n role={tabs ? \"tabpanel\" : undefined}\n aria-labelledby={tabs ? `${id}-${selectedTab}` : undefined}\n className={classes.content}\n >\n {children}\n </HvPanel>\n </div>\n <div {...getSeparatorProps()} />\n <HvIconButton\n variant=\"primaryGhost\"\n title={open ? labels.close : labels.open}\n onClick={handleTogglePanel}\n className={cx(classes.handle, {\n [classes.handleOpen]: open,\n [classes.handleClose]: !open,\n })}\n style={{\n left: open ? width : 0,\n transition: isDragging ? \"none\" : undefined,\n }}\n >\n <End rotate={open} />\n </HvIconButton>\n </>\n );\n});\n"],"names":["width"],"mappings":"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"}
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import { useState, useRef } from "react";
|
|
2
2
|
import { useForkRef } from "@hitachivantara/uikit-react-core";
|
|
3
3
|
const useResizable = (resizableOptions) => {
|
|
4
|
-
const {
|
|
5
|
-
ref,
|
|
6
|
-
initialWidth = 320,
|
|
7
|
-
minWidth = 100,
|
|
8
|
-
maxWidth = 600
|
|
9
|
-
} = resizableOptions;
|
|
4
|
+
const { ref, initialWidth, minWidth, maxWidth, onResize } = resizableOptions;
|
|
10
5
|
const [width, setWidth] = useState(initialWidth);
|
|
11
6
|
const [isHover, setIsHover] = useState(false);
|
|
12
7
|
const [isDragging, setIsDragging] = useState(false);
|
|
@@ -18,6 +13,7 @@ const useResizable = (resizableOptions) => {
|
|
|
18
13
|
const newWidth = event.clientX - rect.left;
|
|
19
14
|
if (newWidth >= minWidth && newWidth <= maxWidth) {
|
|
20
15
|
setWidth(newWidth);
|
|
16
|
+
onResize?.(newWidth);
|
|
21
17
|
}
|
|
22
18
|
}
|
|
23
19
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useResizable.js","sources":["../../../../src/Canvas/SidePanel/useResizable.tsx"],"sourcesContent":["import { useRef, useState } from \"react\";\nimport { useForkRef } from \"@hitachivantara/uikit-react-core\";\n\ninterface ContainerProps {\n ref: any;\n style: React.CSSProperties;\n}\n\ninterface SeparatorProps {\n style: React.CSSProperties;\n onMouseMove?: (event: React.MouseEvent<HTMLDivElement>) => void;\n onMouseLeave?: () => void;\n onMouseDown?: () => void;\n role: string;\n}\n\ninterface ResizableProps {\n ref: any;\n initialWidth
|
|
1
|
+
{"version":3,"file":"useResizable.js","sources":["../../../../src/Canvas/SidePanel/useResizable.tsx"],"sourcesContent":["import { useRef, useState } from \"react\";\nimport { useForkRef } from \"@hitachivantara/uikit-react-core\";\n\ninterface ContainerProps {\n ref: any;\n style: React.CSSProperties;\n}\n\ninterface SeparatorProps {\n style: React.CSSProperties;\n onMouseMove?: (event: React.MouseEvent<HTMLDivElement>) => void;\n onMouseLeave?: () => void;\n onMouseDown?: () => void;\n role: string;\n}\n\ninterface ResizableProps {\n ref: any;\n initialWidth: number;\n minWidth: number;\n maxWidth: number;\n onResize?: (width: number) => void;\n}\n\nexport const useResizable = (\n resizableOptions: ResizableProps,\n): {\n width: number;\n isDragging: boolean;\n getContainerProps: (overrides: any) => ContainerProps;\n getSeparatorProps: () => SeparatorProps;\n} => {\n const { ref, initialWidth, minWidth, maxWidth, onResize } = resizableOptions;\n\n const [width, setWidth] = useState(initialWidth);\n const [isHover, setIsHover] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n\n const panelRef = useRef<HTMLDivElement>(null);\n\n const forkedRef = useForkRef(ref, panelRef);\n\n const mouseMove = (event: MouseEvent) => {\n if (panelRef.current) {\n const rect = panelRef.current.getBoundingClientRect();\n const newWidth = event.clientX - rect.left;\n if (newWidth >= minWidth && newWidth <= maxWidth) {\n setWidth(newWidth);\n onResize?.(newWidth);\n }\n }\n };\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n if (panelRef.current) {\n const rect = panelRef.current.getBoundingClientRect();\n const isHoverBorder =\n event.clientX >= rect.right - 5 && event.clientX <= rect.right + 5;\n setIsHover(isHoverBorder);\n }\n };\n\n const handleMouseUp = () => {\n if (!panelRef.current) return;\n\n panelRef.current.style.userSelect = \"\";\n panelRef.current?.parentElement?.removeEventListener(\n \"mousemove\",\n mouseMove,\n );\n panelRef.current?.parentElement?.removeEventListener(\n \"mouseup\",\n handleMouseUp,\n );\n setIsDragging(false);\n };\n\n const startResizing = () => {\n if (!panelRef.current) return;\n\n panelRef.current.style.userSelect = \"none\";\n panelRef.current.parentElement?.addEventListener(\"mousemove\", mouseMove);\n panelRef.current.parentElement?.addEventListener(\"mouseup\", handleMouseUp);\n setIsDragging(true);\n };\n\n const getContainerProps = (\n overrides: Partial<ContainerProps> = {},\n ): ContainerProps => ({\n ref: forkedRef,\n style: {\n width,\n transition: isDragging ? \"none\" : undefined,\n ...overrides.style,\n },\n });\n\n const getSeparatorProps = (\n overrides: Partial<SeparatorProps> = {},\n ): SeparatorProps => ({\n style: {\n left: width,\n position: \"absolute\",\n top: 0,\n bottom: 0,\n width: 5,\n cursor: \"col-resize\",\n ...overrides.style,\n },\n onMouseMove: handleMouseMove,\n onMouseLeave: () => setIsHover(false),\n onMouseDown: () => {\n if (isHover) startResizing();\n },\n role: \"separator\",\n });\n\n return { width, isDragging, getContainerProps, getSeparatorProps };\n};\n"],"names":[],"mappings":";;AAwBa,MAAA,eAAe,CAC1B,qBAMG;AACH,QAAM,EAAE,KAAK,cAAc,UAAU,UAAU,aAAa;AAE5D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,YAAY;AAC/C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAE5C,QAAA,WAAW,OAAuB,IAAI;AAEtC,QAAA,YAAY,WAAW,KAAK,QAAQ;AAEpC,QAAA,YAAY,CAAC,UAAsB;AACvC,QAAI,SAAS,SAAS;AACd,YAAA,OAAO,SAAS,QAAQ,sBAAsB;AAC9C,YAAA,WAAW,MAAM,UAAU,KAAK;AAClC,UAAA,YAAY,YAAY,YAAY,UAAU;AAChD,iBAAS,QAAQ;AACjB,mBAAW,QAAQ;AAAA,MAAA;AAAA,IACrB;AAAA,EAEJ;AAEM,QAAA,kBAAkB,CAAC,UAA4C;AACnE,QAAI,SAAS,SAAS;AACd,YAAA,OAAO,SAAS,QAAQ,sBAAsB;AAC9C,YAAA,gBACJ,MAAM,WAAW,KAAK,QAAQ,KAAK,MAAM,WAAW,KAAK,QAAQ;AACnE,iBAAW,aAAa;AAAA,IAAA;AAAA,EAE5B;AAEA,QAAM,gBAAgB,MAAM;AACtB,QAAA,CAAC,SAAS,QAAS;AAEd,aAAA,QAAQ,MAAM,aAAa;AACpC,aAAS,SAAS,eAAe;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AACA,aAAS,SAAS,eAAe;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AACA,kBAAc,KAAK;AAAA,EACrB;AAEA,QAAM,gBAAgB,MAAM;AACtB,QAAA,CAAC,SAAS,QAAS;AAEd,aAAA,QAAQ,MAAM,aAAa;AACpC,aAAS,QAAQ,eAAe,iBAAiB,aAAa,SAAS;AACvE,aAAS,QAAQ,eAAe,iBAAiB,WAAW,aAAa;AACzE,kBAAc,IAAI;AAAA,EACpB;AAEA,QAAM,oBAAoB,CACxB,YAAqC,QACjB;AAAA,IACpB,KAAK;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,YAAY,aAAa,SAAS;AAAA,MAClC,GAAG,UAAU;AAAA,IAAA;AAAA,EACf;AAGF,QAAM,oBAAoB,CACxB,YAAqC,QACjB;AAAA,IACpB,OAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,GAAG,UAAU;AAAA,IACf;AAAA,IACA,aAAa;AAAA,IACb,cAAc,MAAM,WAAW,KAAK;AAAA,IACpC,aAAa,MAAM;AACjB,UAAI,QAAuB,eAAA;AAAA,IAC7B;AAAA,IACA,MAAM;AAAA,EAAA;AAGR,SAAO,EAAE,OAAO,YAAY,mBAAmB,kBAAkB;AACnE;"}
|
|
@@ -2,6 +2,8 @@ import { jsxs, jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef } from "react";
|
|
3
3
|
import { useDefaultProps, useLabels, HvIconButton, HvTypography } from "@hitachivantara/uikit-react-core";
|
|
4
4
|
import { Previous } from "@hitachivantara/uikit-react-icons";
|
|
5
|
+
import { mergeStyles } from "@hitachivantara/uikit-react-utils";
|
|
6
|
+
import { useCanvasContext } from "../CanvasContext.js";
|
|
5
7
|
import { useClasses } from "./Toolbar.styles.js";
|
|
6
8
|
import { staticClasses } from "./Toolbar.styles.js";
|
|
7
9
|
const DEFAULT_LABELS = {
|
|
@@ -14,6 +16,7 @@ const HvCanvasToolbar = forwardRef(
|
|
|
14
16
|
backButton,
|
|
15
17
|
labels: labelsProp,
|
|
16
18
|
className,
|
|
19
|
+
style,
|
|
17
20
|
children,
|
|
18
21
|
backButtonProps,
|
|
19
22
|
classes: classesProp,
|
|
@@ -21,20 +24,33 @@ const HvCanvasToolbar = forwardRef(
|
|
|
21
24
|
} = useDefaultProps("HvCanvasToolbar", props);
|
|
22
25
|
const { classes, cx } = useClasses(classesProp);
|
|
23
26
|
const labels = useLabels(DEFAULT_LABELS, labelsProp);
|
|
27
|
+
const canvasContext = useCanvasContext();
|
|
28
|
+
const sidePanelWidth = canvasContext?.sidePanelWidth ?? 0;
|
|
24
29
|
const title = typeof titleProp === "string" ? /* @__PURE__ */ jsx(HvTypography, { variant: "title4", children: titleProp }) : titleProp;
|
|
25
|
-
return /* @__PURE__ */ jsxs(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
30
|
+
return /* @__PURE__ */ jsxs(
|
|
31
|
+
"div",
|
|
32
|
+
{
|
|
33
|
+
ref,
|
|
34
|
+
className: cx(classes.root, className),
|
|
35
|
+
style: mergeStyles(style, {
|
|
36
|
+
"--sidepanel-width": `${sidePanelWidth}px`
|
|
37
|
+
}),
|
|
38
|
+
...others,
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ jsx("div", { className: classes.back, children: backButton ?? /* @__PURE__ */ jsx(
|
|
41
|
+
HvIconButton,
|
|
42
|
+
{
|
|
43
|
+
title: labels.back,
|
|
44
|
+
variant: "primaryGhost",
|
|
45
|
+
...backButtonProps,
|
|
46
|
+
children: /* @__PURE__ */ jsx(Previous, {})
|
|
47
|
+
}
|
|
48
|
+
) }),
|
|
49
|
+
/* @__PURE__ */ jsx("div", { className: classes.title, children: title }),
|
|
50
|
+
children && /* @__PURE__ */ jsx("div", { className: classes.actions, children })
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
);
|
|
38
54
|
}
|
|
39
55
|
);
|
|
40
56
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.js","sources":["../../../../src/Canvas/Toolbar/Toolbar.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport {\n ExtractNames,\n HvBaseProps,\n HvIconButton,\n HvIconButtonProps,\n HvTypography,\n useDefaultProps,\n useLabels,\n} from \"@hitachivantara/uikit-react-core\";\nimport { Previous } from \"@hitachivantara/uikit-react-icons\";\n\nimport { staticClasses, useClasses } from \"./Toolbar.styles\";\n\nexport { staticClasses as canvasToolbarClasses };\n\nexport type HvCanvasToolbarClasses = ExtractNames<typeof useClasses>;\n\nconst DEFAULT_LABELS = {\n back: \"Back\",\n};\n\nexport interface HvCanvasToolbarProps\n extends HvBaseProps<HTMLDivElement, \"title\"> {\n /** Text to display in the component. */\n title: React.ReactNode;\n /** Fully customized button or false for when the back button should not be rendered. */\n backButton?: React.ReactNode;\n /** An object containing all the labels. */\n labels?: Partial<typeof DEFAULT_LABELS>;\n /* The content that will be rendered within the toolbar. */\n children?: React.ReactNode;\n /** Props for the default back button. */\n backButtonProps?: Partial<HvIconButtonProps>;\n /** A Jss Object used to override or extend the styles applied. */\n classes?: HvCanvasToolbarClasses;\n}\n\n/**\n * A toolbar component to use in a canvas context.\n */\nexport const HvCanvasToolbar = forwardRef<HTMLDivElement, HvCanvasToolbarProps>(\n (props, ref) => {\n const {\n title: titleProp,\n backButton,\n labels: labelsProp,\n className,\n children,\n backButtonProps,\n classes: classesProp,\n ...others\n } = useDefaultProps(\"HvCanvasToolbar\", props);\n\n const { classes, cx } = useClasses(classesProp);\n const labels = useLabels(DEFAULT_LABELS, labelsProp);\n\n const title =\n typeof titleProp === \"string\" ? (\n <HvTypography variant=\"title4\">{titleProp}</HvTypography>\n ) : (\n titleProp\n );\n\n return (\n <div
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sources":["../../../../src/Canvas/Toolbar/Toolbar.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport {\n ExtractNames,\n HvBaseProps,\n HvIconButton,\n HvIconButtonProps,\n HvTypography,\n useDefaultProps,\n useLabels,\n} from \"@hitachivantara/uikit-react-core\";\nimport { Previous } from \"@hitachivantara/uikit-react-icons\";\nimport { mergeStyles } from \"@hitachivantara/uikit-react-utils\";\n\nimport { useCanvasContext } from \"../CanvasContext\";\nimport { staticClasses, useClasses } from \"./Toolbar.styles\";\n\nexport { staticClasses as canvasToolbarClasses };\n\nexport type HvCanvasToolbarClasses = ExtractNames<typeof useClasses>;\n\nconst DEFAULT_LABELS = {\n back: \"Back\",\n};\n\nexport interface HvCanvasToolbarProps\n extends HvBaseProps<HTMLDivElement, \"title\"> {\n /** Text to display in the component. */\n title: React.ReactNode;\n /** Fully customized button or false for when the back button should not be rendered. */\n backButton?: React.ReactNode;\n /** An object containing all the labels. */\n labels?: Partial<typeof DEFAULT_LABELS>;\n /* The content that will be rendered within the toolbar. */\n children?: React.ReactNode;\n /** Props for the default back button. */\n backButtonProps?: Partial<HvIconButtonProps>;\n /** A Jss Object used to override or extend the styles applied. */\n classes?: HvCanvasToolbarClasses;\n}\n\n/**\n * A toolbar component to use in a canvas context.\n */\nexport const HvCanvasToolbar = forwardRef<HTMLDivElement, HvCanvasToolbarProps>(\n (props, ref) => {\n const {\n title: titleProp,\n backButton,\n labels: labelsProp,\n className,\n style,\n children,\n backButtonProps,\n classes: classesProp,\n ...others\n } = useDefaultProps(\"HvCanvasToolbar\", props);\n\n const { classes, cx } = useClasses(classesProp);\n const labels = useLabels(DEFAULT_LABELS, labelsProp);\n\n const canvasContext = useCanvasContext();\n const sidePanelWidth = canvasContext?.sidePanelWidth ?? 0;\n\n const title =\n typeof titleProp === \"string\" ? (\n <HvTypography variant=\"title4\">{titleProp}</HvTypography>\n ) : (\n titleProp\n );\n\n return (\n <div\n ref={ref}\n className={cx(classes.root, className)}\n style={mergeStyles(style, {\n \"--sidepanel-width\": `${sidePanelWidth}px`,\n })}\n {...others}\n >\n <div className={classes.back}>\n {backButton ?? (\n <HvIconButton\n title={labels.back}\n variant=\"primaryGhost\"\n {...backButtonProps}\n >\n <Previous />\n </HvIconButton>\n )}\n </div>\n <div className={classes.title}>{title}</div>\n {children && <div className={classes.actions}>{children}</div>}\n </div>\n );\n },\n);\n"],"names":[],"mappings":";;;;;;;;AAoBA,MAAM,iBAAiB;AAAA,EACrB,MAAM;AACR;AAqBO,MAAM,kBAAkB;AAAA,EAC7B,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,GAAG;AAAA,IAAA,IACD,gBAAgB,mBAAmB,KAAK;AAE5C,UAAM,EAAE,SAAS,OAAO,WAAW,WAAW;AACxC,UAAA,SAAS,UAAU,gBAAgB,UAAU;AAEnD,UAAM,gBAAgB,iBAAiB;AACjC,UAAA,iBAAiB,eAAe,kBAAkB;AAElD,UAAA,QACJ,OAAO,cAAc,+BAClB,cAAa,EAAA,SAAQ,UAAU,UAAA,UAAA,CAAU,IAE1C;AAIF,WAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,QAAQ,MAAM,SAAS;AAAA,QACrC,OAAO,YAAY,OAAO;AAAA,UACxB,qBAAqB,GAAG,cAAc;AAAA,QAAA,CACvC;AAAA,QACA,GAAG;AAAA,QAEJ,UAAA;AAAA,UAAA,oBAAC,OAAI,EAAA,WAAW,QAAQ,MACrB,UACC,cAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO,OAAO;AAAA,cACd,SAAQ;AAAA,cACP,GAAG;AAAA,cAEJ,8BAAC,UAAS,CAAA,CAAA;AAAA,YAAA;AAAA,UAAA,GAGhB;AAAA,UACC,oBAAA,OAAA,EAAI,WAAW,QAAQ,OAAQ,UAAM,OAAA;AAAA,UACrC,YAAa,oBAAA,OAAA,EAAI,WAAW,QAAQ,SAAU,SAAS,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAC1D;AAAA,EAAA;AAGN;"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { createClasses, theme } from "@hitachivantara/uikit-react-core";
|
|
2
2
|
const { staticClasses, useClasses } = createClasses("HvCanvasToolbar", {
|
|
3
3
|
root: {
|
|
4
|
-
width:
|
|
4
|
+
width: `calc(100% - var(--sidepanel-width) - 2 * ${theme.space.sm})`,
|
|
5
5
|
height: 54,
|
|
6
6
|
display: "flex",
|
|
7
7
|
alignItems: "center",
|
|
8
8
|
borderRadius: theme.radii.full,
|
|
9
9
|
backgroundColor: theme.colors.atmo1,
|
|
10
10
|
position: "absolute",
|
|
11
|
-
right:
|
|
11
|
+
right: theme.space.sm,
|
|
12
12
|
top: 0,
|
|
13
13
|
transition: "width 0.3s ease"
|
|
14
14
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.styles.js","sources":["../../../../src/Canvas/Toolbar/Toolbar.styles.tsx"],"sourcesContent":["import { createClasses, theme } from \"@hitachivantara/uikit-react-core\";\n\nexport const { staticClasses, useClasses } = createClasses(\"HvCanvasToolbar\", {\n root: {\n width:
|
|
1
|
+
{"version":3,"file":"Toolbar.styles.js","sources":["../../../../src/Canvas/Toolbar/Toolbar.styles.tsx"],"sourcesContent":["import { createClasses, theme } from \"@hitachivantara/uikit-react-core\";\n\nexport const { staticClasses, useClasses } = createClasses(\"HvCanvasToolbar\", {\n root: {\n width: `calc(100% - var(--sidepanel-width) - 2 * ${theme.space.sm})`,\n height: 54,\n display: \"flex\",\n alignItems: \"center\",\n borderRadius: theme.radii.full,\n backgroundColor: theme.colors.atmo1,\n position: \"absolute\",\n right: theme.space.sm,\n top: 0,\n transition: \"width 0.3s ease\",\n },\n back: {\n borderRadius: `${theme.radii.full} 0 0 ${theme.radii.full}`,\n minWidth: 68,\n backgroundColor: theme.colors.containerBackgroundHover,\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n title: {\n display: \"flex\",\n alignItems: \"center\",\n padding: theme.spacing(0, \"md\"),\n height: \"100%\",\n flexGrow: 1,\n },\n actions: {\n display: \"flex\",\n flexWrap: \"nowrap\",\n overflow: \"auto\",\n paddingRight: theme.space.md,\n },\n});\n"],"names":[],"mappings":";AAEO,MAAM,EAAE,eAAe,eAAe,cAAc,mBAAmB;AAAA,EAC5E,MAAM;AAAA,IACJ,OAAO,4CAA4C,MAAM,MAAM,EAAE;AAAA,IACjE,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,MAAM,MAAM;AAAA,IAC1B,iBAAiB,MAAM,OAAO;AAAA,IAC9B,UAAU;AAAA,IACV,OAAO,MAAM,MAAM;AAAA,IACnB,KAAK;AAAA,IACL,YAAY;AAAA,EACd;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,GAAG,MAAM,MAAM,IAAI,QAAQ,MAAM,MAAM,IAAI;AAAA,IACzD,UAAU;AAAA,IACV,iBAAiB,MAAM,OAAO;AAAA,IAC9B,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS,MAAM,QAAQ,GAAG,IAAI;AAAA,IAC9B,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,cAAc,MAAM,MAAM;AAAA,EAAA;AAE9B,CAAC;"}
|
package/dist/esm/index.js
CHANGED
|
@@ -10,10 +10,13 @@ import { staticClasses as staticClasses5 } from "./Canvas/Toolbar/Toolbar.styles
|
|
|
10
10
|
import { HvCanvasToolbar } from "./Canvas/Toolbar/Toolbar.js";
|
|
11
11
|
import { staticClasses as staticClasses6 } from "./Canvas/ToolbarTabs/ToolbarTabs.styles.js";
|
|
12
12
|
import { HvCanvasToolbarTabs } from "./Canvas/ToolbarTabs/ToolbarTabs.js";
|
|
13
|
+
import { HvCanvasContext, HvCanvasProvider, useCanvasContext } from "./Canvas/CanvasContext.js";
|
|
13
14
|
export {
|
|
14
15
|
HvCanvasBottomPanel,
|
|
16
|
+
HvCanvasContext,
|
|
15
17
|
HvCanvasPanelTab,
|
|
16
18
|
HvCanvasPanelTabs,
|
|
19
|
+
HvCanvasProvider,
|
|
17
20
|
HvCanvasSidePanel,
|
|
18
21
|
HvCanvasToolbar,
|
|
19
22
|
HvCanvasToolbarTabs,
|
|
@@ -22,5 +25,6 @@ export {
|
|
|
22
25
|
staticClasses3 as canvasPanelTabsClasses,
|
|
23
26
|
staticClasses4 as canvasSidePanelClasses,
|
|
24
27
|
staticClasses5 as canvasToolbarClasses,
|
|
25
|
-
staticClasses6 as canvasToolbarTabsClasses
|
|
28
|
+
staticClasses6 as canvasToolbarTabsClasses,
|
|
29
|
+
useCanvasContext
|
|
26
30
|
};
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
|
|
3
|
+
import { Context } from 'react';
|
|
1
4
|
import { ExtractNames } from '@hitachivantara/uikit-react-core';
|
|
2
5
|
import { ForwardRefExoticComponent } from 'react';
|
|
3
6
|
import { HvActionGeneric } from '@hitachivantara/uikit-react-core';
|
|
4
7
|
import { HvActionsGenericProps } from '@hitachivantara/uikit-react-core';
|
|
5
8
|
import { HvBaseProps } from '@hitachivantara/uikit-react-core';
|
|
6
9
|
import { HvIconButtonProps } from '@hitachivantara/uikit-react-core';
|
|
10
|
+
import { JSX as JSX_2 } from 'react/jsx-runtime';
|
|
7
11
|
import { RefAttributes } from 'react';
|
|
8
12
|
import { TabProps } from '@mui/base/Tab';
|
|
9
13
|
import { TabsProps } from '@mui/base/Tabs';
|
|
@@ -125,6 +129,15 @@ export declare interface HvCanvasBottomPanelProps extends HvBaseProps {
|
|
|
125
129
|
classes?: HvCanvasBottomPanelClasses;
|
|
126
130
|
}
|
|
127
131
|
|
|
132
|
+
export declare const HvCanvasContext: Context<HvCanvasContextValue | null>;
|
|
133
|
+
|
|
134
|
+
declare type HvCanvasContextValue = {
|
|
135
|
+
sidePanelOpen: boolean;
|
|
136
|
+
handleSidePanelOpen: (open: boolean) => void;
|
|
137
|
+
sidePanelWidth: number;
|
|
138
|
+
handleSidePanelWidth: (width: number) => void;
|
|
139
|
+
};
|
|
140
|
+
|
|
128
141
|
/**
|
|
129
142
|
* The tab component to use inside `HvCanvasPanelTabs`.
|
|
130
143
|
*/
|
|
@@ -149,6 +162,11 @@ export declare interface HvCanvasPanelTabsProps extends TabsProps {
|
|
|
149
162
|
classes?: HvCanvasPanelTabsClasses;
|
|
150
163
|
}
|
|
151
164
|
|
|
165
|
+
export declare const HvCanvasProvider: ({ children, }: {
|
|
166
|
+
children: React.ReactNode;
|
|
167
|
+
onSidePanelResize?: ((width: number) => void) | undefined;
|
|
168
|
+
}) => JSX_2.Element;
|
|
169
|
+
|
|
152
170
|
/**
|
|
153
171
|
* A side panel component to use in a canvas context.
|
|
154
172
|
*/
|
|
@@ -156,7 +174,7 @@ export declare const HvCanvasSidePanel: ForwardRefExoticComponent<HvCanvasSidePa
|
|
|
156
174
|
|
|
157
175
|
export declare type HvCanvasSidePanelClasses = ExtractNames<typeof useClasses_4>;
|
|
158
176
|
|
|
159
|
-
export declare interface HvCanvasSidePanelProps extends HvBaseProps<HTMLDivElement, "onToggle"> {
|
|
177
|
+
export declare interface HvCanvasSidePanelProps extends HvBaseProps<HTMLDivElement, "onToggle" | "onResize"> {
|
|
160
178
|
/** When controlled, defines id the panel is open or not. */
|
|
161
179
|
open?: boolean;
|
|
162
180
|
/** When uncontrolled, defines the initial state of the panel. */
|
|
@@ -174,6 +192,14 @@ export declare interface HvCanvasSidePanelProps extends HvBaseProps<HTMLDivEleme
|
|
|
174
192
|
onTabChange?: (event: React.SyntheticEvent | null, tabId: string | number | null) => void;
|
|
175
193
|
/** An object containing all the labels. */
|
|
176
194
|
labels?: Partial<typeof DEFAULT_LABELS>;
|
|
195
|
+
/** The minimum width of the side panel. */
|
|
196
|
+
minWidth?: number;
|
|
197
|
+
/** The maximum width of the side panel. */
|
|
198
|
+
maxWidth?: number;
|
|
199
|
+
/** The initial width of the side panel. */
|
|
200
|
+
initialWidth?: number;
|
|
201
|
+
/** Callback triggered when the panel width changes. */
|
|
202
|
+
onResize?: (width: number) => void;
|
|
177
203
|
/** The content that will be rendered within the canvas panel. */
|
|
178
204
|
children?: React.ReactNode;
|
|
179
205
|
/** A Jss Object used to override or extend the styles applied. */
|
|
@@ -239,6 +265,8 @@ declare interface ToolbarTabsTab {
|
|
|
239
265
|
fixed?: boolean;
|
|
240
266
|
}
|
|
241
267
|
|
|
268
|
+
export declare const useCanvasContext: () => HvCanvasContextValue | null;
|
|
269
|
+
|
|
242
270
|
declare const useClasses: (classesProp?: Partial<Record<"content" | "root" | "tab" | "closed" | "minimized" | "multipleTabs" | "overflowing" | "tabTitle" | "tabsRoot" | "leftActions" | "rightActions" | "actionsDisabled", string>>, addStatic?: boolean) => {
|
|
243
271
|
readonly classes: {
|
|
244
272
|
root: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hitachivantara/uikit-react-pentaho",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Hitachi Vantara UI Kit Team",
|
|
6
6
|
"description": "UI Kit Pentaho+ React components.",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@emotion/css": "^11.11.0",
|
|
33
|
-
"@hitachivantara/uikit-react-core": "^5.82.
|
|
33
|
+
"@hitachivantara/uikit-react-core": "^5.82.2",
|
|
34
34
|
"@hitachivantara/uikit-react-icons": "^5.13.0",
|
|
35
35
|
"@hitachivantara/uikit-react-utils": "^0.2.17",
|
|
36
36
|
"@mui/base": "^5.0.0-beta.40",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"access": "public",
|
|
44
44
|
"directory": "package"
|
|
45
45
|
},
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "f1db991219c602f6970de5b2ca3bec1b0a395694",
|
|
47
47
|
"exports": {
|
|
48
48
|
".": {
|
|
49
49
|
"types": "./dist/types/index.d.ts",
|