diff --git a/apps/desktop/src/i18n/en.ts b/apps/desktop/src/i18n/en.ts index 805d562..bf2e10a 100644 --- a/apps/desktop/src/i18n/en.ts +++ b/apps/desktop/src/i18n/en.ts @@ -79,6 +79,8 @@ export const en = { 'tools.list': "List", 'tools.results': "{count} matching commands", 'tools.noHits': "No command matches. Try a store word (listing, prices, testflight...).", + 'set.search': "Search settings", + 'set.noHits': "No setting matches", 'palette.gActions': 'Actions', 'palette.openApp': 'Open', diff --git a/apps/desktop/src/i18n/tr.ts b/apps/desktop/src/i18n/tr.ts index fc547e5..162cc43 100644 --- a/apps/desktop/src/i18n/tr.ts +++ b/apps/desktop/src/i18n/tr.ts @@ -81,6 +81,8 @@ export const tr: Record = { 'tools.list': "Liste", 'tools.results': "{count} eşleşen komut", 'tools.noHits': "Eşleşen komut yok. Bir mağaza kelimesi deneyin (listing, prices, testflight...).", + 'set.search': "Ayarlarda ara", + 'set.noHits': "Eşleşen ayar yok", 'palette.gActions': 'İşlemler', 'palette.openApp': 'Aç', diff --git a/apps/desktop/src/screens/Settings.tsx b/apps/desktop/src/screens/Settings.tsx index 91c51d3..0c8a69e 100644 --- a/apps/desktop/src/screens/Settings.tsx +++ b/apps/desktop/src/screens/Settings.tsx @@ -80,6 +80,21 @@ export function Settings({ onTheme: _onTheme, section }: { onTheme: () => void; } } catch (e) { setError(errorText(e)); } }; + // search: sections whose title or text contains the words stay; the rest hide (nav and body) + const [q, setQ] = useState(''); + const [hits, setHits] = useState(null); + useEffect(() => { + const words = q.trim().toLowerCase().split(/\s+/).filter(Boolean); + const out: string[] = []; + for (const [id, , key] of SECTIONS) { + const el = document.getElementById(`set-${id}`); + const text = `${t(key)} ${el?.textContent ?? ''}`.toLowerCase(); + const ok = !words.length || words.every(w => text.includes(w)); + if (el) el.hidden = !ok; + if (ok) out.push(id); + } + setHits(words.length ? out : null); + }, [q]); const storeOnly = d.apps.filter(a => !a.project && !a.ignored); const paired = storeOnly.filter(a => a.ios && a.android); const singles = storeOnly.filter(a => !(a.ios && a.android)); @@ -90,7 +105,10 @@ export function Settings({ onTheme: _onTheme, section }: { onTheme: () => void; {error && {error}}
diff --git a/apps/desktop/src/styles/settings.css b/apps/desktop/src/styles/settings.css index 8ab752b..2512c23 100644 --- a/apps/desktop/src/styles/settings.css +++ b/apps/desktop/src/styles/settings.css @@ -35,3 +35,7 @@ .scr-settings .danger-card { border-color: color-mix(in srgb, var(--bad-fg, var(--accent-solid)) 35%, var(--ds-stroke)); } .scr-settings .danger-card .ds-sec-ic { background: color-mix(in srgb, var(--bad-fg, var(--accent-solid)) 16%, transparent); color: var(--bad-fg, var(--accent-solid)); } @media (max-width: 1100px) { .scr-settings .set-layout { grid-template-columns: 1fr; } } +.scr-settings .set-search { margin-bottom: 6px; } +.scr-settings .set-search .input { width: 100%; } +.scr-settings .set-nohit { padding: 4px 8px; } +.scr-settings .set-body > [hidden] { display: none; }