Refactor RealTimeVisualization component and handle widget drop functionality
- Commented out the handleDrop function in RealTimeVisualization.tsx and moved its logic to a new utility function createHandleDrop for better separation of concerns. - Updated Project.tsx to utilize the new createHandleDrop function, improving readability and maintainability. - Enhanced styling for the scene container and real-time visualization components to improve layout and responsiveness. - Removed unnecessary styles and consolidated button and input styles for consistency. - Cleaned up unused imports and variables in various files to streamline the codebase.
This commit is contained in:
parent
db162c9ffa
commit
44e3f5c207
|
@ -125,21 +125,21 @@ export function ResetIcon() {
|
||||||
>
|
>
|
||||||
<path
|
<path
|
||||||
d="M2.54182 4.09637C3.33333 2.73422 4.80832 1.81836 6.49721 1.81836C9.02194 1.81836 11.0686 3.86506 11.0686 6.38979C11.0686 8.91452 9.02194 10.9612 6.49721 10.9612C3.97248 10.9612 1.92578 8.91452 1.92578 6.38979"
|
d="M2.54182 4.09637C3.33333 2.73422 4.80832 1.81836 6.49721 1.81836C9.02194 1.81836 11.0686 3.86506 11.0686 6.38979C11.0686 8.91452 9.02194 10.9612 6.49721 10.9612C3.97248 10.9612 1.92578 8.91452 1.92578 6.38979"
|
||||||
stroke="var(--icon-default-color-active)"
|
stroke="var(--text-color)"
|
||||||
strokeLinecap="round"
|
strokeLinecap="round"
|
||||||
strokeLinejoin="round"
|
strokeLinejoin="round"
|
||||||
/>
|
/>
|
||||||
<path
|
<path
|
||||||
d="M7.64118 6.38895C7.64118 7.02013 7.12951 7.53181 6.49833 7.53181C5.86714 7.53181 5.35547 7.02013 5.35547 6.38895C5.35547 5.75777 5.86714 5.24609 6.49833 5.24609C7.12951 5.24609 7.64118 5.75777 7.64118 6.38895Z"
|
d="M7.64118 6.38895C7.64118 7.02013 7.12951 7.53181 6.49833 7.53181C5.86714 7.53181 5.35547 7.02013 5.35547 6.38895C5.35547 5.75777 5.86714 5.24609 6.49833 5.24609C7.12951 5.24609 7.64118 5.75777 7.64118 6.38895Z"
|
||||||
fill="var(--icon-default-color-active)"
|
fill="var(--text-color)"
|
||||||
stroke="var(--icon-default-color-active)"
|
stroke="var(--text-color)"
|
||||||
strokeWidth="0.571429"
|
strokeWidth="0.571429"
|
||||||
strokeLinecap="round"
|
strokeLinecap="round"
|
||||||
strokeLinejoin="round"
|
strokeLinejoin="round"
|
||||||
/>
|
/>
|
||||||
<path
|
<path
|
||||||
d="M4.78125 4.10407H2.49554V1.81836"
|
d="M4.78125 4.10407H2.49554V1.81836"
|
||||||
stroke="var(--icon-default-color-active)"
|
stroke="var(--text-color)"
|
||||||
strokeLinecap="round"
|
strokeLinecap="round"
|
||||||
strokeLinejoin="round"
|
strokeLinejoin="round"
|
||||||
/>
|
/>
|
||||||
|
@ -158,7 +158,7 @@ export function PlayStopIcon() {
|
||||||
>
|
>
|
||||||
<path
|
<path
|
||||||
d="M8 2.88867V9.88867M11 2.88867V9.88867M2 3.99171V8.78562C2 9.28847 2 9.53987 2.09943 9.65627C2.1857 9.75732 2.31512 9.81092 2.44756 9.80047C2.60019 9.78847 2.77796 9.61072 3.13352 9.25517L5.5305 6.85817C5.69485 6.69382 5.777 6.61167 5.8078 6.51692C5.83485 6.43357 5.83485 6.34377 5.8078 6.26042C5.777 6.16567 5.69485 6.08352 5.5305 5.91917L3.13352 3.52219C2.77796 3.16664 2.60019 2.98886 2.44756 2.97685C2.31512 2.96643 2.1857 3.02004 2.09943 3.12105C2 3.23747 2 3.48888 2 3.99171Z"
|
d="M8 2.88867V9.88867M11 2.88867V9.88867M2 3.99171V8.78562C2 9.28847 2 9.53987 2.09943 9.65627C2.1857 9.75732 2.31512 9.81092 2.44756 9.80047C2.60019 9.78847 2.77796 9.61072 3.13352 9.25517L5.5305 6.85817C5.69485 6.69382 5.777 6.61167 5.8078 6.51692C5.83485 6.43357 5.83485 6.34377 5.8078 6.26042C5.777 6.16567 5.69485 6.08352 5.5305 5.91917L3.13352 3.52219C2.77796 3.16664 2.60019 2.98886 2.44756 2.97685C2.31512 2.96643 2.1857 3.02004 2.09943 3.12105C2 3.23747 2 3.48888 2 3.99171Z"
|
||||||
stroke="var(--icon-default-color-active)"
|
stroke="var(--text-color)"
|
||||||
strokeLinecap="round"
|
strokeLinecap="round"
|
||||||
strokeLinejoin="round"
|
strokeLinejoin="round"
|
||||||
/>
|
/>
|
||||||
|
@ -177,7 +177,7 @@ export function ExitIcon() {
|
||||||
>
|
>
|
||||||
<path
|
<path
|
||||||
d="M2.08203 6.34311L5.03647 3.38867M2.08203 6.34311L5.03647 9.29755M2.08203 6.34311H5.9228C7.22276 6.34334 9.34995 7.05241 10.7681 9.88867"
|
d="M2.08203 6.34311L5.03647 3.38867M2.08203 6.34311L5.03647 9.29755M2.08203 6.34311H5.9228C7.22276 6.34334 9.34995 7.05241 10.7681 9.88867"
|
||||||
stroke="var(--icon-default-color-active)"
|
stroke="var(--text-color)"
|
||||||
strokeLinecap="round"
|
strokeLinecap="round"
|
||||||
strokeLinejoin="round"
|
strokeLinejoin="round"
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -36,7 +36,6 @@ import {
|
||||||
import useToggleStore from "../../store/useUIToggleStore";
|
import useToggleStore from "../../store/useUIToggleStore";
|
||||||
import {
|
import {
|
||||||
use3DWidget,
|
use3DWidget,
|
||||||
useDroppedObjectsStore,
|
|
||||||
useFloatingWidget,
|
useFloatingWidget,
|
||||||
} from "../../store/visualization/useDroppedObjectsStore";
|
} from "../../store/visualization/useDroppedObjectsStore";
|
||||||
|
|
||||||
|
@ -57,20 +56,18 @@ const Tools: React.FC = () => {
|
||||||
|
|
||||||
const { widgets3D } = use3DWidget();
|
const { widgets3D } = use3DWidget();
|
||||||
|
|
||||||
const zones = useDroppedObjectsStore((state) => state.zones);
|
|
||||||
|
|
||||||
// wall options
|
// wall options
|
||||||
const { toggleView, setToggleView } = useToggleView();
|
const { toggleView, setToggleView } = useToggleView();
|
||||||
const { setDeleteTool } = useDeleteTool();
|
const { setDeleteTool } = useDeleteTool();
|
||||||
const { setAddAction } = useAddAction();
|
const { setAddAction } = useAddAction();
|
||||||
const { setSelectedWallItem } = useSelectedWallItem();
|
const { setSelectedWallItem } = useSelectedWallItem();
|
||||||
|
|
||||||
const { transformMode, setTransformMode } = useTransformMode();
|
const { setTransformMode } = useTransformMode();
|
||||||
const { deletePointOrLine, setDeletePointOrLine } = useDeletePointOrLine();
|
const { setDeletePointOrLine } = useDeletePointOrLine();
|
||||||
const { movePoint, setMovePoint } = useMovePoint();
|
const { setMovePoint } = useMovePoint();
|
||||||
const { toolMode, setToolMode } = useToolMode();
|
const { setToolMode } = useToolMode();
|
||||||
const { activeTool, setActiveTool } = useActiveTool();
|
const { activeTool, setActiveTool } = useActiveTool();
|
||||||
const { refTextupdate, setRefTextUpdate } = useRefTextUpdate();
|
const { setRefTextUpdate } = useRefTextUpdate();
|
||||||
|
|
||||||
// Reset activeTool whenever activeModule changes
|
// Reset activeTool whenever activeModule changes
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
@ -209,7 +206,6 @@ const Tools: React.FC = () => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{!isPlaying ? (
|
{!isPlaying ? (
|
||||||
<>
|
|
||||||
<div className="tools-container">
|
<div className="tools-container">
|
||||||
<div className="drop-down-icons">
|
<div className="drop-down-icons">
|
||||||
<div className="activeDropicon">
|
<div className="activeDropicon">
|
||||||
|
@ -464,13 +460,12 @@ const Tools: React.FC = () => {
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</>
|
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
{activeModule !== "simulation" && (
|
{activeModule !== "simulation" && (
|
||||||
<div className="exitPlay" onClick={() => setIsPlaying(false)}>
|
<button className="exitPlay" onClick={() => setIsPlaying(false)}>
|
||||||
X
|
X
|
||||||
</div>
|
</button>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -19,6 +19,9 @@ import {
|
||||||
} from "../../icons/ExportCommonIcons";
|
} from "../../icons/ExportCommonIcons";
|
||||||
import { getAvatarColor } from "../../../modules/collaboration/functions/getAvatarColor";
|
import { getAvatarColor } from "../../../modules/collaboration/functions/getAvatarColor";
|
||||||
import { useSubModuleStore } from "../../../store/useModuleStore";
|
import { useSubModuleStore } from "../../../store/useModuleStore";
|
||||||
|
import ProductionCapacity from "../analysis/ProductionCapacity";
|
||||||
|
import ThroughputSummary from "../analysis/ThroughputSummary";
|
||||||
|
import ROISummary from "../analysis/ROISummary";
|
||||||
|
|
||||||
const SimulationPlayer: React.FC = () => {
|
const SimulationPlayer: React.FC = () => {
|
||||||
const MAX_SPEED = 8; // Maximum speed
|
const MAX_SPEED = 8; // Maximum speed
|
||||||
|
@ -162,6 +165,7 @@ const SimulationPlayer: React.FC = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
<div className="simulation-player-wrapper">
|
<div className="simulation-player-wrapper">
|
||||||
<div className={`simulation-player-container ${expand ? "open" : ""}`}>
|
<div className={`simulation-player-container ${expand ? "open" : ""}`}>
|
||||||
<div className="controls-container">
|
<div className="controls-container">
|
||||||
|
@ -206,7 +210,10 @@ const SimulationPlayer: React.FC = () => {
|
||||||
<div className="label">Monthly ROI</div>
|
<div className="label">Monthly ROI</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="progress-wrapper">
|
<div className="progress-wrapper">
|
||||||
<div className="progress" style={{ width: monthlyROI }}></div>
|
<div
|
||||||
|
className="progress"
|
||||||
|
style={{ width: monthlyROI }}
|
||||||
|
></div>
|
||||||
</div>{" "}
|
</div>{" "}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -380,6 +387,14 @@ const SimulationPlayer: React.FC = () => {
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="analysis">
|
||||||
|
<div className="analysis-wrapper">
|
||||||
|
<ProductionCapacity />
|
||||||
|
<ThroughputSummary />
|
||||||
|
</div>
|
||||||
|
<ROISummary />
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -143,109 +143,109 @@ const RealTimeVisulization: React.FC = () => {
|
||||||
});
|
});
|
||||||
}, [selectedZone]);
|
}, [selectedZone]);
|
||||||
|
|
||||||
const handleDrop = async (event: React.DragEvent<HTMLDivElement>) => {
|
// const handleDrop = async (event: React.DragEvent<HTMLDivElement>) => {
|
||||||
event.preventDefault();
|
// event.preventDefault();
|
||||||
try {
|
// try {
|
||||||
const email = localStorage.getItem("email") ?? "";
|
// const email = localStorage.getItem("email") ?? "";
|
||||||
const organization = email?.split("@")[1]?.split(".")[0];
|
// const organization = email?.split("@")[1]?.split(".")[0];
|
||||||
|
|
||||||
const data = event.dataTransfer.getData("text/plain");
|
// const data = event.dataTransfer.getData("text/plain");
|
||||||
if (widgetSubOption === "3D") return;
|
// if (widgetSubOption === "3D") return;
|
||||||
if (!data || selectedZone.zoneName === "") return;
|
// if (!data || selectedZone.zoneName === "") return;
|
||||||
|
|
||||||
const droppedData = JSON.parse(data);
|
// const droppedData = JSON.parse(data);
|
||||||
const canvasElement = document.getElementById("real-time-vis-canvas");
|
// const canvasElement = document.getElementById("real-time-vis-canvas");
|
||||||
if (!canvasElement) throw new Error("Canvas element not found");
|
// if (!canvasElement) throw new Error("Canvas element not found");
|
||||||
|
|
||||||
const rect = canvasElement.getBoundingClientRect();
|
// const rect = canvasElement.getBoundingClientRect();
|
||||||
const relativeX = event.clientX - rect.left;
|
// const relativeX = event.clientX - rect.left;
|
||||||
const relativeY = event.clientY - rect.top;
|
// const relativeY = event.clientY - rect.top;
|
||||||
|
|
||||||
// Widget dimensions
|
// // Widget dimensions
|
||||||
const widgetWidth = droppedData.width ?? 125;
|
// const widgetWidth = droppedData.width ?? 125;
|
||||||
const widgetHeight = droppedData.height ?? 100;
|
// const widgetHeight = droppedData.height ?? 100;
|
||||||
|
|
||||||
// Center the widget at cursor
|
// // Center the widget at cursor
|
||||||
const centerOffsetX = widgetWidth / 2;
|
// const centerOffsetX = widgetWidth / 2;
|
||||||
const centerOffsetY = widgetHeight / 2;
|
// const centerOffsetY = widgetHeight / 2;
|
||||||
|
|
||||||
const adjustedX = relativeX - centerOffsetX;
|
// const adjustedX = relativeX - centerOffsetX;
|
||||||
const adjustedY = relativeY - centerOffsetY;
|
// const adjustedY = relativeY - centerOffsetY;
|
||||||
|
|
||||||
const finalPosition = determinePosition(rect, adjustedX, adjustedY);
|
// const finalPosition = determinePosition(rect, adjustedX, adjustedY);
|
||||||
const [activeProp1, activeProp2] = getActiveProperties(finalPosition);
|
// const [activeProp1, activeProp2] = getActiveProperties(finalPosition);
|
||||||
|
|
||||||
let finalY = 0;
|
// let finalY = 0;
|
||||||
let finalX = 0;
|
// let finalX = 0;
|
||||||
|
|
||||||
if (activeProp1 === "top") {
|
// if (activeProp1 === "top") {
|
||||||
finalY = adjustedY;
|
// finalY = adjustedY;
|
||||||
} else {
|
// } else {
|
||||||
finalY = rect.height - (adjustedY + widgetHeight);
|
// finalY = rect.height - (adjustedY + widgetHeight);
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (activeProp2 === "left") {
|
// if (activeProp2 === "left") {
|
||||||
finalX = adjustedX;
|
// finalX = adjustedX;
|
||||||
} else {
|
// } else {
|
||||||
finalX = rect.width - (adjustedX + widgetWidth);
|
// finalX = rect.width - (adjustedX + widgetWidth);
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Clamp to boundaries
|
// // Clamp to boundaries
|
||||||
finalX = Math.max(0, Math.min(rect.width - widgetWidth, finalX));
|
// finalX = Math.max(0, Math.min(rect.width - widgetWidth, finalX));
|
||||||
finalY = Math.max(0, Math.min(rect.height - widgetHeight, finalY));
|
// finalY = Math.max(0, Math.min(rect.height - widgetHeight, finalY));
|
||||||
|
|
||||||
const boundedPosition = {
|
// const boundedPosition = {
|
||||||
...finalPosition,
|
// ...finalPosition,
|
||||||
[activeProp1]: finalY,
|
// [activeProp1]: finalY,
|
||||||
[activeProp2]: finalX,
|
// [activeProp2]: finalX,
|
||||||
[activeProp1 === "top" ? "bottom" : "top"]: "auto",
|
// [activeProp1 === "top" ? "bottom" : "top"]: "auto",
|
||||||
[activeProp2 === "left" ? "right" : "left"]: "auto",
|
// [activeProp2 === "left" ? "right" : "left"]: "auto",
|
||||||
};
|
// };
|
||||||
|
|
||||||
const newObject = {
|
// const newObject = {
|
||||||
...droppedData,
|
// ...droppedData,
|
||||||
id: generateUniqueId(),
|
// id: generateUniqueId(),
|
||||||
position: boundedPosition,
|
// position: boundedPosition,
|
||||||
};
|
// };
|
||||||
|
|
||||||
const existingZone =
|
// const existingZone =
|
||||||
useDroppedObjectsStore.getState().zones[selectedZone.zoneName];
|
// useDroppedObjectsStore.getState().zones[selectedZone.zoneName];
|
||||||
if (!existingZone) {
|
// if (!existingZone) {
|
||||||
useDroppedObjectsStore
|
// useDroppedObjectsStore
|
||||||
.getState()
|
// .getState()
|
||||||
.setZone(selectedZone.zoneName, selectedZone.zoneId);
|
// .setZone(selectedZone.zoneName, selectedZone.zoneId);
|
||||||
}
|
// }
|
||||||
|
|
||||||
const addFloatingWidget = {
|
// const addFloatingWidget = {
|
||||||
organization,
|
// organization,
|
||||||
widget: newObject,
|
// widget: newObject,
|
||||||
zoneId: selectedZone.zoneId,
|
// zoneId: selectedZone.zoneId,
|
||||||
};
|
// };
|
||||||
|
|
||||||
if (visualizationSocket) {
|
// if (visualizationSocket) {
|
||||||
visualizationSocket.emit("v2:viz-float:add", addFloatingWidget);
|
// visualizationSocket.emit("v2:viz-float:add", addFloatingWidget);
|
||||||
}
|
// }
|
||||||
|
|
||||||
useDroppedObjectsStore
|
// useDroppedObjectsStore
|
||||||
.getState()
|
// .getState()
|
||||||
.addObject(selectedZone.zoneName, newObject);
|
// .addObject(selectedZone.zoneName, newObject);
|
||||||
|
|
||||||
const droppedObjectsStore = useDroppedObjectsStore.getState();
|
// const droppedObjectsStore = useDroppedObjectsStore.getState();
|
||||||
const currentZone = droppedObjectsStore.zones[selectedZone.zoneName];
|
// const currentZone = droppedObjectsStore.zones[selectedZone.zoneName];
|
||||||
|
|
||||||
if (currentZone && currentZone.zoneId === selectedZone.zoneId) {
|
// if (currentZone && currentZone.zoneId === selectedZone.zoneId) {
|
||||||
console.log(
|
// console.log(
|
||||||
`Objects for Zone ${selectedZone.zoneId}:`,
|
// `Objects for Zone ${selectedZone.zoneId}:`,
|
||||||
currentZone.objects
|
// currentZone.objects
|
||||||
);
|
// );
|
||||||
setFloatingWidget(currentZone.objects);
|
// setFloatingWidget(currentZone.objects);
|
||||||
} else {
|
// } else {
|
||||||
console.warn("Zone not found or zoneId mismatch");
|
// console.warn("Zone not found or zoneId mismatch");
|
||||||
}
|
// }
|
||||||
} catch (error) {
|
// } catch (error) {
|
||||||
console.error("Error in handleDrop:", error);
|
// console.error("Error in handleDrop:", error);
|
||||||
}
|
// }
|
||||||
};
|
// };
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const handleClickOutside = (event: MouseEvent) => {
|
const handleClickOutside = (event: MouseEvent) => {
|
||||||
|
@ -302,16 +302,7 @@ const RealTimeVisulization: React.FC = () => {
|
||||||
}
|
}
|
||||||
`}
|
`}
|
||||||
</style>
|
</style>
|
||||||
<div
|
<div ref={containerRef} className="realTime-viz">
|
||||||
ref={containerRef}
|
|
||||||
id="real-time-vis-canvas"
|
|
||||||
className={`realTime-viz canvas ${isPlaying ? "playingFlase" : ""}`}
|
|
||||||
style={{
|
|
||||||
height: isPlaying || activeModule !== "visualization" ? "100vh" : "",
|
|
||||||
width: isPlaying || activeModule !== "visualization" ? "100vw" : "",
|
|
||||||
left: isPlaying || activeModule !== "visualization" ? "0%" : "",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div className="realTime-viz-wrapper">
|
<div className="realTime-viz-wrapper">
|
||||||
{openConfirmationPopup && (
|
{openConfirmationPopup && (
|
||||||
<RenderOverlay>
|
<RenderOverlay>
|
||||||
|
@ -322,20 +313,6 @@ const RealTimeVisulization: React.FC = () => {
|
||||||
/>
|
/>
|
||||||
</RenderOverlay>
|
</RenderOverlay>
|
||||||
)}
|
)}
|
||||||
<div
|
|
||||||
className="scene-container"
|
|
||||||
style={{
|
|
||||||
height: "100%",
|
|
||||||
width: "100%",
|
|
||||||
borderRadius:
|
|
||||||
isPlaying || activeModule !== "visualization" ? "" : "6px",
|
|
||||||
}}
|
|
||||||
role="application"
|
|
||||||
onDrop={(event) => handleDrop(event)}
|
|
||||||
onDragOver={(event) => event.preventDefault()}
|
|
||||||
>
|
|
||||||
<Scene />
|
|
||||||
</div>
|
|
||||||
{activeModule === "visualization" && selectedZone.zoneName !== "" && (
|
{activeModule === "visualization" && selectedZone.zoneName !== "" && (
|
||||||
<DroppedObjects />
|
<DroppedObjects />
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -0,0 +1,122 @@
|
||||||
|
import { generateUniqueId } from "../../../functions/generateUniqueId";
|
||||||
|
import { useDroppedObjectsStore } from "../../../store/visualization/useDroppedObjectsStore";
|
||||||
|
import { determinePosition } from "./determinePosition";
|
||||||
|
import { getActiveProperties } from "./getActiveProperties";
|
||||||
|
|
||||||
|
interface HandleDropProps {
|
||||||
|
widgetSubOption: any;
|
||||||
|
visualizationSocket: any;
|
||||||
|
selectedZone: any;
|
||||||
|
setFloatingWidget: (value: any) => void;
|
||||||
|
event: React.DragEvent<HTMLDivElement>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const createHandleDrop = ({
|
||||||
|
widgetSubOption,
|
||||||
|
visualizationSocket,
|
||||||
|
selectedZone,
|
||||||
|
setFloatingWidget,
|
||||||
|
event,
|
||||||
|
}: HandleDropProps) => {
|
||||||
|
event.preventDefault();
|
||||||
|
try {
|
||||||
|
const email = localStorage.getItem("email") ?? "";
|
||||||
|
const organization = email?.split("@")[1]?.split(".")[0];
|
||||||
|
|
||||||
|
const data = event.dataTransfer.getData("text/plain");
|
||||||
|
if (widgetSubOption === "3D") return;
|
||||||
|
if (!data || selectedZone.zoneName === "") return;
|
||||||
|
|
||||||
|
const droppedData = JSON.parse(data);
|
||||||
|
const canvasElement = document.getElementById("real-time-vis-canvas");
|
||||||
|
if (!canvasElement) throw new Error("Canvas element not found");
|
||||||
|
|
||||||
|
const rect = canvasElement.getBoundingClientRect();
|
||||||
|
const relativeX = event.clientX - rect.left;
|
||||||
|
const relativeY = event.clientY - rect.top;
|
||||||
|
|
||||||
|
// Widget dimensions
|
||||||
|
const widgetWidth = droppedData.width ?? 125;
|
||||||
|
const widgetHeight = droppedData.height ?? 100;
|
||||||
|
|
||||||
|
// Center the widget at cursor
|
||||||
|
const centerOffsetX = widgetWidth / 2;
|
||||||
|
const centerOffsetY = widgetHeight / 2;
|
||||||
|
|
||||||
|
const adjustedX = relativeX - centerOffsetX;
|
||||||
|
const adjustedY = relativeY - centerOffsetY;
|
||||||
|
|
||||||
|
const finalPosition = determinePosition(rect, adjustedX, adjustedY);
|
||||||
|
const [activeProp1, activeProp2] = getActiveProperties(finalPosition);
|
||||||
|
|
||||||
|
let finalY = 0;
|
||||||
|
let finalX = 0;
|
||||||
|
|
||||||
|
if (activeProp1 === "top") {
|
||||||
|
finalY = adjustedY;
|
||||||
|
} else {
|
||||||
|
finalY = rect.height - (adjustedY + widgetHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeProp2 === "left") {
|
||||||
|
finalX = adjustedX;
|
||||||
|
} else {
|
||||||
|
finalX = rect.width - (adjustedX + widgetWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clamp to boundaries
|
||||||
|
finalX = Math.max(0, Math.min(rect.width - widgetWidth, finalX));
|
||||||
|
finalY = Math.max(0, Math.min(rect.height - widgetHeight, finalY));
|
||||||
|
|
||||||
|
const boundedPosition = {
|
||||||
|
...finalPosition,
|
||||||
|
[activeProp1]: finalY,
|
||||||
|
[activeProp2]: finalX,
|
||||||
|
[activeProp1 === "top" ? "bottom" : "top"]: "auto",
|
||||||
|
[activeProp2 === "left" ? "right" : "left"]: "auto",
|
||||||
|
};
|
||||||
|
|
||||||
|
const newObject = {
|
||||||
|
...droppedData,
|
||||||
|
id: generateUniqueId(),
|
||||||
|
position: boundedPosition,
|
||||||
|
};
|
||||||
|
|
||||||
|
const existingZone =
|
||||||
|
useDroppedObjectsStore.getState().zones[selectedZone.zoneName];
|
||||||
|
if (!existingZone) {
|
||||||
|
useDroppedObjectsStore
|
||||||
|
.getState()
|
||||||
|
.setZone(selectedZone.zoneName, selectedZone.zoneId);
|
||||||
|
}
|
||||||
|
|
||||||
|
const addFloatingWidget = {
|
||||||
|
organization,
|
||||||
|
widget: newObject,
|
||||||
|
zoneId: selectedZone.zoneId,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (visualizationSocket) {
|
||||||
|
visualizationSocket.emit("v2:viz-float:add", addFloatingWidget);
|
||||||
|
}
|
||||||
|
|
||||||
|
useDroppedObjectsStore
|
||||||
|
.getState()
|
||||||
|
.addObject(selectedZone.zoneName, newObject);
|
||||||
|
|
||||||
|
const droppedObjectsStore = useDroppedObjectsStore.getState();
|
||||||
|
const currentZone = droppedObjectsStore.zones[selectedZone.zoneName];
|
||||||
|
|
||||||
|
if (currentZone && currentZone.zoneId === selectedZone.zoneId) {
|
||||||
|
console.log(
|
||||||
|
`Objects for Zone ${selectedZone.zoneId}:`,
|
||||||
|
currentZone.objects
|
||||||
|
);
|
||||||
|
setFloatingWidget(currentZone.objects);
|
||||||
|
} else {
|
||||||
|
console.warn("Zone not found or zoneId mismatch");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error in handleDrop:", error);
|
||||||
|
}
|
||||||
|
};
|
|
@ -13,6 +13,7 @@ import {
|
||||||
useWallItems,
|
useWallItems,
|
||||||
useZones,
|
useZones,
|
||||||
useLoadingProgress,
|
useLoadingProgress,
|
||||||
|
useWidgetSubOption,
|
||||||
} from "../store/store";
|
} from "../store/store";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import { usePlayButtonStore } from "../store/usePlayButtonStore";
|
import { usePlayButtonStore } from "../store/usePlayButtonStore";
|
||||||
|
@ -22,9 +23,10 @@ import SimulationPlayer from "../components/ui/simulation/simulationPlayer";
|
||||||
import KeyPressListener from "../utils/shortcutkeys/handleShortcutKeys";
|
import KeyPressListener from "../utils/shortcutkeys/handleShortcutKeys";
|
||||||
import { useSelectedUserStore } from "../store/useCollabStore";
|
import { useSelectedUserStore } from "../store/useCollabStore";
|
||||||
import FollowPerson from "../components/templates/FollowPerson";
|
import FollowPerson from "../components/templates/FollowPerson";
|
||||||
import ProductionCapacity from "../components/ui/analysis/ProductionCapacity";
|
import Scene from "../modules/scene/scene";
|
||||||
import ThroughputSummary from "../components/ui/analysis/ThroughputSummary";
|
import { createHandleDrop } from "../modules/visualization/functions/handleUiDrop";
|
||||||
import ROISummary from "../components/ui/analysis/ROISummary";
|
import { useSelectedZoneStore } from "../store/visualization/useZoneStore";
|
||||||
|
import { useFloatingWidget } from "../store/visualization/useDroppedObjectsStore";
|
||||||
|
|
||||||
const Project: React.FC = () => {
|
const Project: React.FC = () => {
|
||||||
let navigate = useNavigate();
|
let navigate = useNavigate();
|
||||||
|
@ -53,21 +55,28 @@ const Project: React.FC = () => {
|
||||||
} else {
|
} else {
|
||||||
navigate("/");
|
navigate("/");
|
||||||
}
|
}
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const { isPlaying } = usePlayButtonStore();
|
// global store
|
||||||
const { toggleThreeD } = useThreeDStore();
|
const { toggleThreeD } = useThreeDStore();
|
||||||
|
|
||||||
|
// simulation store
|
||||||
|
const { isPlaying } = usePlayButtonStore();
|
||||||
|
|
||||||
|
// collaboration store
|
||||||
const { selectedUser } = useSelectedUserStore();
|
const { selectedUser } = useSelectedUserStore();
|
||||||
|
|
||||||
|
// real-time visualization store
|
||||||
|
const { widgetSubOption } = useWidgetSubOption();
|
||||||
|
const { visualizationSocket } = useSocketStore();
|
||||||
|
const { selectedZone } = useSelectedZoneStore();
|
||||||
|
const { setFloatingWidget } = useFloatingWidget();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="project-main">
|
<div className="project-main">
|
||||||
{/* <div className="analysis">
|
{!selectedUser && (
|
||||||
<div className="analysis-wrapper">
|
<>
|
||||||
<ProductionCapacity />
|
|
||||||
<ThroughputSummary />
|
|
||||||
</div>
|
|
||||||
<ROISummary />
|
|
||||||
</div> */}
|
|
||||||
<KeyPressListener />
|
<KeyPressListener />
|
||||||
{loadingProgress > 0 && <LoadingPage progress={loadingProgress} />}
|
{loadingProgress > 0 && <LoadingPage progress={loadingProgress} />}
|
||||||
{!isPlaying && (
|
{!isPlaying && (
|
||||||
|
@ -77,14 +86,36 @@ const Project: React.FC = () => {
|
||||||
<SideBarRight />
|
<SideBarRight />
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
{/* <RenderOverlay>
|
|
||||||
<MenuBar setOpenMenu={setOpenMenu} />
|
|
||||||
</RenderOverlay> */}
|
|
||||||
{activeModule === "market" && <MarketPlace />}
|
|
||||||
<RealTimeVisulization />
|
<RealTimeVisulization />
|
||||||
|
{activeModule === "market" && <MarketPlace />}
|
||||||
{activeModule !== "market" && <Tools />}
|
{activeModule !== "market" && <Tools />}
|
||||||
{isPlaying && activeModule === "simulation" && <SimulationPlayer />}
|
{isPlaying && activeModule === "simulation" && <SimulationPlayer />}
|
||||||
{/* {<SimulationPlayer />} */}
|
</>
|
||||||
|
)}
|
||||||
|
<div
|
||||||
|
className="scene-container"
|
||||||
|
id="real-time-vis-canvas"
|
||||||
|
style={{
|
||||||
|
height: isPlaying || activeModule !== "visualization" ? "100vh" : "",
|
||||||
|
width: isPlaying || activeModule !== "visualization" ? "100vw" : "",
|
||||||
|
left: isPlaying || activeModule !== "visualization" ? "0%" : "",
|
||||||
|
borderRadius:
|
||||||
|
isPlaying || activeModule !== "visualization" ? "" : "6px",
|
||||||
|
}}
|
||||||
|
role="application"
|
||||||
|
onDrop={(event) =>
|
||||||
|
createHandleDrop({
|
||||||
|
widgetSubOption,
|
||||||
|
visualizationSocket,
|
||||||
|
selectedZone,
|
||||||
|
setFloatingWidget,
|
||||||
|
event,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
onDragOver={(event) => event.preventDefault()}
|
||||||
|
>
|
||||||
|
<Scene />
|
||||||
|
</div>
|
||||||
{selectedUser && <FollowPerson />}
|
{selectedUser && <FollowPerson />}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import { create } from "zustand";
|
import { create } from "zustand";
|
||||||
import { addingFloatingWidgets } from "../../services/visulization/zone/addFloatingWidgets";
|
|
||||||
import { useSocketStore } from "../store";
|
import { useSocketStore } from "../store";
|
||||||
import useChartStore from "./useChartStore";
|
import useChartStore from "./useChartStore";
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
@use "../abstracts/variables" as *;
|
@use "../abstracts/variables" as *;
|
||||||
@use "../abstracts/mixins" as *;
|
@use "../abstracts/mixins" as *;
|
||||||
|
|
||||||
section, .section{
|
section,
|
||||||
|
.section {
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
outline: 1px solid var(--border-color);
|
outline: 1px solid var(--border-color);
|
||||||
outline-offset: -1px;
|
outline-offset: -1px;
|
||||||
|
@ -9,3 +10,20 @@ section, .section{
|
||||||
background: var(--background-color);
|
background: var(--background-color);
|
||||||
margin: 4px 0;
|
margin: 4px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.scene-container {
|
||||||
|
width: calc(100% - (320px + 270px + 90px));
|
||||||
|
height: calc(100% - (250px));
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: calc(270px + 45px);
|
||||||
|
overflow: hidden;
|
||||||
|
z-index: 1;
|
||||||
|
transform: translate(0, -50%);
|
||||||
|
transition: all 0.2s;
|
||||||
|
box-shadow: $box-shadow-medium;
|
||||||
|
canvas {
|
||||||
|
outline: none;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -12,10 +12,3 @@ input[type="password"]::-webkit-clear-button, /* For Chrome/Safari clear button
|
||||||
input[type="password"]::-webkit-inner-spin-button { /* Just in case */
|
input[type="password"]::-webkit-inner-spin-button { /* Just in case */
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
button{
|
|
||||||
border: none;
|
|
||||||
outline: none;
|
|
||||||
background: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
@use "../../abstracts/variables" as *;
|
||||||
|
@use "../../abstracts/mixins" as *;
|
||||||
|
|
||||||
.roiSummary-container {
|
.roiSummary-container {
|
||||||
.roiSummary-wrapper {
|
.roiSummary-wrapper {
|
||||||
background-color: var(--background-color);
|
background-color: var(--background-color);
|
||||||
|
@ -64,7 +67,7 @@
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
border: 1px solid #00FF56;
|
border: 1px solid #00FF56;
|
||||||
background: #436D51;
|
background: #17eb5d65;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
padding: 4px 6px;
|
padding: 4px 6px;
|
||||||
|
@ -223,12 +226,11 @@
|
||||||
background: none;
|
background: none;
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
background-color: var(--accent-color);
|
color: var(--text-button-color);
|
||||||
color: var(--background-color);
|
background: var(--background-color-button);
|
||||||
padding: 4px 6px;
|
padding: 4px 12px;
|
||||||
border-radius: 5px;
|
border-radius: #{$border-radius-large};
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-size: 14px;
|
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -244,7 +246,6 @@
|
||||||
height: 250px;
|
height: 250px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
position: relative;
|
position: relative;
|
||||||
transition: background 0.5s ease;
|
|
||||||
}
|
}
|
||||||
.progress-cover {
|
.progress-cover {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
@ -252,7 +253,6 @@
|
||||||
height: 75%;
|
height: 75%;
|
||||||
top: 12.5%;
|
top: 12.5%;
|
||||||
left: 12.5%;
|
left: 12.5%;
|
||||||
background: #000000cc;
|
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,29 +7,30 @@
|
||||||
align-items: start;
|
align-items: start;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
// pointer-events: none;
|
pointer-events: none;
|
||||||
z-index: 10000;
|
padding: 10px;
|
||||||
|
z-index: 2;
|
||||||
|
|
||||||
.analysis-wrapper {
|
.analysis-wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
}
|
}
|
||||||
}
|
.analysis-card {
|
||||||
|
|
||||||
.analysis-card {
|
|
||||||
min-width: 333px;
|
min-width: 333px;
|
||||||
background: var(--background-color);
|
background: var(--background-color);
|
||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
|
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
outline: 1px solid var(--border-color);
|
||||||
|
outline-offset: -1px;
|
||||||
|
pointer-events: all;
|
||||||
|
|
||||||
.analysis-card-wrapper {
|
.analysis-card-wrapper {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background: var(--background-color);
|
background: var(--background-color);
|
||||||
border-radius: 14px;
|
border-radius: 14px;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 14px;
|
gap: 14px;
|
||||||
|
@ -67,19 +68,18 @@
|
||||||
|
|
||||||
.progress-bar {
|
.progress-bar {
|
||||||
position: relative;
|
position: relative;
|
||||||
// width: 36px;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 4px;
|
height: 4px;
|
||||||
border-radius: 13px;
|
border-radius: 13px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background: #FBEBD7;
|
background: #fbebd7;
|
||||||
|
|
||||||
.bar-fill {
|
.bar-fill {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
background: #FC9D2F;
|
background: #fc9d2f;
|
||||||
border-radius: 13px;
|
border-radius: 13px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,10 +114,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.throughoutSummary {
|
|
||||||
.throughoutSummary-wrapper {
|
.throughoutSummary-wrapper {
|
||||||
.process-container {
|
.process-container {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -209,15 +205,15 @@
|
||||||
height: 5px;
|
height: 5px;
|
||||||
|
|
||||||
&:nth-child(1) {
|
&:nth-child(1) {
|
||||||
background: #F3C64D;
|
background: #f3c64d;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:nth-child(2) {
|
&:nth-child(2) {
|
||||||
background: #67B3F4;
|
background: #67b3f4;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:nth-child(3) {
|
&:nth-child(3) {
|
||||||
background: #7981F5;
|
background: #7981f5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -236,22 +232,19 @@
|
||||||
/* Align items vertically */
|
/* Align items vertically */
|
||||||
&:nth-child(1) {
|
&:nth-child(1) {
|
||||||
.indicator {
|
.indicator {
|
||||||
|
background: #f3c64d;
|
||||||
background: #F3C64D;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:nth-child(2) {
|
&:nth-child(2) {
|
||||||
.indicator {
|
.indicator {
|
||||||
|
background: #67b3f4;
|
||||||
background: #67B3F4;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:nth-child(3) {
|
&:nth-child(3) {
|
||||||
.indicator {
|
.indicator {
|
||||||
|
background: #7981f5;
|
||||||
background: #7981F5;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,15 +258,12 @@
|
||||||
width: 5px;
|
width: 5px;
|
||||||
height: 5px;
|
height: 5px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
@use "../abstracts/variables" as *;
|
||||||
|
@use "../abstracts/mixins" as *;
|
||||||
|
|
||||||
|
.labeled-button-container {
|
||||||
|
@include flex-space-between;
|
||||||
|
padding: 6px 12px;
|
||||||
|
|
||||||
|
button {
|
||||||
|
padding: 2px 32px;
|
||||||
|
border: none;
|
||||||
|
border-radius: #{$border-radius-large};
|
||||||
|
color: var(--text-button-color);
|
||||||
|
background: var(--background-color-button);
|
||||||
|
transition: all 0.2s;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
background: none;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
|
@ -639,21 +639,6 @@ input[type="number"] {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.labeled-button-container {
|
|
||||||
@include flex-space-between;
|
|
||||||
padding: 6px 12px;
|
|
||||||
|
|
||||||
button {
|
|
||||||
padding: 2px 32px;
|
|
||||||
border: none;
|
|
||||||
border-radius: #{$border-radius-large};
|
|
||||||
color: var(--text-button-color);
|
|
||||||
background: var(--background-color-button);
|
|
||||||
transition: all 0.2s;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.value-field-container {
|
.value-field-container {
|
||||||
margin-bottom: 6px;
|
margin-bottom: 6px;
|
||||||
padding: 6px 12px;
|
padding: 6px 12px;
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
transition: width 0.2s;
|
transition: width 0.2s;
|
||||||
background: var(--background-color);
|
background: var(--background-color);
|
||||||
backdrop-filter: blur(8px);
|
backdrop-filter: blur(8px);
|
||||||
z-index: #{$z-index-default};
|
z-index: 2;
|
||||||
outline: 1px solid var(--border-color);
|
outline: 1px solid var(--border-color);
|
||||||
outline-offset: -1px;
|
outline-offset: -1px;
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
|
|
||||||
// Main Container
|
// Main Container
|
||||||
.realTime-viz {
|
.realTime-viz {
|
||||||
background: #131313;
|
|
||||||
box-shadow: $box-shadow-medium;
|
|
||||||
width: calc(100% - (320px + 270px + 90px));
|
width: calc(100% - (320px + 270px + 90px));
|
||||||
height: calc(100% - (250px));
|
height: calc(100% - (250px));
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
@ -12,8 +10,8 @@
|
||||||
left: calc(270px + 45px);
|
left: calc(270px + 45px);
|
||||||
transform: translate(0, -50%);
|
transform: translate(0, -50%);
|
||||||
border-radius: #{$border-radius-medium};
|
border-radius: #{$border-radius-medium};
|
||||||
transition: all 0.2s;
|
z-index: 2;
|
||||||
z-index: #{$z-index-default};
|
pointer-events: none;
|
||||||
|
|
||||||
.realTime-viz-wrapper {
|
.realTime-viz-wrapper {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -39,10 +37,6 @@
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.scene-container {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon {
|
.icon {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
@ -74,6 +68,8 @@
|
||||||
z-index: 3;
|
z-index: 3;
|
||||||
transform: translate(-50%, -10%);
|
transform: translate(-50%, -10%);
|
||||||
transition: transform 0.5s linear;
|
transition: transform 0.5s linear;
|
||||||
|
pointer-events: all;
|
||||||
|
|
||||||
&::-webkit-scrollbar {
|
&::-webkit-scrollbar {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
@ -367,6 +363,7 @@
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
transition: transform 0.3s ease;
|
transition: transform 0.3s ease;
|
||||||
box-shadow: #{$box-shadow-medium};
|
box-shadow: #{$box-shadow-medium};
|
||||||
|
pointer-events: all;
|
||||||
|
|
||||||
svg {
|
svg {
|
||||||
stroke: var(--icon-default-color) !important;
|
stroke: var(--icon-default-color) !important;
|
||||||
|
@ -428,8 +425,6 @@
|
||||||
stroke: #f65648;
|
stroke: #f65648;
|
||||||
stroke-width: 1.3;
|
stroke-width: 1.3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -778,17 +773,10 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.panel-content {
|
.panel-content {
|
||||||
background: var(--background-color);
|
background: var(--background-color);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* RIGHT */
|
/* RIGHT */
|
||||||
.panel-content.right-opening {
|
.panel-content.right-opening {
|
||||||
animation: rightExpand 0.5s ease-in-out forwards;
|
animation: rightExpand 0.5s ease-in-out forwards;
|
||||||
|
@ -913,9 +901,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Add button
|
// Add button
|
||||||
|
|
||||||
.extra-Bs-addopening {
|
.extra-Bs-addopening {
|
||||||
|
@ -926,7 +911,6 @@
|
||||||
animation: slideUp 0.3s ease forwards;
|
animation: slideUp 0.3s ease forwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@keyframes slideDown {
|
@keyframes slideDown {
|
||||||
from {
|
from {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
|
Loading…
Reference in New Issue