diff --git a/frontend/realtime/src/components/features/ToolbarMain/ToolbarMain.tsx b/frontend/realtime/src/components/features/ToolbarMain/ToolbarMain.tsx
index 8bae9131af..386003f2fb 100644
--- a/frontend/realtime/src/components/features/ToolbarMain/ToolbarMain.tsx
+++ b/frontend/realtime/src/components/features/ToolbarMain/ToolbarMain.tsx
@@ -25,6 +25,7 @@ import { ToolbarMainButtonNames } from "./enum";
import { dispatchUiEvents, uiEvents } from "~/signals/uiEvents";
import { paintColor } from "~/signals/uiEvents/toolbarMain/paintMode";
import { ColorPicker } from "~/components/ui/TextEditor/ColorPicker";
+import { PaintModeMenu } from "~/components/ui/ToolbarMain/PaintModeMenu";
export const ToolbarMain = ({
disabled = false,
@@ -157,7 +158,7 @@ export const ToolbarMain = ({
{buttonProps.PAINT.active ? (
-
void;
+ faIcon?: IconDefinition;
+ borderStyle?: string;
+ showBar?: boolean;
+ anchor?: "top" | "right" | "bottom" | "left";
+ anchorGap?: number;
+ fillBg?: boolean;
+ staticIconColor?: string;
+ streamChanges?: boolean;
+ defaultOpen?: boolean;
+ closeOnMouseLeave?: boolean;
+}) => {
+ const [isOpen, setIsOpen] = useState(defaultOpen);
+ const [{ currColor, textInput }, setStates] = useState<{
+ currColor: string;
+ textInput: string;
+ }>({
+ currColor: prevColor,
+ textInput: prevColor.substring(1),
+ });
+
+ useEffect(() => {
+ setIsOpen(defaultOpen);
+ }, [defaultOpen]);
+
+ const handleMouseLeave = (close: () => void) => {
+ if (closeOnMouseLeave) {
+ onChange(currColor);
+ setIsOpen(false);
+ close();
+ }
+ };
+
+ const handleTextInput = (e: ChangeEvent) => {
+ if (isHexColorCode(e.target.value)) {
+ setStates({
+ currColor: `#${e.target.value}`,
+ textInput: e.target.value,
+ });
+ } else {
+ setStates((curr) => ({
+ ...curr,
+ textInput: e.target.value,
+ }));
+ }
+ };
+
+ const isHexColorCode = (color: string) => {
+ const hexColorRegex = /^(?:[0-9a-fA-F]{3}){1,2}$/;
+ return hexColorRegex.test(color);
+ };
+
+ return (
+
+ {({ open, close }) => (
+ <>
+ defaultOpen && setIsOpen(true)}
+ >
+
+ {showBar && (
+
+ )}
+
+ {(open || isOpen) && (
+ handleMouseLeave(close)}>
+
+ {
+ setStates({
+ currColor: color,
+ textInput: color.substring(1),
+ });
+ if (streamChanges) {
+ onChange(color);
+ }
+ }}
+ />
+
+ {!closeOnMouseLeave && (
+
+
+
+
+ )}
+
+
+ )}
+ >
+ )}
+
+ );
+};