diff --git a/packages/bpmn-editor/src/diagram/BpmnDiagramDomain.tsx b/packages/bpmn-editor/src/diagram/BpmnDiagramDomain.tsx index 814c1ff3516..85cdb8f3878 100644 --- a/packages/bpmn-editor/src/diagram/BpmnDiagramDomain.tsx +++ b/packages/bpmn-editor/src/diagram/BpmnDiagramDomain.tsx @@ -103,11 +103,11 @@ export type BpmnNodeType = Values; export type BpmnEdgeType = Values; export enum ActivityNodeMarker { - Compensation = "Compensation", + Collapsed = "Collapsed", MultiInstanceParallel = "MultiInstanceParallel", MultiInstanceSequential = "MultiInstanceSequential", - Collapsed = "Collapsed", Loop = "Loop", + Compensation = "Compensation", AdHocSubProcess = "AdHocSubProcess", } diff --git a/packages/bpmn-editor/src/diagram/nodes/NodeIcons.tsx b/packages/bpmn-editor/src/diagram/nodes/NodeIcons.tsx index d32bf47c998..5346e2b872a 100644 --- a/packages/bpmn-editor/src/diagram/nodes/NodeIcons.tsx +++ b/packages/bpmn-editor/src/diagram/nodes/NodeIcons.tsx @@ -50,17 +50,19 @@ export function NodeIcon({ nodeType }: { nodeType: BpmnNodeType }) { }); } -export function EventDefitnitionIcon({ +export function EventDefinitionIcon({ variant, filled, + fill, stroke, }: { variant?: EventVariant; filled: boolean; + fill?: string; stroke: string; }) { const cx = nodeSvgProps.x + nodeSvgProps.width / 2; - const cy = nodeSvgProps.y + nodeSvgProps.width / 2; + const cy = nodeSvgProps.y + nodeSvgProps.height / 2; const r = nodeSvgProps.width / 2; @@ -69,13 +71,15 @@ export function EventDefitnitionIcon({ @@ -114,10 +118,10 @@ export function EndEventIcon({ variant }: { variant?: EventVariant }) { ); } -export function TaskIcon({ variant }: { variant?: TaskVariant }) { +export function TaskIcon({ variant, isIcon }: { variant?: TaskVariant; isIcon?: boolean }) { return ( - + ); } @@ -130,10 +134,10 @@ export function CallActivityIcon() { ); } -export function GatewayIcon({ variant }: { variant?: GatewayVariant }) { +export function GatewayIcon({ variant, isIcon }: { variant?: GatewayVariant; isIcon?: boolean }) { return ( - + ); } diff --git a/packages/bpmn-editor/src/diagram/nodes/NodeSvgs.tsx b/packages/bpmn-editor/src/diagram/nodes/NodeSvgs.tsx index 253d9735a81..fd09c0a30ff 100644 --- a/packages/bpmn-editor/src/diagram/nodes/NodeSvgs.tsx +++ b/packages/bpmn-editor/src/diagram/nodes/NodeSvgs.tsx @@ -22,7 +22,6 @@ import { DEFAULT_INTRACTION_WIDTH } from "@kie-tools/xyflow-react-kie-diagram/di import { DEFAULT_NODE_FILL, DEFAULT_NODE_STROKE_COLOR } from "./NodeStyle"; import { containerNodeInteractionRectCssClassName, - DEFAULT_NODE_STROKE_WIDTH, NodeSvgProps, normalize, } from "@kie-tools/xyflow-react-kie-diagram/dist/nodes/NodeSvgs"; @@ -343,7 +342,8 @@ export function EndEventNodeSvg(__props: NodeSvgProps & { variant: EventVariant export function TaskNodeSvg( __props: NodeSvgProps & { markers?: (ActivityNodeMarker | "CallActivityPaletteIcon")[]; - variant?: TaskVariant | "none"; + variant?: TaskVariant | "task" | "callActivity" | "none"; + isIcon?: boolean; } ) { const { @@ -355,26 +355,66 @@ export function TaskNodeSvg( props: { ..._props }, } = normalize(__props); + const { variant, isIcon } = { ..._props }; const { markers: _markers, variant: _variant, ...props } = { ..._props }; const markers = useMemo(() => new Set(_markers), [_markers]); - const variant = _variant ?? "none"; + const iconSize = 200; + const defaultSize = 25; + const defaultOffset = { cx: x + 3, cy: y + 3 }; + const iconOffsets = { + scriptTask: isIcon ? { cx: x - 2, cy: y - 25 } : defaultOffset, + businessRuleTask: isIcon ? { cx: x - 10, cy: y - 10 } : defaultOffset, + serviceTask: isIcon ? { cx: x - 5, cy: y - 35 } : defaultOffset, + userTask: isIcon ? { cx: x - 5, cy: y - 45 } : defaultOffset, + }; return ( <> - + {!isIcon && ( + + )} + + {variant === "scriptTask" && ( + + + + )} + + {variant === "businessRuleTask" && ( + + + + )} + + {variant === "serviceTask" && ( + + + + )} + + {variant === "userTask" && ( + + + + )} + {markers.has("CallActivityPaletteIcon") && ( ); } -export function GatewayNodeSvg(__props: NodeSvgProps & { variant: GatewayVariant | "none" }) { + +export function ScriptTaskSvg({ stroke, size }: { stroke: string; size: number }) { + return ( + + + + + + + + + + ); +} + +export function BusinessRuleTaskSvg({ + stroke, + strokeWidth, + size, +}: { + stroke: string; + strokeWidth: number; + size: number; +}) { + const headerHeight = size / 5; + const rowHeight = size / 4; + const columnWidth1 = size / 3; + const columnWidth2 = (size / 3) * 2; + + return ( + <> + {/* Header row */} + + {/* First row */} + + + {/* Second row */} + + + + ); +} + +export function ServiceTaskSvg({ stroke, size }: { stroke: string; size: number }) { + return ( + + + + + + + ); +} + +export function UserTaskSvg({ stroke, size }: { stroke: string; size: number }) { + return ( + + + + + + ); +} +export function GatewayNodeSvg(__props: NodeSvgProps & { variant: GatewayVariant | "none"; isIcon?: boolean }) { const { x, y, @@ -404,88 +700,226 @@ export function GatewayNodeSvg(__props: NodeSvgProps & { variant: GatewayVariant props: { ..._props }, } = normalize(__props); - const { variant, ...props } = { ..._props }; + const { variant, isIcon, ...props } = { ..._props }; + const iconOffset = isIcon ? 25 : 0; return ( <> - + {!isIcon && ( + + )} {variant === "parallelGateway" && ( - <> - - - + )} {variant === "exclusiveGateway" && ( - <> - - - - - + )} {variant === "inclusiveGateway" && ( - <> - - + )} - {variant === "eventBasedGateway" && <>{/* TODO: Tiago */}} - {variant === "complexGateway" && <>{/* TODO: Tiago */}} + {variant === "eventBasedGateway" && ( + + )} + {variant === "complexGateway" && ( + + )} + + ); +} + +export function ParallelGatewaySvg({ + stroke, + strokeWidth, + cx, + cy, + size, +}: { + stroke: string; + strokeWidth?: number; + cx: number; + cy: number; + size: number; +}) { + return ( + <> + + + + ); +} + +export function ExclusiveGatewaySvg({ + stroke, + strokeWidth, + cx, + cy, + size, +}: { + stroke: string; + strokeWidth?: number; + cx: number; + cy: number; + size: number; +}) { + return ( + <> + + + + ); +} + +export function InclusiveGatewaySvg({ + stroke, + strokeWidth, + cx, + cy, + size, +}: { + stroke: string; + strokeWidth?: number; + cx: number; + cy: number; + size: number; +}) { + return ( + <> + + + ); +} + +export function EventBasedGatewaySvg({ + stroke, + strokeWidth, + circleStrokeWidth, + cx, + cy, + size, +}: { + stroke: string; + strokeWidth?: number; + circleStrokeWidth?: number; + cx: number; + cy: number; + size: number; +}) { + const pentagonPoints = Array.from({ length: 5 }, (_, i) => { + const angle = (i * 2 * Math.PI) / 5 - Math.PI / 2; + return { + x: cx + (size / 4) * Math.cos(angle), + y: cy + (size / 4) * Math.sin(angle), + }; + }); + + return ( + <> + + + `${point.x},${point.y}`).join(" ")} + stroke={stroke} + strokeWidth={strokeWidth} + fill="none" + /> + + ); +} + +export function ComplexGatewaySvg({ + stroke, + strokeWidth, + cx, + cy, + size, +}: { + stroke: string; + strokeWidth?: number; + cx: number; + cy: number; + size: number; +}) { + const lineLength = size / 3; + const diagonalLength = lineLength / Math.sqrt(2); + + return ( + <> + + + + ); } @@ -748,6 +1182,7 @@ export function EventVariantSymbolSvg({ variant, stroke, strokeWidth, + isIcon, cx, cy, x, @@ -760,6 +1195,7 @@ export function EventVariantSymbolSvg({ variant: EventVariant | "none"; stroke: string; strokeWidth?: number; + isIcon?: boolean; cx: number; cy: number; x: number; @@ -776,6 +1212,8 @@ export function EventVariantSymbolSvg({ fill={fill ?? "none"} filled={filled} stroke={stroke} + strokeWidth={strokeWidth} + isIcon={isIcon} cx={cx} cy={cy} innerCircleRadius={innerCircleRadius} @@ -785,6 +1223,8 @@ export function EventVariantSymbolSvg({ )} {variant === "cancelEventDefinition" && ( - + )} {variant === "compensateEventDefinition" && ( )} {variant === "linkEventDefinition" && ( - + )} {variant === "signalEventDefinition" && ( )} - {variant === "terminateEventDefinition" && ( <> `${point.x},${point.y}`).join(" ")} - strokeWidth={1.5} + strokeWidth={strokeWidth ?? 1.5} strokeLinejoin={"round"} fill={filled ? stroke : fill} stroke={stroke} @@ -929,7 +1396,7 @@ export function MessageEventSymbolSvg({ x2={envelopeFlap[2].x} y2={envelopeFlap[2].y} stroke={fill} - strokeWidth={1.5} + strokeWidth={strokeWidth ?? 1.5} /> )} @@ -947,6 +1414,8 @@ export function MessageEventSymbolSvg({ export function TimerEventSymbolSvg({ stroke, + strokeWidth, + isIcon, cx, cy, innerCircleRadius, @@ -954,29 +1423,33 @@ export function TimerEventSymbolSvg({ filled, }: { stroke: string; + strokeWidth?: number; + isIcon?: boolean; cx: number; cy: number; innerCircleRadius: number; outerCircleRadius: number; filled: boolean; }) { - const padding = 1.2 * (outerCircleRadius - innerCircleRadius); - const clockRadius = innerCircleRadius - padding; + const scaleFactor = isIcon ? 1.4 : 1; + + const scaledPadding = 1.2 * (outerCircleRadius - innerCircleRadius) * scaleFactor; + const scaledClockRadius = (innerCircleRadius - scaledPadding) * scaleFactor; - const shortHandLength = clockRadius * 0.5; - const longHandLength = clockRadius * 0.9; + const scaledShortHandLength = scaledClockRadius * 0.5; + const scaledLongHandLength = scaledClockRadius * 0.9; const hourHandAngle = Math.PI / 12; const minuteHandAngle = (-5 * Math.PI) / 12; const hourHand = { - x: cx + shortHandLength * Math.cos(hourHandAngle), - y: cy + shortHandLength * Math.sin(hourHandAngle), + x: cx + scaledShortHandLength * Math.cos(hourHandAngle), + y: cy + scaledShortHandLength * Math.sin(hourHandAngle), }; const minuteHand = { - x: cx + longHandLength * Math.cos(minuteHandAngle), - y: cy + longHandLength * Math.sin(minuteHandAngle), + x: cx + scaledLongHandLength * Math.cos(minuteHandAngle), + y: cy + scaledLongHandLength * Math.sin(minuteHandAngle), }; return ( @@ -984,9 +1457,9 @@ export function TimerEventSymbolSvg({ @@ -996,7 +1469,7 @@ export function TimerEventSymbolSvg({ x2={hourHand.x} y2={hourHand.y} stroke={filled ? "transparent" : stroke} - strokeWidth={1.5} + strokeWidth={strokeWidth ?? 1.5} /> {Array.from({ length: 12 }, (_, index) => { const angle = (index / 12) * 2 * Math.PI; - const x1 = cx + clockRadius * Math.cos(angle); - const y1 = cy + clockRadius * Math.sin(angle); - const x2 = cx + (clockRadius - padding * 0.5) * Math.cos(angle); - const y2 = cy + (clockRadius - padding * 0.5) * Math.sin(angle); + const x1 = cx + scaledClockRadius * Math.cos(angle); + const y1 = cy + scaledClockRadius * Math.sin(angle); + const x2 = cx + (scaledClockRadius - scaledPadding * 0.5) * Math.cos(angle); + const y2 = cy + (scaledClockRadius - scaledPadding * 0.5) * Math.sin(angle); return ; })} @@ -1023,6 +1496,7 @@ export function TimerEventSymbolSvg({ export function ErrorEventSymbolSvg({ stroke, + strokeWidth, cx, cy, innerCircleRadius, @@ -1030,6 +1504,8 @@ export function ErrorEventSymbolSvg({ filled, }: { stroke: string; + strokeWidth?: number; + isIcon?: boolean; cx: number; cy: number; innerCircleRadius: number; @@ -1058,7 +1534,7 @@ export function ErrorEventSymbolSvg({ <> `${point.x},${point.y}`).join(" ")} - strokeWidth={1.5} + strokeWidth={strokeWidth ?? 1.5} strokeLinejoin={"round"} fill={filled ? stroke : "transparent"} stroke={stroke} @@ -1069,32 +1545,38 @@ export function ErrorEventSymbolSvg({ export function EscalationEventSymbolSvg({ stroke, + strokeWidth, + isIcon, cx, cy, innerCircleRadius, filled, }: { stroke: string; + strokeWidth?: number; + isIcon?: boolean; cx: number; cy: number; innerCircleRadius: number; filled: boolean; }) { - const arrowHeight = innerCircleRadius * 1.2; - const arrowBaseWidth = innerCircleRadius * 1; + const scaleFactor = isIcon ? 1.8 : 1; + const scaledArrowHeight = innerCircleRadius * 1.2 * scaleFactor; + const scaledArrowBaseWidth = innerCircleRadius * scaleFactor; + const midCenterYOffset = ((innerCircleRadius * 1.2) / 20) * scaleFactor; const arrow = [ - { x: cx - arrowBaseWidth / 2, y: cy + arrowHeight / 2 }, // left - { x: cx, y: cy - arrowHeight / 2 }, // top center - { x: cx + arrowBaseWidth / 2, y: cy + arrowHeight / 2 }, // right - { x: cx, y: cy + arrowHeight / 20 }, // mid center + { x: cx - scaledArrowBaseWidth / 2, y: cy + scaledArrowHeight / 2 }, // left + { x: cx, y: cy - scaledArrowHeight / 2 }, // top center + { x: cx + scaledArrowBaseWidth / 2, y: cy + scaledArrowHeight / 2 }, // right + { x: cx, y: cy + midCenterYOffset }, // mid center ] as const; return ( <> `${point.x},${point.y}`).join(" ")} - strokeWidth={1.5} + strokeWidth={strokeWidth ?? 1.5} strokeLinejoin={"round"} fill={filled ? stroke : "transparent"} stroke={stroke} @@ -1105,12 +1587,14 @@ export function EscalationEventSymbolSvg({ export function CancelEventSymbolSvg({ stroke, + strokeWidth, cx, cy, innerCircleRadius, filled, }: { stroke: string; + strokeWidth?: number; cx: number; cy: number; innerCircleRadius: number; @@ -1140,7 +1624,7 @@ export function CancelEventSymbolSvg({ <> `${point.x},${point.y}`).join(" ")} - strokeWidth={1.5} + strokeWidth={strokeWidth ?? 1.5} strokeLinejoin={"round"} fill={filled ? stroke : "transparent"} stroke={stroke} @@ -1151,6 +1635,7 @@ export function CancelEventSymbolSvg({ export function CompensationEventSymbolSvg({ stroke, + strokeWidth, cx, cy, x, @@ -1160,6 +1645,7 @@ export function CompensationEventSymbolSvg({ filled, }: { stroke: string; + strokeWidth?: number; cx: number; cy: number; x: number; @@ -1191,14 +1677,14 @@ export function CompensationEventSymbolSvg({ <> `${point.x},${point.y}`).join(" ")} - strokeWidth={1.5} + strokeWidth={strokeWidth ?? 1.5} strokeLinejoin={"round"} fill={filled ? stroke : "transparent"} stroke={stroke} /> `${point.x},${point.y}`).join(" ")} - strokeWidth={1.5} + strokeWidth={strokeWidth ?? 1.5} strokeLinejoin={"round"} fill={filled ? stroke : "transparent"} stroke={stroke} @@ -1209,74 +1695,86 @@ export function CompensationEventSymbolSvg({ export function ConditionalEventSymbolSvg({ stroke, + strokeWidth, + isIcon, cx, cy, outerCircleRadius, filled, }: { stroke: string; + strokeWidth?: number; + isIcon?: boolean; cx: number; cy: number; outerCircleRadius: number; filled: boolean; }) { - const squareSize = outerCircleRadius * 1.1; + const scaleFactor = isIcon ? 1.8 : 1; + + const squareSize = outerCircleRadius * 1.1 * scaleFactor; + const halfSquareSize = squareSize / 2; const lineSpacing = squareSize / 5; - const lineThickness = 2; + const lineBuffer = isIcon ? 50 : 5; + const x1 = cx - halfSquareSize + lineBuffer; + const x2 = cx + halfSquareSize - lineBuffer; + + const squareX = cx - halfSquareSize; + const squareY = cy - halfSquareSize; return ( <> - {[...Array(4)].map((_, index) => ( - - ))} + {[...Array(4)].map((_, index) => { + const lineY = squareY + lineSpacing * (index + 1); + return ( + + ); + })} ); } - export function LinkEventSymbolSvg({ stroke, + strokeWidth, + isIcon, cx, cy, innerCircleRadius, filled, }: { stroke: string; + strokeWidth?: number; + isIcon?: boolean; cx: number; cy: number; innerCircleRadius: number; filled: boolean; }) { + const scaleFactor = isIcon ? 50 : 1; + const arrowHeight = innerCircleRadius * 1.2; const arrowBaseWidth = innerCircleRadius * 1; - const shiftLeft = 7; + const shiftLeft = 6; const rectangleHeight = 5; - const arrowPadding = 2; + const arrowPadding = 1; const arrow = [ - { x: cx - arrowBaseWidth / 2 - shiftLeft, y: cy + arrowHeight / 2 - rectangleHeight }, // bottom left rectangle - { x: cx - arrowBaseWidth / 2 - shiftLeft, y: cy - arrowHeight / 2 + rectangleHeight }, // top left rectangle + { x: cx - arrowBaseWidth / 2 - shiftLeft - scaleFactor, y: cy + arrowHeight / 2 - rectangleHeight }, // bottom left rectangle + { x: cx - arrowBaseWidth / 2 - shiftLeft - scaleFactor, y: cy - arrowHeight / 2 + rectangleHeight }, // top left rectangle { x: cx + arrowBaseWidth / 2, y: cy - arrowHeight / 2 + rectangleHeight }, // top right rectangle - { x: cx + arrowBaseWidth / 2, y: cy - arrowHeight / 2 - arrowPadding }, // upper arrow start - { x: cx + arrowBaseWidth / 2 + 8, y: cy }, // arrow point - { x: cx + arrowBaseWidth / 2, y: cy + arrowHeight / 2 + arrowPadding }, // lower arrow start + { x: cx + arrowBaseWidth / 2, y: cy - arrowHeight / 2 - arrowPadding - scaleFactor }, // upper arrow start + { x: cx + arrowBaseWidth / 2 + 7 + scaleFactor, y: cy }, // arrow point + { x: cx + arrowBaseWidth / 2, y: cy + arrowHeight / 2 + arrowPadding + scaleFactor }, // lower arrow start { x: cx + arrowBaseWidth / 2, y: cy + arrowHeight / 2 - rectangleHeight }, // bottom right rectangle ] as const; @@ -1284,7 +1782,7 @@ export function LinkEventSymbolSvg({ <> `${point.x},${point.y}`).join(" ")} - strokeWidth={1.5} + strokeWidth={strokeWidth ?? 1.5} strokeLinejoin={"round"} fill={filled ? stroke : "transparent"} stroke={stroke} @@ -1296,6 +1794,7 @@ export function LinkEventSymbolSvg({ export function SignalEventSymbolSvg({ stroke, strokeWidth, + isIcon, cx, cy, x, @@ -1306,6 +1805,7 @@ export function SignalEventSymbolSvg({ }: { stroke: string; strokeWidth?: number; + isIcon?: boolean; cx: number; cy: number; x: number; @@ -1314,13 +1814,16 @@ export function SignalEventSymbolSvg({ outerCircleRadius: number; filled: boolean; }) { + const scaleFactor = isIcon ? 1.2 : 1; + const padding = 1.5 * (outerCircleRadius - innerCircleRadius); - const hx = x + innerCircleRadius - padding; - const hy = y + innerCircleRadius - padding; + const hx = (x + innerCircleRadius - padding) * scaleFactor; + const hy = (y + innerCircleRadius - padding) * scaleFactor; + const triangle = [ - { x: cx + cos30 * hx, y: padding / 4 + cy + sin30 * hy }, // right - { x: cx - cos30 * hx, y: padding / 4 + cy + sin30 * hy }, // left - { x: cx, y: padding / 4 + cy - hy }, // top + { x: cx + cos30 * hx, y: (padding / 4) * scaleFactor + cy + sin30 * hy }, // right + { x: cx - cos30 * hx, y: (padding / 4) * scaleFactor + cy + sin30 * hy }, // left + { x: cx, y: (padding / 4) * scaleFactor + cy - hy }, // top ] as const; return ( @@ -1349,85 +1852,251 @@ export function ActivityNodeIcons({ height: number; icons: Set; }) { + const orderedMarkers = Object.values(ActivityNodeMarker); + const iconElements = orderedMarkers.filter((marker) => icons.has(marker)); + const iconSize = 20; + const iconSpacing = 2; + const stroke = NODE_COLORS.task.foreground; + const strokeWidth = 2; + const totalIconsWidth = iconElements.length * iconSize + (iconElements.length - 1) * iconSpacing; + const startX = x + (width - totalIconsWidth) / 2; + const bottomY = y + height; + return ( <> - {icons.has(ActivityNodeMarker.Loop) && ( - - ↻ - - )} - {icons.has(ActivityNodeMarker.AdHocSubProcess) && ( - - ~ - - )} - {icons.has(ActivityNodeMarker.Compensation) && ( - - ⏪ - - )} - {icons.has(ActivityNodeMarker.Collapsed) && ( - <> - - - + - - - )} - {icons.has(ActivityNodeMarker.MultiInstanceParallel) && ( - - ☰ - - )} - {icons.has(ActivityNodeMarker.MultiInstanceSequential) && ( - - ☰ - - )} + {iconElements.map((icon, index) => { + const iconX = startX + index * (iconSize + iconSpacing); + + return icon === ActivityNodeMarker.Collapsed ? ( + + + + ) : icon === ActivityNodeMarker.MultiInstanceParallel ? ( + + + + ) : icon === ActivityNodeMarker.MultiInstanceSequential ? ( + + + + ) : icon === ActivityNodeMarker.Loop ? ( + + + + ) : icon === ActivityNodeMarker.AdHocSubProcess ? ( + + + + ) : icon === ActivityNodeMarker.Compensation ? ( + + + + ) : null; + })} + + ); +} +export function LoopIconSvg({ stroke, size }: { stroke: string; size: number }) { + return ( + + + + + + ); +} + +export function AdHocSubProcessIconSvg({ stroke, size }: { stroke: string; size: number }) { + return ( + + + + + + ); +} + +export function CompensationIconSvg({ + stroke, + strokeWidth, + size, +}: { + stroke: string; + strokeWidth: number; + size: number; +}) { + const arrowWidth = size / 3; + const arrowHeight = size / 2; + const centerY = size / 2; + const offsetX = size / 4; + + return ( + <> + {/* Left Arrow */} + + + {/* Right Arrow */} + + + ); +} + +export function CollapsedIconSvg({ stroke, strokeWidth, size }: { stroke: string; strokeWidth: number; size: number }) { + const squareSize = size; + const padding = size * 0.25; + + return ( + <> + + + + + ); +} + +export function MultiInstanceSequentialIconSvg({ + stroke, + strokeWidth, + size, +}: { + stroke: string; + strokeWidth: number; + size: number; +}) { + const lineSpacing = size / 5; + const lineWidth = size * 0.5; + + return ( + <> + + + + + ); +} + +export function MultiInstanceParallelIconSvg({ + stroke, + strokeWidth, + size, +}: { + stroke: string; + strokeWidth: number; + size: number; +}) { + const lineSpacing = size / 5; + const lineHeight = size * 0.5; + + return ( + <> + + + ); } diff --git a/packages/bpmn-editor/src/diagram/nodes/Nodes.tsx b/packages/bpmn-editor/src/diagram/nodes/Nodes.tsx index 224a2fdead1..4faee06eb8b 100644 --- a/packages/bpmn-editor/src/diagram/nodes/Nodes.tsx +++ b/packages/bpmn-editor/src/diagram/nodes/Nodes.tsx @@ -141,7 +141,7 @@ export const StartEventNode = React.memo( [bpmnEditorStoreApi, id] ); - const [isMorphingPanelExpanded, setMorphingPanelExpanded] = useState(false); + const [isIconExpanded, setMorphingPanelExpanded] = useState(false); useEffect(() => setMorphingPanelExpanded(false), [isHovered]); const morphingActions = useEventNodeMorphingActions(startEvent); const disabledMorphingActionIds = useMemo["id"]>>( @@ -184,7 +184,7 @@ export const StartEventNode = React.memo(
*/}
{ bpmnEditorStoreApi.setState((state) => { state.propertiesPanel.isOpen = true; @@ -196,7 +196,7 @@ export const StartEventNode = React.memo( nodeMapping={bpmnNodesOutgoingStuffNodePanelMapping} edgeMapping={bpmnEdgesOutgoingStuffNodePanelMapping} nodeHref={id} - isVisible={!isMorphingPanelExpanded && !isTargeted && shouldActLikeHovered} + isVisible={!isIconExpanded && !isTargeted && shouldActLikeHovered} nodeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.startEvent].nodes} edgeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.startEvent].edges} /> @@ -204,7 +204,7 @@ export const StartEventNode = React.memo( {/* Creates a div element with the node size to push down the */} {
} - {(startEvent["@_name"] || isEditingLabel) && !isMorphingPanelExpanded && ( + {(startEvent["@_name"] || isEditingLabel) && !isIconExpanded && ( setMorphingPanelExpanded(false), [isHovered]); const morphingActions = useEventNodeMorphingActions(intermediateCatchEvent); const disabledMorphingActionIds = useMemo["id"]>>( @@ -330,7 +330,7 @@ export const IntermediateCatchEventNode = React.memo(
*/}
{ bpmnEditorStoreApi.setState((state) => { state.propertiesPanel.isOpen = true; @@ -342,7 +342,7 @@ export const IntermediateCatchEventNode = React.memo( nodeMapping={bpmnNodesOutgoingStuffNodePanelMapping} edgeMapping={bpmnEdgesOutgoingStuffNodePanelMapping} nodeHref={id} - isVisible={!isMorphingPanelExpanded && !isTargeted && shouldActLikeHovered} + isVisible={!isIconExpanded && !isTargeted && shouldActLikeHovered} nodeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.intermediateCatchEvent].nodes} edgeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.intermediateCatchEvent].edges} /> @@ -350,7 +350,7 @@ export const IntermediateCatchEventNode = React.memo( {/* Creates a div element with the node size to push down the */} {
} - {(intermediateCatchEvent["@_name"] || isEditingLabel) && !isMorphingPanelExpanded && ( + {(intermediateCatchEvent["@_name"] || isEditingLabel) && !isIconExpanded && ( setMorphingPanelExpanded(false), [isHovered]); const morphingActions = useEventNodeMorphingActions(intermediateThrowEvent); const disabledMorphingActionIds = useMemo["id"]>>( @@ -468,7 +468,7 @@ export const IntermediateThrowEventNode = React.memo(
*/}
{ bpmnEditorStoreApi.setState((state) => { state.propertiesPanel.isOpen = true; @@ -480,7 +480,7 @@ export const IntermediateThrowEventNode = React.memo( nodeMapping={bpmnNodesOutgoingStuffNodePanelMapping} edgeMapping={bpmnEdgesOutgoingStuffNodePanelMapping} nodeHref={id} - isVisible={!isMorphingPanelExpanded && !isTargeted && shouldActLikeHovered} + isVisible={!isIconExpanded && !isTargeted && shouldActLikeHovered} nodeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.intermediateThrowEvent].nodes} edgeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.intermediateThrowEvent].edges} /> @@ -488,7 +488,7 @@ export const IntermediateThrowEventNode = React.memo( {/* Creates a div element with the node size to push down the */} {
} - {(intermediateThrowEvent["@_name"] || isEditingLabel) && !isMorphingPanelExpanded && ( + {(intermediateThrowEvent["@_name"] || isEditingLabel) && !isIconExpanded && ( setMorphingPanelExpanded(false), [isHovered]); const morphingActions = useEventNodeMorphingActions(endEvent); const disabledMorphingActionIds = useMemo["id"]>>( @@ -598,7 +598,7 @@ export const EndEventNode = React.memo(
*/}
{ bpmnEditorStoreApi.setState((state) => { state.propertiesPanel.isOpen = true; @@ -610,7 +610,7 @@ export const EndEventNode = React.memo( nodeMapping={bpmnNodesOutgoingStuffNodePanelMapping} edgeMapping={bpmnEdgesOutgoingStuffNodePanelMapping} nodeHref={id} - isVisible={!isMorphingPanelExpanded && !isTargeted && shouldActLikeHovered} + isVisible={!isIconExpanded && !isTargeted && shouldActLikeHovered} nodeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.endEvent].nodes} edgeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.endEvent].edges} /> @@ -618,7 +618,7 @@ export const EndEventNode = React.memo( {/* Creates a div element with the node size to push down the */} {
} - {(endEvent["@_name"] || isEditingLabel) && !isMorphingPanelExpanded && ( + {(endEvent["@_name"] || isEditingLabel) && !isIconExpanded && ( setMorphingPanelExpanded(false), [isHovered]); const morphingActions = useTaskNodeMorphingActions(task); const disabledMorphingActionIds = useMemo["id"]>>(() => new Set(), []); @@ -726,6 +726,7 @@ export const TaskNode = React.memo( y={0} strokeWidth={task.__$$element === "callActivity" ? 5 : undefined} markers={icons} + variant={task.__$$element} /> @@ -742,7 +743,7 @@ export const TaskNode = React.memo(
*/}
{ bpmnEditorStoreApi.setState((state) => { state.propertiesPanel.isOpen = true; @@ -777,7 +778,7 @@ export const TaskNode = React.memo( nodeMapping={bpmnNodesOutgoingStuffNodePanelMapping} edgeMapping={bpmnEdgesOutgoingStuffNodePanelMapping} nodeHref={id} - isVisible={!isMorphingPanelExpanded && !isTargeted && shouldActLikeHovered} + isVisible={!isIconExpanded && !isTargeted && shouldActLikeHovered} nodeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.task].nodes} edgeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.task].edges} /> @@ -785,7 +786,7 @@ export const TaskNode = React.memo( setMorphingPanelExpanded(false), [isHovered]); const morphingActions = useSubProcessNodeMorphingActions(subProcess); const disabledMorphingActionIds = useMemo["id"]>>(() => new Set(), []); @@ -896,7 +897,7 @@ export const SubProcessNode = React.memo(
*/}
{ bpmnEditorStoreApi.setState((state) => { state.propertiesPanel.isOpen = true; @@ -931,7 +932,7 @@ export const SubProcessNode = React.memo( nodeMapping={bpmnNodesOutgoingStuffNodePanelMapping} edgeMapping={bpmnEdgesOutgoingStuffNodePanelMapping} nodeHref={id} - isVisible={!isMorphingPanelExpanded && !isTargeted && isOnlySelectedNode && !dragging} + isVisible={!isIconExpanded && !isTargeted && isOnlySelectedNode && !dragging} nodeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.subProcess].nodes} edgeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.subProcess].edges} /> @@ -939,7 +940,7 @@ export const SubProcessNode = React.memo( setMorphingPanelExpanded(false), [isHovered]); const morphingActions = useGatewayNodeMorphingActions(gateway); const disabledMorphingActionIds = useMemo["id"]>>(() => new Set(), []); @@ -1036,7 +1037,7 @@ export const GatewayNode = React.memo(
*/}
{ bpmnEditorStoreApi.setState((state) => { state.propertiesPanel.isOpen = true; @@ -1048,7 +1049,7 @@ export const GatewayNode = React.memo( nodeMapping={bpmnNodesOutgoingStuffNodePanelMapping} edgeMapping={bpmnEdgesOutgoingStuffNodePanelMapping} nodeHref={id} - isVisible={!isMorphingPanelExpanded && !isTargeted && shouldActLikeHovered} + isVisible={!isIconExpanded && !isTargeted && shouldActLikeHovered} nodeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.gateway].nodes} edgeTypes={BPMN_OUTGOING_STRUCTURE[NODE_TYPES.gateway].edges} /> @@ -1056,7 +1057,7 @@ export const GatewayNode = React.memo( {/* Creates a div element with the node size to push down the */} {
} - {(gateway["@_name"] || isEditingLabel) && !isMorphingPanelExpanded && ( + {(gateway["@_name"] || isEditingLabel) && !isIconExpanded && ( morphEvent(undefined), } as const, // none { - icon: , + icon: ( + + ), key: "2", title: "Message", id: "messageEventDefinition", action: () => morphEvent("messageEventDefinition"), } as const, { - icon: , + icon: , key: "3", title: "Timer", id: "timerEventDefinition", action: () => morphEvent("timerEventDefinition"), } as const, { - icon: , + icon: , key: "4", title: "Error", id: "errorEventDefinition", action: () => morphEvent("errorEventDefinition"), } as const, { - icon: , + icon: , key: "5", title: "Escalation", id: "escalationEventDefinition", action: () => morphEvent("escalationEventDefinition"), } as const, { - icon: , + icon: , key: "6", title: "Cancelation", id: "cancelEventDefinition", action: () => morphEvent("cancelEventDefinition"), } as const, { - icon: , + icon: , key: "7", title: "Compensation", id: "compensateEventDefinition", action: () => morphEvent("compensateEventDefinition"), } as const, { - icon: , + icon: , key: "8", title: "Conditional", id: "conditionalEventDefinition", action: () => morphEvent("conditionalEventDefinition"), } as const, { - icon: , + icon: , key: "9", title: "Link", id: "linkEventDefinition", action: () => morphEvent("linkEventDefinition"), } as const, { - icon: , + icon: , key: "0", title: "Signal", id: "signalEventDefinition", diff --git a/packages/bpmn-editor/src/diagram/nodes/morphing/useGatewayNodeMorphingActions.tsx b/packages/bpmn-editor/src/diagram/nodes/morphing/useGatewayNodeMorphingActions.tsx index dc4fc963c2b..6d79ef0e08b 100644 --- a/packages/bpmn-editor/src/diagram/nodes/morphing/useGatewayNodeMorphingActions.tsx +++ b/packages/bpmn-editor/src/diagram/nodes/morphing/useGatewayNodeMorphingActions.tsx @@ -67,35 +67,35 @@ export function useGatewayNodeMorphingActions(gateway: Gateway) { const morphingActions = useMemo(() => { return [ { - icon: , + icon: , key: "1", title: "Parallel", id: "parallelGateway", action: () => morphGateway("parallelGateway"), } as const, { - icon: , + icon: , key: "2", title: "Exclusive", id: "exclusiveGateway", action: () => morphGateway("exclusiveGateway"), } as const, { - icon: , + icon: , key: "3", title: "Inclusive", id: "inclusiveGateway", action: () => morphGateway("inclusiveGateway"), } as const, { - icon: , + icon: , key: "4", title: "Event", id: "eventBasedGateway", action: () => morphGateway("eventBasedGateway"), } as const, { - icon: , + icon: , key: "5", title: "Complex", id: "complexGateway", diff --git a/packages/bpmn-editor/src/diagram/nodes/morphing/useTaskNodeMorphingActions.tsx b/packages/bpmn-editor/src/diagram/nodes/morphing/useTaskNodeMorphingActions.tsx index 8556288a5eb..685e24225b0 100644 --- a/packages/bpmn-editor/src/diagram/nodes/morphing/useTaskNodeMorphingActions.tsx +++ b/packages/bpmn-editor/src/diagram/nodes/morphing/useTaskNodeMorphingActions.tsx @@ -68,28 +68,28 @@ export function useTaskNodeMorphingActions(task: Task) { const morphingActions = useMemo(() => { return [ { - icon: <>U, + icon: , key: "1", title: "User task", id: "userTask", action: () => morphTask("userTask"), } as const, { - icon: <>B, + icon: , key: "2", title: "Business Rule task", id: "businessRuleTask", action: () => morphTask("businessRuleTask"), } as const, { - icon: <>S, + icon: , key: "3", title: "Service task", id: "serviceTask", action: () => morphTask("serviceTask"), } as const, { - icon: <>X, + icon: , key: "4", title: "Script task", id: "scriptTask", diff --git a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/BusinessRuleTaskProperties.tsx b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/BusinessRuleTaskProperties.tsx index d873e6907e7..c30802c0296 100644 --- a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/BusinessRuleTaskProperties.tsx +++ b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/BusinessRuleTaskProperties.tsx @@ -50,7 +50,10 @@ export function BusinessRuleTaskProperties({ return ( <> - }> + } + > } + icon={} > diff --git a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/EndEventProperties.tsx b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/EndEventProperties.tsx index 58765b92a25..b3a24d53090 100644 --- a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/EndEventProperties.tsx +++ b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/EndEventProperties.tsx @@ -23,20 +23,31 @@ import { Normalized } from "../../normalization/normalize"; import { NameDocumentationAndId } from "../nameDocumentationAndId/NameDocumentationAndId"; import { InputOnlyAssociationFormSection } from "../assignments/AssignmentsFormSection"; import { EventDefinitionProperties } from "../eventDefinition/EventDefinitionProperties"; -import { EndEventIcon } from "../../diagram/nodes/NodeIcons"; +import { EndEventIcon, EventDefinitionIcon } from "../../diagram/nodes/NodeIcons"; import { PropertiesPanelHeaderFormSection } from "./_PropertiesPanelHeaderFormSection"; import { Divider } from "@patternfly/react-core/dist/js/components/Divider"; +import { NODE_COLORS } from "../../diagram/nodes/NodeSvgs"; export function EndEventProperties({ endEvent, }: { endEvent: Normalized & { __$$element: "endEvent" }; }) { + const foregroundColor = NODE_COLORS.endEvent.foreground; + const backgroundColor = NODE_COLORS.endEvent.background; + return ( <> } + icon={ + + } > diff --git a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/EventBasedGatewayProperties.tsx b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/EventBasedGatewayProperties.tsx index adaf97a7c3c..fd0e73801f0 100644 --- a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/EventBasedGatewayProperties.tsx +++ b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/EventBasedGatewayProperties.tsx @@ -33,7 +33,7 @@ export function EventBasedGatewayProperties({ return ( } + icon={} > diff --git a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ExclusiveGatewayProperties.tsx b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ExclusiveGatewayProperties.tsx index 64c6f6e4956..84653dc5ead 100644 --- a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ExclusiveGatewayProperties.tsx +++ b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ExclusiveGatewayProperties.tsx @@ -34,7 +34,7 @@ export function ExclusiveGatewayProperties({ return ( } + icon={} > diff --git a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/InclusiveGatewayProperties.tsx b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/InclusiveGatewayProperties.tsx index 7bc6dd6f2e2..4744db7e283 100644 --- a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/InclusiveGatewayProperties.tsx +++ b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/InclusiveGatewayProperties.tsx @@ -34,7 +34,7 @@ export function InclusiveGatewayProperties({ return ( } + icon={} > diff --git a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/IntermediateCatchEventProperties.tsx b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/IntermediateCatchEventProperties.tsx index cb0c5e9df09..7e34ae9f3ae 100644 --- a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/IntermediateCatchEventProperties.tsx +++ b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/IntermediateCatchEventProperties.tsx @@ -23,20 +23,29 @@ import { Normalized } from "../../normalization/normalize"; import { NameDocumentationAndId } from "../nameDocumentationAndId/NameDocumentationAndId"; import { OutputOnlyAssociationFormSection } from "../assignments/AssignmentsFormSection"; import { EventDefinitionProperties } from "../eventDefinition/EventDefinitionProperties"; -import { IntermediateCatchEventIcon } from "../../diagram/nodes/NodeIcons"; +import { EventDefinitionIcon, IntermediateCatchEventIcon } from "../../diagram/nodes/NodeIcons"; import { PropertiesPanelHeaderFormSection } from "./_PropertiesPanelHeaderFormSection"; import { Divider } from "@patternfly/react-core/dist/js/components/Divider"; +import { NODE_COLORS } from "../../diagram/nodes/NodeSvgs"; export function IntermediateCatchEventProperties({ intermediateCatchEvent, }: { intermediateCatchEvent: Normalized & { __$$element: "intermediateCatchEvent" }; }) { + const foregroundColor = NODE_COLORS.intermediateCatchEvent.foreground; + return ( <> } + icon={ + + } > diff --git a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/IntermediateThrowEventProperties.tsx b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/IntermediateThrowEventProperties.tsx index 6616042743c..ed02440802d 100644 --- a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/IntermediateThrowEventProperties.tsx +++ b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/IntermediateThrowEventProperties.tsx @@ -23,20 +23,30 @@ import { Normalized } from "../../normalization/normalize"; import { NameDocumentationAndId } from "../nameDocumentationAndId/NameDocumentationAndId"; import { InputOnlyAssociationFormSection } from "../assignments/AssignmentsFormSection"; import { EventDefinitionProperties } from "../eventDefinition/EventDefinitionProperties"; -import { IntermediateThrowEventIcon } from "../../diagram/nodes/NodeIcons"; +import { EventDefinitionIcon, IntermediateThrowEventIcon } from "../../diagram/nodes/NodeIcons"; import { PropertiesPanelHeaderFormSection } from "./_PropertiesPanelHeaderFormSection"; import { Divider } from "@patternfly/react-core/dist/js/components/Divider"; +import { NODE_COLORS } from "../../diagram/nodes/NodeSvgs"; export function IntermediateThrowEventProperties({ intermediateThrowEvent, }: { intermediateThrowEvent: Normalized & { __$$element: "intermediateThrowEvent" }; }) { + const foregroundColor = NODE_COLORS.intermediateThrowEvent.foreground; + const backgroundColor = NODE_COLORS.intermediateThrowEvent.background; return ( <> } + icon={ + + } > diff --git a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ParallelGatewayProperties.tsx b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ParallelGatewayProperties.tsx index b0cd7ab3784..db50350b4aa 100644 --- a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ParallelGatewayProperties.tsx +++ b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ParallelGatewayProperties.tsx @@ -33,7 +33,7 @@ export function ParallelGatewayProperties({ return ( } + icon={} > diff --git a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ScriptTaskProperties.tsx b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ScriptTaskProperties.tsx index f5f3b7f44e7..0ed700639e4 100644 --- a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ScriptTaskProperties.tsx +++ b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ScriptTaskProperties.tsx @@ -39,7 +39,7 @@ export function ScriptTaskProperties({ <> } + icon={} > diff --git a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ServiceTaskProperties.tsx b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ServiceTaskProperties.tsx index 87fd3e198c0..d9c355d1bcc 100644 --- a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ServiceTaskProperties.tsx +++ b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/ServiceTaskProperties.tsx @@ -54,7 +54,7 @@ export function ServiceTaskProperties({ <> } + icon={} > diff --git a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/StartEventProperties.tsx b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/StartEventProperties.tsx index 1f857cb141a..96669a04b0f 100644 --- a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/StartEventProperties.tsx +++ b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/StartEventProperties.tsx @@ -23,20 +23,28 @@ import { Normalized } from "../../normalization/normalize"; import { NameDocumentationAndId } from "../nameDocumentationAndId/NameDocumentationAndId"; import { OutputOnlyAssociationFormSection } from "../assignments/AssignmentsFormSection"; import { EventDefinitionProperties } from "../eventDefinition/EventDefinitionProperties"; -import { StartEventIcon } from "../../diagram/nodes/NodeIcons"; +import { EventDefinitionIcon, StartEventIcon } from "../../diagram/nodes/NodeIcons"; import { PropertiesPanelHeaderFormSection } from "./_PropertiesPanelHeaderFormSection"; import { Divider } from "@patternfly/react-core/dist/js/components/Divider"; +import { NODE_COLORS } from "../../diagram/nodes/NodeSvgs"; export function StartEventProperties({ startEvent, }: { startEvent: Normalized & { __$$element: "startEvent" }; }) { + const foregroundColor = NODE_COLORS.startEvent.foreground; return ( <> } + icon={ + + } > diff --git a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/UserTaskProperties.tsx b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/UserTaskProperties.tsx index 8413765f57a..1ee7d223e16 100644 --- a/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/UserTaskProperties.tsx +++ b/packages/bpmn-editor/src/propertiesPanel/singleNodeProperties/UserTaskProperties.tsx @@ -42,7 +42,7 @@ export function UserTaskProperties({ <> } + icon={} >