diff --git a/public/assets/common/icons/arrow-right.svg b/public/assets/common/icons/arrow-right.svg
new file mode 100644
index 0000000000..923e82bb1a
--- /dev/null
+++ b/public/assets/common/icons/arrow-right.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/assets/common/icons/download.svg b/public/assets/common/icons/download.svg
new file mode 100644
index 0000000000..896b5c8414
--- /dev/null
+++ b/public/assets/common/icons/download.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/app/components/elements/SearchInputs.tsx b/src/app/components/elements/SearchInputs.tsx
index 96361418d3..ab7f268e22 100644
--- a/src/app/components/elements/SearchInputs.tsx
+++ b/src/app/components/elements/SearchInputs.tsx
@@ -1,6 +1,60 @@
-import React, {ChangeEvent} from "react";
-import {Button, Input, InputGroup, Label} from "reactstrap";
-import {siteSpecific, withSearch} from "../../services";
+import React, {ChangeEvent, FormEvent, useEffect, useRef, useState} from "react";
+import {Button, Form, Input, InputGroup, InputProps, Label} from "reactstrap";
+import {ifKeyIsEnter, pushSearchToHistory, SEARCH_CHAR_LENGTH_LIMIT, siteSpecific} from "../../services";
+import classNames from "classnames";
+import { useHistory, useLocation } from "react-router";
+
+interface SearchInputProps {
+ setSearchText: (s: string) => void;
+ searchText: string;
+ inputProps: {
+ innerRef: React.RefObject;
+ "aria-label": "Search";
+ type: "search";
+ name: "query";
+ maxLength: typeof SEARCH_CHAR_LENGTH_LIMIT;
+ placeholder: "Search";
+ };
+}
+
+// HOC pattern for making different flavour search bars
+function withSearch(Component: React.FC) {
+ const SearchComponent = ({className, inline, onSearch, initialValue}: {className?: string; inline?: boolean; onSearch?: (searchText: string) => void; initialValue?: string}) => {
+ const [searchText, setSearchText] = useState(initialValue ?? "");
+ const searchInputRef = useRef(null);
+
+ const history = useHistory();
+ function doSearch(e: FormEvent) {
+ e.preventDefault();
+ if (searchText === "") {
+ if (searchInputRef.current) searchInputRef.current.focus();
+ } else {
+ onSearch?.(searchText);
+ pushSearchToHistory(history, searchText, []);
+ }
+ }
+
+ // Clear this search field on location (i.e. search query) change - user should use the main search bar
+ const location = useLocation();
+ useEffect(() => { if (location.pathname === "/search") { setSearchText(initialValue ?? ""); }}, [location]);
+
+ return ;
+ };
+ SearchComponent.displayName = "SearchComponent";
+ return SearchComponent;
+}
const PhysicsSearchButton = () => (