+
{
+ setUserInput(event.target.value);
+ setSelectedOptionIndex(null);
+ }}
+ onKeyDown={async (event) => {
+ const hotKey = event.key.toLocaleLowerCase();
+ switch (hotKey) {
+ case hotKeysMap.SEARCH.key:
+ await hotKeysMap.SEARCH.asyncHandler!(event);
+ break;
+ case hotKeysMap.ARROWUP.key:
+ hotKeysMap.ARROWUP.handler!(event);
+ break;
+ case hotKeysMap.ARROWDOWN.key:
+ hotKeysMap.ARROWDOWN.handler!(event);
+ break;
+ }
+ }}
+ onFocus={() => {
+ setIsTagsPopoverOpen(true);
+ }}
+ onBlur={(event) => {
+ // If the popover is open and the user clicks outside of the popover, close the popover
+ if (
+ popoverRef.current &&
+ !popoverRef.current.contains(event.relatedTarget as Node)
+ ) {
+ setIsTagsPopoverOpen(false);
+ }
+ }}
+ className="w-32 rounded-md border-0 py-[0.04rem] pl-5 text-xs font-semibold leading-6 text-gray-900 ring-1 ring-inset ring-gray-300 transition-all placeholder:text-gray-400 focus:outline focus:outline-[3px] focus:outline-blue-200 focus:ring-2 focus:ring-blue-400"
+ />
+
+ {isTagsPopoverOpen && (
+
+ )}
+
+ );
+};
+
+export default TagInput;
diff --git a/src/components/graph/analysis_window/header/TagsPopover.tsx b/src/components/graph/analysis_window/header/TagsPopover.tsx
new file mode 100644
index 00000000..6362c931
--- /dev/null
+++ b/src/components/graph/analysis_window/header/TagsPopover.tsx
@@ -0,0 +1,104 @@
+import { Popover, Transition } from "@headlessui/react";
+import { PlusIcon, TagIcon } from "@heroicons/react/24/solid";
+import clsx from "clsx";
+import { FC, Fragment } from "react";
+
+interface CreateNewTagRowProps {
+ tag: string;
+ onClick: () => Promise