From 7e69052f08eefbaa0fcebf5b6eff7cf1797f2808 Mon Sep 17 00:00:00 2001 From: mj0x0 Date: Wed, 30 Sep 2026 17:04:58 +0300 Subject: [PATCH] feat(Searchbar): cycle search engine by clicking the icon --- src/Startpage/Searchbar/Searchbar.tsx | 51 +++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/src/Startpage/Searchbar/Searchbar.tsx b/src/Startpage/Searchbar/Searchbar.tsx index c3332e0..8be120f 100644 --- a/src/Startpage/Searchbar/Searchbar.tsx +++ b/src/Startpage/Searchbar/Searchbar.tsx @@ -1,5 +1,8 @@ +import { useState } from "react" + import styled from "@emotion/styled" +import { searchEngines } from "../../data/data" import duckduckgo from "../../data/pictures/duckduckgo.svg" import ecosia from "../../data/pictures/ecosia.svg" import google from "../../data/pictures/google.svg" @@ -40,6 +43,17 @@ const StyledSearchbar = styled.input` } ` +const IconWrapper = styled.div` + position: relative; + display: flex; + align-items: flex-start; + cursor: pointer; + + :hover > span { + opacity: 1; + } +` + const SearchIcon = styled.div<{ src: string }>` height: 2.9rem; width: 3.1rem; @@ -51,9 +65,29 @@ const SearchIcon = styled.div<{ src: string }>` mask-image: url("${({ src }) => src}"); ` +const EngineLabel = styled.span` + position: absolute; + bottom: calc(100% + 6px); + left: 50%; + transform: translateX(-50%); + font-size: 0.7rem; + color: var(--default-color); + white-space: nowrap; + opacity: 0; + transition: opacity 0.2s; + pointer-events: none; +` + export const Searchbar = () => { - const searchSettings = Settings.Search.getWithFallback() + const [searchSettings, setSearchSettings] = useState( + Settings.Search.getWithFallback + ) + const engine: string = searchSettings.engine || "duckduckgo.com/" + const engineIndex = Math.max( + 0, + searchEngines.findIndex(e => e.value === engine) + ) let searchSymbol = undefined if (engine.includes("duckduckgo")) searchSymbol = duckduckgo @@ -61,6 +95,14 @@ export const Searchbar = () => { else if (engine.includes("qwant")) searchSymbol = qwant else if (engine.includes("ecosia")) searchSymbol = ecosia + const cycleEngine = () => { + const next = searchEngines[(engineIndex + 1) % searchEngines.length] + if (!next) return + const updated = { ...searchSettings, engine: next.value } + setSearchSettings(updated) + Settings.Search.set(updated) + } + const redirectToSearch = (query: string) => { if (searchSettings.fastForward[query]) window.location.href = searchSettings.fastForward[query] @@ -74,7 +116,12 @@ export const Searchbar = () => { return ( - {searchSymbol && } + + {searchSymbol && } + + {searchEngines[engineIndex]?.label ?? "Custom"} + +