diff --git a/frontend/src/components/StrategyEditorPage.tsx b/frontend/src/components/StrategyEditorPage.tsx index ba569aa..b9c40eb 100644 --- a/frontend/src/components/StrategyEditorPage.tsx +++ b/frontend/src/components/StrategyEditorPage.tsx @@ -300,6 +300,7 @@ export default function StrategyEditorPage({ const [compositePalette, setCompositePalette] = useState(() => loadPaletteItems('composite')); const [sidewaysPalette, setSidewaysPalette] = useState(() => loadSidewaysPaletteItems()); const [paletteSearch, setPaletteSearch] = useState(''); + const [strategyListSearch, setStrategyListSearch] = useState(''); const [templateSearch, setTemplateSearch] = useState(''); const [userTemplates, setUserTemplates] = useState(() => loadUserStrategyTemplates()); const [hiddenBuiltinTemplateIds, setHiddenBuiltinTemplateIds] = useState( @@ -1710,6 +1711,16 @@ export default function StrategyEditorPage({ const match = (label: string, desc?: string) => !q || label.toLowerCase().includes(q) || (desc?.toLowerCase().includes(q) ?? false); + const strategySearchQuery = strategyListSearch.trim().toLowerCase(); + const filteredStrategies = useMemo(() => { + if (!strategySearchQuery) return strategies; + return strategies.filter(s => { + const name = s.name?.toLowerCase() ?? ''; + const desc = s.description?.toLowerCase() ?? ''; + return name.includes(strategySearchQuery) || desc.includes(strategySearchQuery); + }); + }, [strategies, strategySearchQuery]); + const paletteKey = (type: string, id: string) => `${type}:${id}`; const selectPalette = (type: string, id: string) => { setSelectedPaletteKey(paletteKey(type, id)); @@ -1880,6 +1891,14 @@ export default function StrategyEditorPage({

전략 목록

+ setStrategyListSearch(e.target.value)} + aria-label="전략 목록 검색" + />