+
+ {canChangeStrokeColor(appState, targetElements) &&
+ renderAction("changeStrokeColor")}
+
+ {canChangeBackgroundColor(appState, targetElements) && (
+
{renderAction("changeBackgroundColor")}
+ )}
+ {showFillIcons && renderAction("changeFillStyle")}
+
+ {(hasStrokeWidth(appState.activeTool.type) ||
+ targetElements.some((element) => hasStrokeWidth(element.type))) &&
+ renderAction("changeStrokeWidth")}
+
+ {(appState.activeTool.type === "freedraw" ||
+ targetElements.some((element) => element.type === "freedraw")) &&
+ renderAction("changeStrokeShape")}
+
+ {(hasStrokeStyle(appState.activeTool.type) ||
+ targetElements.some((element) => hasStrokeStyle(element.type))) && (
+ <>
+ {renderAction("changeStrokeStyle")}
+ {renderAction("changeSloppiness")}
+ >
+ )}
+
+ {(canChangeRoundness(appState.activeTool.type) ||
+ targetElements.some((element) => canChangeRoundness(element.type))) && (
+ <>{renderAction("changeRoundness")}>
+ )}
+
+ {(toolIsArrow(appState.activeTool.type) ||
+ targetElements.some((element) => toolIsArrow(element.type))) && (
+ <>{renderAction("changeArrowType")}>
+ )}
+
+ {(appState.activeTool.type === "text" ||
+ targetElements.some(isTextElement)) && (
+ <>
+ {renderAction("changeFontFamily")}
+ {renderAction("changeFontSize")}
+ {(appState.activeTool.type === "text" ||
+ suppportsHorizontalAlign(targetElements, elementsMap)) &&
+ renderAction("changeTextAlign")}
+ >
+ )}
+
+ {shouldAllowVerticalAlign(targetElements, elementsMap) &&
+ renderAction("changeVerticalAlign")}
+ {(canHaveArrowheads(appState.activeTool.type) ||
+ targetElements.some((element) => canHaveArrowheads(element.type))) && (
+ <>{renderAction("changeArrowhead")}>
+ )}
+
+ {renderAction("changeOpacity")}
+
+
+
+ {showAlignActions && !isSingleElementBoundContainer && (
+
+ )}
+ {!isEditingTextOrNewElement && targetElements.length > 0 && (
+
+ )}
+
+ );
+};
+
+export const ShapesSwitcher = ({
+ activeTool,
+ appState,
+ app,
+ UIOptions,
+}: {
+ activeTool: UIAppState["activeTool"];
+ appState: UIAppState;
+ app: AppClassProperties;
+ UIOptions: AppProps["UIOptions"];
+}) => {
+ const [isExtraToolsMenuOpen, setIsExtraToolsMenuOpen] = useState(false);
+
+ const frameToolSelected = activeTool.type === "frame";
+ const laserToolSelected = activeTool.type === "laser";
+ const embeddableToolSelected = activeTool.type === "embeddable";
+
+ const { TTDDialogTriggerTunnel } = useTunnels();
+
+ return (
+ <>
+ {SHAPES.map(({ value, icon, key, numericKey, fillable }, index) => {
+ if (
+ UIOptions.tools?.[
+ value as Extract