diff --git a/frontend/src/App.css b/frontend/src/App.css index 62c98da..7b8de62 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -7619,6 +7619,7 @@ html.desktop-client .tmb-logo-version { width: min(320px, calc(100vw - 24px)); max-height: min(420px, 60vh); overflow: auto; + overscroll-behavior: contain; padding: 8px 10px; border-radius: 8px; border: 1px solid color-mix(in srgb, #a78bfa 45%, transparent); diff --git a/frontend/src/components/strategyEditor/ConditionPresetPicker.tsx b/frontend/src/components/strategyEditor/ConditionPresetPicker.tsx index a5c5b38..afa4cbf 100644 --- a/frontend/src/components/strategyEditor/ConditionPresetPicker.tsx +++ b/frontend/src/components/strategyEditor/ConditionPresetPicker.tsx @@ -93,6 +93,21 @@ export default function ConditionPresetPicker({ }; }, [onClose]); + /** 그래프 모드: 팝업 위 휠 스크롤이 React Flow 줌으로 전달되지 않도록 차단 */ + useEffect(() => { + const el = popRef.current; + if (!el) return; + const onWheel = (e: WheelEvent) => { + e.stopPropagation(); + }; + el.addEventListener('wheel', onWheel, { capture: true, passive: true }); + return () => el.removeEventListener('wheel', onWheel, { capture: true }); + }, []); + + const stopWheelBubble = (e: React.WheelEvent) => { + e.stopPropagation(); + }; + const handlePick = (preset: ConditionPreset) => { if (isCompoundConditionPreset(preset)) { onReplaceNode(applyCompoundConditionPreset(nodeId, condition, preset, def)); @@ -104,7 +119,7 @@ export default function ConditionPresetPicker({ if (presets.length === 0) { return ( -