diff --git a/docs/examples/generate-images.mdx b/docs/examples/generate-images.mdx
index 60ceed7ea..0e9d57ce2 100644
--- a/docs/examples/generate-images.mdx
+++ b/docs/examples/generate-images.mdx
@@ -2,107 +2,102 @@
title: Generate Images
---
-
You can use Quivr to Generate Images using Dall-E 3 from OpenAI or any other API based image generation tool.
-This allows you to leverage image generation by creating a brain that is connected to Dall-E.
-
+This allows you to leverage image generation by creating a brain that is connected to Dall-E.
## OpenAI
-In order to have image generation in Quivr we will create a brain that is connected to an API. You can find more info on this types of brains [here](/getting-started/api-based-brains)
+ In order to have image generation in Quivr we will create a brain that is
+ connected to an API. You can find more info on this types of brains
+ [here](/getting-started/api-based-brains)
-
+
Create an account on [OpenAI](https://platform.openai.com/)
-
-
- To get access to image generation, add your credit card in the `billing` section
-
-
- Create on API Key and save the result
-
+
+
+ To get access to image generation, add your credit card in the `billing`
+ section
+
+ Create on API Key and save the result
-
-Do not share your API Key
-
+Do not share your API Key
## Create a brain
Now it is time to create an App brain. This type of brain allows you to interact with APIs. And that is exactly what we need to do now. Let's get started.
-Generating images costs around 2cts per image. Be carefull or you'll have a surprised bill.
+ Generating images costs around 2cts per image. Be carefull or you'll have a
+ surprised bill.
-
- Go to the [Brains](https://www.quivr.app/brains-management) page and click on `Create Brain`
-
-
- Select `App (Through API)` and click on `Next`
-
-
- 1. Give your brain a name.
- 2. Add this as your description.
- ```
- You generate only one image and use markdown to display the url sent as a result and you need to keep the entire url with all the parameters for the image to be displayed correctly.
- Do not remove the signature and password in the url of the image as it is a signed url.
- Also return the revised prompt below the image in italic.
- If the user ask for a modification use the previous prompt generated as base
- ```
- 3. Click on `Next`
-
-
- 1. Select `POST` as the method
- 2. Add this as the url `https://api.openai.com/v1/images/generations`
-
-
-
+
+ Go to the [Brains](https://www.quivr.app/studio) page and click on `Create
+ Brain`
+
+
+ Select `App (Through API)` and click on `Next`
+
+
+ 1. Give your brain a name. 2. Add this as your description. ``` You generate
+ only one image and use markdown to display the url sent as a result and you
+ need to keep the entire url with all the parameters for the image to be
+ displayed correctly. Do not remove the signature and password in the url of
+ the image as it is a signed url. Also return the revised prompt below the
+ image in italic. If the user ask for a modification use the previous prompt
+ generated as base ``` 3. Click on `Next`
+
+
+ 1. Select `POST` as the method 2. Add this as the url
+ `https://api.openai.com/v1/images/generations`
+
+
+
1. Add `prompt` as a parameter and click on `Required`
-
- Description of the image to generate
-
+
+ Description of the image to generate
+
2. Add `size` as a parameter and click on `Required`
-
- By default 1024x1024 . But images can have a size of 1024x1024 (square), 1024x1792 (vertical) or 1792x1024 (horizontal) pixels
-
+
+ By default 1024x1024 . But images can have a size of 1024x1024 (square),
+ 1024x1792 (vertical) or 1792x1024 (horizontal) pixels
+
3. Add `model` as a parameter and click on `Required`
-
- Either dall-e-3 or dall-e-2. By default dall-e-3
-
-
-
-
+
+ Either dall-e-3 or dall-e-2. By default dall-e-3
+
+
+
+
1. Add `Authorization` as a secret
-
- Bearer YOUR_API_KEY
-
- **Add your API Key in the value**
- 2. Add `Content-Type` as a secret and click on `Required`
-
- application/json
-
- **Add `application/json` in the value**
-
-
-
- Click on `Create`
-
-
+
+ Bearer YOUR_API_KEY
+
+ **Add your API Key in the value** 2. Add `Content-Type` as a secret and
+ click on `Required`
+
+ application/json
+
+ **Add `application/json` in the value**
+
+
+ Click on `Create`
+
Go to the chat and ask a question to your newly created brain.
- You might have to type `@` and select your brain to be able to ask a question to it.
+ You might have to type `@` and select your brain to be able to ask a
+ question to it.
-
-
+
+
-
You can now use this brain to generate images. You can also use it to generate images in your own app throught the API.
Don't hesitate to share your creations on [Twitter](https://twitter.com/quivr_brain).
-
diff --git a/docs/getting-started/brain.mdx b/docs/getting-started/brain.mdx
index fef82f50f..329e311cf 100644
--- a/docs/getting-started/brain.mdx
+++ b/docs/getting-started/brain.mdx
@@ -2,10 +2,7 @@
title: Brains
---
-
-A few brains were harmed in the making of this documentation 🤯😏
-
-
+A few brains were harmed in the making of this documentation 🤯😏
# Introduction to Brains
@@ -22,7 +19,6 @@ A few brains were harmed in the making of this documentation 🤯😏
-
# Two kinds of Brains
In Quivr, you can find two kinds of brains: **Document** and **App**.
@@ -39,17 +35,19 @@ The brains are here to help you store information or interact with apps. Let's s
- You can create as many brains as you want. You can also share them with your team.
+ You can create as many brains as you want. You can also share them with your
+ team.
We introduced the two kinds of brains in the previous section. Let's dive a little deeper into each of them.
# Create a Brain
-Simply go to [Quivr](https://quivr.app/brains-management) and click on the "Add Brain" button.
+Simply go to [Quivr](https://quivr.app/studio) and click on the "Add Brain" button.
-By default, on the free version you can create up to 3 brains. If you need more, you can upgrade to a paid plan.
+ By default, on the free version you can create up to 3 brains. If you need
+ more, you can upgrade to a paid plan.
@@ -90,8 +88,7 @@ By default, on the free version you can create up to 3 brains. If you need more,
+
-If you have any questions or issue with the documentation, feel free to edit or open an issue.
-
-
+If you have any questions or issue with the documentation, feel free to edit or open an issue.
diff --git a/frontend/app/App.tsx b/frontend/app/App.tsx
index 0b18bd3fb..8ae805090 100644
--- a/frontend/app/App.tsx
+++ b/frontend/app/App.tsx
@@ -5,6 +5,7 @@ import { posthog } from "posthog-js";
import { PostHogProvider } from "posthog-js/react";
import { PropsWithChildren, useEffect } from "react";
+import { BrainCreationProvider } from "@/lib/components/AddBrainModal/components/AddBrainSteps/brainCreation-provider";
import { Menu } from "@/lib/components/Menu/Menu";
import { useOutsideClickListener } from "@/lib/components/Menu/hooks/useOutsideClickListener";
import { NotificationBanner } from "@/lib/components/NotificationBanner";
@@ -82,13 +83,15 @@ const AppWithQueryClient = ({ children }: PropsWithChildren): JSX.Element => {
-
-
-
- {children}
-
-
-
+
+
+
+
+ {children}
+
+
+
+
diff --git a/frontend/app/brains-management/components/BrainsTabs/BrainsTabs.tsx b/frontend/app/brains-management/components/BrainsTabs/BrainsTabs.tsx
deleted file mode 100644
index a046ba00b..000000000
--- a/frontend/app/brains-management/components/BrainsTabs/BrainsTabs.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import { useTranslation } from "react-i18next";
-
-import Spinner from "@/lib/components/ui/Spinner";
-import { Tabs, TabsContent, TabsList } from "@/lib/components/ui/Tabs";
-
-import { BrainSearchBar } from "./components/BrainSearchBar";
-import { BrainsList } from "./components/BrainsList";
-import { useBrainsTabs } from "./hooks/useBrainsTabs";
-
-import { StyledTabsTrigger } from "../StyledTabsTrigger";
-
-export const BrainsTabs = (): JSX.Element => {
- const { t } = useTranslation(["brain", "translation"]);
- const {
- searchQuery,
- isFetchingBrains,
- setSearchQuery,
- brains,
- privateBrains,
- publicBrains,
- } = useBrainsTabs();
-
- if (isFetchingBrains && brains.length === 0) {
- return (
-
-
-
- );
- }
-
- return (
-
-
-
- {t("translation:all")}
-
-
- {t("private_brain_label")}
-
-
- {t("public_brain_label")}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-};
diff --git a/frontend/app/brains-management/components/BrainsTabs/components/BrainItem.tsx b/frontend/app/brains-management/components/BrainsTabs/components/BrainItem.tsx
deleted file mode 100644
index 6108ac400..000000000
--- a/frontend/app/brains-management/components/BrainsTabs/components/BrainItem.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import Link from "next/link";
-import { useTranslation } from "react-i18next";
-import { CgFileDocument } from "react-icons/cg";
-import { LuChevronRightCircle } from "react-icons/lu";
-
-import { MinimalBrainForUser } from "@/lib/context/BrainProvider/types";
-import { getBrainIconFromBrainType } from "@/lib/helpers/getBrainIconFromBrainType";
-
-type BrainItemProps = {
- brain: MinimalBrainForUser;
-};
-
-export const BrainItem = ({ brain }: BrainItemProps): JSX.Element => {
- const { t } = useTranslation("brain");
-
- const isBrainDescriptionEmpty = brain.description === "";
- const brainDescription = isBrainDescriptionEmpty
- ? t("empty_brain_description")
- : brain.description;
-
- return (
-
-
-
- {getBrainIconFromBrainType(brain.brain_type, {
- iconSize: 24,
- DocBrainIcon: CgFileDocument,
- iconClassName: "text-primary",
- })}
-
- {brain.name}
-
-
-
-
-
- {brainDescription}
-
-
-
-
- {t("configure")}
-
-
-
-
- );
-};
diff --git a/frontend/app/brains-management/components/BrainsTabs/components/BrainSearchBar.tsx b/frontend/app/brains-management/components/BrainsTabs/components/BrainSearchBar.tsx
deleted file mode 100644
index c48566965..000000000
--- a/frontend/app/brains-management/components/BrainsTabs/components/BrainSearchBar.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { useTranslation } from "react-i18next";
-import { LuSearch } from "react-icons/lu";
-
-import Field from "@/lib/components/ui/Field";
-
-type BrainSearchBarProps = {
- searchQuery: string;
- setSearchQuery: (searchQuery: string) => void;
-};
-
-export const BrainSearchBar = ({
- searchQuery,
- setSearchQuery,
-}: BrainSearchBarProps): JSX.Element => {
- const { t } = useTranslation(["brain"]);
-
- return (
- setSearchQuery(e.target.value)}
- className="w-auto"
- inputClassName="w-max w-[200px] rounded-3xl border-none"
- icon={ }
- />
- );
-};
diff --git a/frontend/app/brains-management/components/BrainsTabs/components/BrainsList.tsx b/frontend/app/brains-management/components/BrainsTabs/components/BrainsList.tsx
deleted file mode 100644
index bef5a5e01..000000000
--- a/frontend/app/brains-management/components/BrainsTabs/components/BrainsList.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { MinimalBrainForUser } from "@/lib/context/BrainProvider/types";
-
-import { BrainItem } from "./BrainItem";
-
-type BrainsListProps = {
- brains: MinimalBrainForUser[];
-};
-
-export const BrainsList = ({ brains }: BrainsListProps): JSX.Element => {
- return (
-
-
- {brains.map((brain) => (
-
-
-
- ))}
-
-
- );
-};
diff --git a/frontend/app/brains-management/page.tsx b/frontend/app/brains-management/page.tsx
deleted file mode 100644
index f01996234..000000000
--- a/frontend/app/brains-management/page.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-"use client";
-
-import { useTranslation } from "react-i18next";
-import { LuBrain } from "react-icons/lu";
-
-import { AddBrainModal } from "@/lib/components/AddBrainModal";
-
-import { BrainsTabs } from "./components/BrainsTabs/BrainsTabs";
-
-const BrainsManagement = (): JSX.Element => {
- const { t } = useTranslation("chat");
-
- return (
-
-
-
-
-
-
- {t("brains")}
-
-
-
-
-
-
-
- );
-};
-
-export default BrainsManagement;
diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ChatEditor/components/Editor/components/MentionsList/MentionsList.tsx b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ChatEditor/components/Editor/components/MentionsList/MentionsList.tsx
index 60f781a93..d15394afa 100644
--- a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ChatEditor/components/Editor/components/MentionsList/MentionsList.tsx
+++ b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ChatEditor/components/Editor/components/MentionsList/MentionsList.tsx
@@ -2,7 +2,8 @@ import { SuggestionKeyDownProps } from "@tiptap/suggestion";
import { forwardRef } from "react";
import { FaAngleDoubleDown } from "react-icons/fa";
-import { AddBrainModal } from "@/lib/components/AddBrainModal";
+import { useBrainCreationContext } from "@/lib/components/AddBrainModal/components/AddBrainSteps/brainCreation-provider";
+import TextButton from "@/lib/components/ui/TextButton/TextButton";
import { AddNewPromptButton } from "./components/AddNewPromptButton";
import { MentionItem } from "./components/MentionItem/MentionItem";
@@ -23,6 +24,7 @@ export const MentionList = forwardRef(
const { suggestionsRef, shouldShowScrollToBottomIcon, scrollToBottom } =
useSuggestionsOverflowHandler();
+ const { setIsBrainCreationModalOpened } = useBrainCreationContext();
const handleClick = (event: React.MouseEvent) => {
event.preventDefault();
@@ -56,7 +58,14 @@ export const MentionList = forwardRef(
onClick={scrollToBottom}
/>
)}
- {isBrain && }
+ {isBrain && (
+ setIsBrainCreationModalOpened(true)}
+ />
+ )}
{isPrompt && }
diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ChatEditor/components/Editor/components/MentionsList/components/AddNewPromptButton.tsx b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ChatEditor/components/Editor/components/MentionsList/components/AddNewPromptButton.tsx
index edc598da0..1ca97cc49 100644
--- a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ChatEditor/components/Editor/components/MentionsList/components/AddNewPromptButton.tsx
+++ b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ChatEditor/components/Editor/components/MentionsList/components/AddNewPromptButton.tsx
@@ -10,7 +10,7 @@ export const AddNewPromptButton = (): JSX.Element => {
return (
router.push("/brains-management")}
+ onClick={() => router.push("/studio")}
variant={"tertiary"}
className={"border-0"}
data-testid="add-brain-button"
diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/KnowledgeToFeed.tsx b/frontend/app/chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/KnowledgeToFeed.tsx
index 2244e1377..f2570bb1e 100644
--- a/frontend/app/chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/KnowledgeToFeed.tsx
+++ b/frontend/app/chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/KnowledgeToFeed.tsx
@@ -59,7 +59,7 @@ export const KnowledgeToFeed = ({
void feedBrain()} />
)}
{Boolean(currentBrainId) && (
-
+
{t("manage_brain", { ns: "brain" })}
diff --git a/frontend/app/chat/[chatId]/page.module.scss b/frontend/app/chat/[chatId]/page.module.scss
index 0dea74793..fe0643136 100644
--- a/frontend/app/chat/[chatId]/page.module.scss
+++ b/frontend/app/chat/[chatId]/page.module.scss
@@ -1,21 +1,24 @@
@use "@/styles/Colors.module.scss";
@use "@/styles/Spacings.module.scss";
-.chat_page_container {
+.main_container {
display: flex;
- flex: 1 1 0%;
- background-color: Colors.$white;
- padding-block: Spacings.$spacing06;
- padding-inline: Spacings.$spacing09;
- display: flex;
- gap: Spacings.$spacing09;
+ flex-direction: column;
+ width: 100%;
- &.feeding {
- background-color: Colors.$chat-bg-gray;
- }
+ .chat_page_container {
+ display: flex;
+ flex: 1 1 0%;
+ background-color: Colors.$white;
+ padding-block: Spacings.$spacing06;
+ padding-inline: Spacings.$spacing09;
+ display: flex;
+ gap: Spacings.$spacing09;
+ overflow: hidden;
- .data_panel_wrapper {
- height: 100%;
- width: 30%;
+ .data_panel_wrapper {
+ height: 100%;
+ width: 30%;
+ }
}
}
diff --git a/frontend/app/chat/[chatId]/page.tsx b/frontend/app/chat/[chatId]/page.tsx
index 9f6f01eaf..676468c58 100644
--- a/frontend/app/chat/[chatId]/page.tsx
+++ b/frontend/app/chat/[chatId]/page.tsx
@@ -1,8 +1,13 @@
"use client";
+import { AddBrainModal } from "@/lib/components/AddBrainModal";
+import { useBrainCreationContext } from "@/lib/components/AddBrainModal/components/AddBrainSteps/brainCreation-provider";
+import PageHeader from "@/lib/components/PageHeader/PageHeader";
+import { UploadDocumentModal } from "@/lib/components/UploadDocumentModal/UploadDocumentModal";
import { useKnowledgeToFeedContext } from "@/lib/context/KnowledgeToFeedProvider/hooks/useKnowledgeToFeedContext";
import { useDevice } from "@/lib/hooks/useDevice";
import { useCustomDropzone } from "@/lib/hooks/useDropzone";
+import { ButtonType } from "@/lib/types/QuivrButton";
import { cn } from "@/lib/utils";
import { ActionsBar } from "./components/ActionsBar";
@@ -13,40 +18,63 @@ import styles from "./page.module.scss";
const SelectedChatPage = (): JSX.Element => {
const { getRootProps } = useCustomDropzone();
- const { shouldDisplayFeedCard } = useKnowledgeToFeedContext();
const { isMobile } = useDevice();
+ const { setShouldDisplayFeedCard } = useKnowledgeToFeedContext();
+ const { setIsBrainCreationModalOpened } = useBrainCreationContext();
+
useChatNotificationsSync();
+ const buttons: ButtonType[] = [
+ {
+ label: "Create brain",
+ color: "primary",
+ onClick: () => {
+ setIsBrainCreationModalOpened(true);
+ },
+ },
+ {
+ label: "Add knowledge",
+ color: "primary",
+ onClick: () => {
+ setShouldDisplayFeedCard(true);
+ },
+ },
+ ];
+
return (
-
+
+
-
+ {!isMobile && (
+
+
+
+ )}
+
+
- {!isMobile && (
-
-
-
- )}
);
};
diff --git a/frontend/app/search/page.module.scss b/frontend/app/search/page.module.scss
index 7d8819c99..8cc363250 100644
--- a/frontend/app/search/page.module.scss
+++ b/frontend/app/search/page.module.scss
@@ -6,59 +6,69 @@
@use "@/styles/Typography.module.scss";
@use "@/styles/Variables.module.scss";
-.search_page_container {
- background-color: Colors.$white;
+.main_container {
+ position: relative;
width: 100%;
height: 100%;
- display: flex;
- justify-content: center;
- align-items: center;
- flex-direction: column;
- .main_container {
+ .page_header {
+ position: absolute;
+ width: 100%;
+ }
+
+ .search_page_container {
+ background-color: Colors.$white;
+ width: 100%;
+ height: 100%;
display: flex;
+ align-items: center;
+ justify-content: center;
flex-direction: column;
- row-gap: Spacings.$spacing05;
- position: relative;
- width: 50%;
- margin-inline: auto;
- transform: translateY(-#{Variables.$searchBarHeight});
- @media (max-width: ScreenSizes.$small) {
- width: 100%;
- padding-inline: Spacings.$spacing07;
- }
-
- .quivr_logo_wrapper {
+ .main_wrapper {
display: flex;
flex-direction: column;
- justify-content: center;
- align-items: center;
+ row-gap: Spacings.$spacing05;
+ width: 50%;
+ margin-inline: auto;
+ transform: translateY(-#{Variables.$searchBarHeight});
- .quivr_text {
- @include Typography.Big;
+ @media (max-width: ScreenSizes.$small) {
+ width: 100%;
+ padding-inline: Spacings.$spacing07;
+ }
- .quivr_text_primary {
+ .quivr_logo_wrapper {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .quivr_text {
+ @include Typography.Big;
+
+ .quivr_text_primary {
+ color: Colors.$primary;
+ }
+ }
+ }
+ }
+
+ .shortcuts_card_wrapper {
+ background-color: Colors.$lightest-grey;
+ padding: Spacings.$spacing05;
+ gap: Spacings.$spacing03;
+ border-radius: Radius.$big;
+
+ .shortcut_wrapper {
+ display: flex;
+ align-items: center;
+ gap: Spacings.$spacing03;
+
+ .shortcut {
color: Colors.$primary;
}
}
}
}
-
- .shortcuts_card_wrapper {
- background-color: Colors.$lightest-grey;
- padding: Spacings.$spacing05;
- gap: Spacings.$spacing03;
- border-radius: Radius.$big;
-
- .shortcut_wrapper {
- display: flex;
- align-items: center;
- gap: Spacings.$spacing03;
-
- .shortcut {
- color: Colors.$primary;
- }
- }
- }
}
diff --git a/frontend/app/search/page.tsx b/frontend/app/search/page.tsx
index 58ac71d64..b33d900b9 100644
--- a/frontend/app/search/page.tsx
+++ b/frontend/app/search/page.tsx
@@ -3,15 +3,23 @@ import { usePathname } from "next/navigation";
import { useEffect } from "react";
import { QuivrLogo } from "@/lib/assets/QuivrLogo";
+import { AddBrainModal } from "@/lib/components/AddBrainModal";
+import { useBrainCreationContext } from "@/lib/components/AddBrainModal/components/AddBrainSteps/brainCreation-provider";
+import PageHeader from "@/lib/components/PageHeader/PageHeader";
+import { UploadDocumentModal } from "@/lib/components/UploadDocumentModal/UploadDocumentModal";
import { SearchBar } from "@/lib/components/ui/SearchBar/SearchBar";
+import { useKnowledgeToFeedContext } from "@/lib/context/KnowledgeToFeedProvider/hooks/useKnowledgeToFeedContext";
import { useSupabase } from "@/lib/context/SupabaseProvider";
import { redirectToLogin } from "@/lib/router/redirectToLogin";
+import { ButtonType } from "@/lib/types/QuivrButton";
import styles from "./page.module.scss";
const Search = (): JSX.Element => {
const pathname = usePathname();
const { session } = useSupabase();
+ const { setShouldDisplayFeedCard } = useKnowledgeToFeedContext();
+ const { setIsBrainCreationModalOpened } = useBrainCreationContext();
useEffect(() => {
if (session === null) {
@@ -19,30 +27,54 @@ const Search = (): JSX.Element => {
}
}, [pathname, session]);
+ const buttons: ButtonType[] = [
+ {
+ label: "Create brain",
+ color: "primary",
+ onClick: () => {
+ setIsBrainCreationModalOpened(true);
+ },
+ },
+ {
+ label: "Add knowledge",
+ color: "primary",
+ onClick: () => {
+ setShouldDisplayFeedCard(true);
+ },
+ },
+ ];
+
return (
-
-
-
-
-
-
Talk to
-
Quivr
+
+
+
+
+
+
+
+ Talk to
+ Quivr
+
+
+
+
-
-
-
-
-
-
- @
- Select a brain
-
-
-
#
-
Select a prompt
+
+
+ @
+ Select a brain
+
+
+ #
+ Select a prompt
+
+
+
);
};
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/BrainManagementTabs.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/BrainManagementTabs.tsx
similarity index 97%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/BrainManagementTabs.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/BrainManagementTabs.tsx
index 5860af22f..56cf1ed66 100644
--- a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/BrainManagementTabs.tsx
+++ b/frontend/app/studio/[brainId]/components/BrainManagementTabs/BrainManagementTabs.tsx
@@ -1,7 +1,7 @@
/* eslint-disable max-lines */
import { useTranslation } from "react-i18next";
-import { StyledTabsTrigger } from "@/app/brains-management/components/StyledTabsTrigger";
+import { StyledTabsTrigger } from "@/app/studio/components/StyledTabsTrigger";
import Button from "@/lib/components/ui/Button";
import Spinner from "@/lib/components/ui/Spinner";
import { Tabs, TabsContent, TabsList } from "@/lib/components/ui/Tabs";
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/BrainTabTrigger.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/BrainTabTrigger.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/BrainTabTrigger.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/BrainTabTrigger.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/AddKnowledge.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/AddKnowledge.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/AddKnowledge.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/AddKnowledge.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/hooks/useAddKnowledge.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/hooks/useAddKnowledge.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/hooks/useAddKnowledge.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/hooks/useAddKnowledge.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/hooks/useFeedBrain.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/hooks/useFeedBrain.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/hooks/useFeedBrain.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/hooks/useFeedBrain.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/hooks/useFeedBrainHandler.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/hooks/useFeedBrainHandler.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/hooks/useFeedBrainHandler.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddKnowledge/hooks/useFeedBrainHandler.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddedKnowledge/AddedKnowledge.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddedKnowledge/AddedKnowledge.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddedKnowledge/AddedKnowledge.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddedKnowledge/AddedKnowledge.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddedKnowledge/hooks/useAddedKnowledge.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddedKnowledge/hooks/useAddedKnowledge.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddedKnowledge/hooks/useAddedKnowledge.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/AddedKnowledge/hooks/useAddedKnowledge.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/KnowledgeTable.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/KnowledgeTable.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/KnowledgeTable.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/KnowledgeTable.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/components/CrawledKnowledgeItem.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/components/CrawledKnowledgeItem.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/components/CrawledKnowledgeItem.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/components/CrawledKnowledgeItem.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/components/DeleteKnowledge.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/components/DeleteKnowledge.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/components/DeleteKnowledge.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/components/DeleteKnowledge.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/components/DownloadUploadedKnowledge.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/components/DownloadUploadedKnowledge.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/components/DownloadUploadedKnowledge.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/components/DownloadUploadedKnowledge.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/hooks/useKnowledgeItem.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/hooks/useKnowledgeItem.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/hooks/useKnowledgeItem.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/hooks/useKnowledgeItem.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/index.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/index.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/index.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/components/KnowledgeTable/components/KnowledgeItem/index.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/hooks/useKnowledge.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/hooks/useKnowledge.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/hooks/useKnowledge.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/hooks/useKnowledge.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/index.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/index.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/index.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/KnowledgeOrSecretsTab/index.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/Modals/DeleteOrUnsubscribeConfirmationModal.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/Modals/DeleteOrUnsubscribeConfirmationModal.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/Modals/DeleteOrUnsubscribeConfirmationModal.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/Modals/DeleteOrUnsubscribeConfirmationModal.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/Modals/__tests__/DeleteOrUnsubscribeConfirmationModal.test.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/Modals/__tests__/DeleteOrUnsubscribeConfirmationModal.test.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/Modals/__tests__/DeleteOrUnsubscribeConfirmationModal.test.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/Modals/__tests__/DeleteOrUnsubscribeConfirmationModal.test.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/NoAccess.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/NoAccess.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/NoAccess.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/NoAccess.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/PeopleTab/PeopleTab.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/PeopleTab/PeopleTab.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/PeopleTab/PeopleTab.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/PeopleTab/PeopleTab.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/PeopleTab/index.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/PeopleTab/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/PeopleTab/index.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/PeopleTab/index.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/SettingsTab.test.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/SettingsTab.test.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/SettingsTab.test.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/SettingsTab.test.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/SettingsTab.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/SettingsTab.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/SettingsTab.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/SettingsTab.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/GeneralInformation.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/GeneralInformation.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/GeneralInformation.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/GeneralInformation.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/components/BrainAccess/BrainAccess.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/components/BrainAccess/BrainAccess.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/components/BrainAccess/BrainAccess.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/components/BrainAccess/BrainAccess.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/components/BrainAccess/components/BrainAccessRadio.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/components/BrainAccess/components/BrainAccessRadio.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/components/BrainAccess/components/BrainAccessRadio.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/components/BrainAccess/components/BrainAccessRadio.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/hooks/useGeneralInformation.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/hooks/useGeneralInformation.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/hooks/useGeneralInformation.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/hooks/useGeneralInformation.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/index.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/index.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/GeneralInformation/index.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/ModelSelection/ModelSelection.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/ModelSelection/ModelSelection.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/ModelSelection/ModelSelection.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/ModelSelection/ModelSelection.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/ModelSelection/index.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/ModelSelection/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/ModelSelection/index.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/ModelSelection/index.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PrivateAccessConfirmationModal/AccessConfirmationModal.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PrivateAccessConfirmationModal/AccessConfirmationModal.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PrivateAccessConfirmationModal/AccessConfirmationModal.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PrivateAccessConfirmationModal/AccessConfirmationModal.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PrivateAccessConfirmationModal/hooks/useAccessConfirmationModal.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PrivateAccessConfirmationModal/hooks/useAccessConfirmationModal.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PrivateAccessConfirmationModal/hooks/useAccessConfirmationModal.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PrivateAccessConfirmationModal/hooks/useAccessConfirmationModal.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PrivateAccessConfirmationModal/index.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PrivateAccessConfirmationModal/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PrivateAccessConfirmationModal/index.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PrivateAccessConfirmationModal/index.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/Prompt/Prompt.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/Prompt/Prompt.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/Prompt/Prompt.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/Prompt/Prompt.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/Prompt/index.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/Prompt/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/Prompt/index.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/Prompt/index.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/PublicPrompts.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/PublicPrompts.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/PublicPrompts.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/PublicPrompts.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/PublicPromptsList/PublicPromptsList.tsx b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/PublicPromptsList/PublicPromptsList.tsx
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/PublicPromptsList/PublicPromptsList.tsx
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/PublicPromptsList/PublicPromptsList.tsx
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/PublicPromptsList/hooks/usePublicPromptsList.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/PublicPromptsList/hooks/usePublicPromptsList.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/PublicPromptsList/hooks/usePublicPromptsList.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/PublicPromptsList/hooks/usePublicPromptsList.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/PublicPromptsList/index.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/PublicPromptsList/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/PublicPromptsList/index.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/PublicPromptsList/index.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/index.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/index.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/components/index.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/hooks/usePublicPrompts.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/hooks/usePublicPrompts.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/hooks/usePublicPrompts.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/hooks/usePublicPrompts.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/index.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/index.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/PublicPrompts/index.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/index.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/index.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/components/index.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/useBrainFormState.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/useBrainFormState.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/useBrainFormState.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/useBrainFormState.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/usePermissionsController.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/usePermissionsController.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/usePermissionsController.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/usePermissionsController.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/usePrompt.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/usePrompt.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/usePrompt.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/usePrompt.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/useSettingsTab.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/useSettingsTab.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/useSettingsTab.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/hooks/useSettingsTab.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/index.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/index.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/index.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/utils/isBrainDescriptionValid.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/utils/isBrainDescriptionValid.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/utils/isBrainDescriptionValid.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/utils/isBrainDescriptionValid.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/utils/isBrainNameValid.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/utils/isBrainNameValid.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/SettingsTab/utils/isBrainNameValid.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/SettingsTab/utils/isBrainNameValid.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/index.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/components/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/components/index.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/components/index.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/hooks/useBrainFetcher.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/hooks/useBrainFetcher.ts
similarity index 96%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/hooks/useBrainFetcher.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/hooks/useBrainFetcher.ts
index c1f116f21..5d995480f 100644
--- a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/hooks/useBrainFetcher.ts
+++ b/frontend/app/studio/[brainId]/components/BrainManagementTabs/hooks/useBrainFetcher.ts
@@ -23,7 +23,7 @@ export const useBrainFetcher = ({ brainId }: UseBrainFetcherProps) => {
return await getBrain(brainId);
} catch (error) {
- router.push("/brains-management");
+ router.push("/studio");
}
};
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/hooks/useBrainManagementTabs.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/hooks/useBrainManagementTabs.ts
similarity index 89%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/hooks/useBrainManagementTabs.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/hooks/useBrainManagementTabs.ts
index 3b23986f2..4d1a70b70 100644
--- a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/hooks/useBrainManagementTabs.ts
+++ b/frontend/app/studio/[brainId]/components/BrainManagementTabs/hooks/useBrainManagementTabs.ts
@@ -1,5 +1,5 @@
import { UUID } from "crypto";
-import { useParams, useRouter } from "next/navigation";
+import { useParams, usePathname, useRouter } from "next/navigation";
import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
@@ -13,7 +13,7 @@ import { getBrainPermissions } from "../utils/getBrainPermissions";
import { getTargetedTab } from "../utils/getTargetedTab";
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
-export const useBrainManagementTabs = () => {
+export const useBrainManagementTabs = (customBrainId?: UUID) => {
const [selectedTab, setSelectedTab] =
useState
("settings");
const { allBrains } = useBrainContext();
@@ -41,8 +41,9 @@ export const useBrainManagementTabs = () => {
const router = useRouter();
const params = useParams();
+ const pathname = usePathname();
const { t } = useTranslation(["delete_or_unsubscribe_from_brain"]);
- const brainId = params?.brainId as UUID | undefined;
+ const brainId = customBrainId ?? (params?.brainId as UUID | undefined);
const { hasEditRights, isOwnedByCurrentUser, isPublicBrain } =
getBrainPermissions({
@@ -67,6 +68,7 @@ export const useBrainManagementTabs = () => {
if (brainId === undefined) {
return;
}
+
setIsDeleteOrUnsubscribeRequestPending(true);
try {
if (!isOwnedByCurrentUser) {
@@ -80,7 +82,7 @@ export const useBrainManagementTabs = () => {
} catch (error) {
console.error("Error deleting brain: ", error);
} finally {
- router.push("/brains-management");
+ pathname === "/studio" ? void fetchAllBrains() : router.push("/studio");
setIsDeleteOrUnsubscribeRequestPending(false);
}
};
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/index.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/index.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/index.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/types.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/types.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/types.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/types.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/utils/getBrainPermissions.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/utils/getBrainPermissions.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/utils/getBrainPermissions.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/utils/getBrainPermissions.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/utils/getTargetedTab.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/utils/getTargetedTab.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/utils/getTargetedTab.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/utils/getTargetedTab.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/utils/isUserBrainEditor.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/utils/isUserBrainEditor.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/utils/isUserBrainEditor.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/utils/isUserBrainEditor.ts
diff --git a/frontend/app/brains-management/[brainId]/components/BrainManagementTabs/utils/isUserBrainOwner.ts b/frontend/app/studio/[brainId]/components/BrainManagementTabs/utils/isUserBrainOwner.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/BrainManagementTabs/utils/isUserBrainOwner.ts
rename to frontend/app/studio/[brainId]/components/BrainManagementTabs/utils/isUserBrainOwner.ts
diff --git a/frontend/app/brains-management/[brainId]/components/index.ts b/frontend/app/studio/[brainId]/components/index.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/components/index.ts
rename to frontend/app/studio/[brainId]/components/index.ts
diff --git a/frontend/app/brains-management/[brainId]/hooks/useBrainManagement.ts b/frontend/app/studio/[brainId]/hooks/useBrainManagement.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/hooks/useBrainManagement.ts
rename to frontend/app/studio/[brainId]/hooks/useBrainManagement.ts
diff --git a/frontend/app/brains-management/[brainId]/page.tsx b/frontend/app/studio/[brainId]/page.tsx
similarity index 96%
rename from frontend/app/brains-management/[brainId]/page.tsx
rename to frontend/app/studio/[brainId]/page.tsx
index 746c5fb93..91045abfb 100644
--- a/frontend/app/brains-management/[brainId]/page.tsx
+++ b/frontend/app/studio/[brainId]/page.tsx
@@ -16,7 +16,7 @@ const BrainsManagement = (): JSX.Element => {
return (
-
+
{t("previous")}
diff --git a/frontend/app/brains-management/[brainId]/utils/sortByName.ts b/frontend/app/studio/[brainId]/utils/sortByName.ts
similarity index 100%
rename from frontend/app/brains-management/[brainId]/utils/sortByName.ts
rename to frontend/app/studio/[brainId]/utils/sortByName.ts
diff --git a/frontend/app/studio/components/BrainsTabs/components/BrainItem/BrainItem.module.scss b/frontend/app/studio/components/BrainsTabs/components/BrainItem/BrainItem.module.scss
new file mode 100644
index 000000000..4246a0956
--- /dev/null
+++ b/frontend/app/studio/components/BrainsTabs/components/BrainItem/BrainItem.module.scss
@@ -0,0 +1,49 @@
+@use "@/styles/Colors.module.scss";
+@use "@/styles/ScreenSizes.module.scss";
+@use "@/styles/Spacings.module.scss";
+@use "@/styles/Typography.module.scss";
+
+.brain_item_wrapper {
+ padding-inline: Spacings.$spacing05;
+ border-top: 1px solid Colors.$primary-lightest;
+ overflow: hidden;
+ display: flex;
+ gap: Spacings.$spacing02;
+ justify-content: space-between;
+ align-items: center;
+ cursor: pointer;
+
+ &:hover {
+ background-color: Colors.$lightest-black;
+ }
+
+ .brain_info_wrapper {
+ padding-block: Spacings.$spacing03;
+ display: flex;
+ overflow: hidden;
+ gap: Spacings.$spacing05;
+ overflow: hidden;
+ flex: 1;
+
+ .name {
+ @include Typography.EllipsisOverflow;
+ width: 200px;
+ }
+
+ .description {
+ @include Typography.EllipsisOverflow;
+ flex: 1;
+ color: Colors.$dark-grey;
+ }
+
+ @media (max-width: ScreenSizes.$small) {
+ .name {
+ width: auto;
+ }
+
+ .description {
+ display: none;
+ }
+ }
+ }
+}
diff --git a/frontend/app/studio/components/BrainsTabs/components/BrainItem/BrainItem.tsx b/frontend/app/studio/components/BrainsTabs/components/BrainItem/BrainItem.tsx
new file mode 100644
index 000000000..f5b5685b8
--- /dev/null
+++ b/frontend/app/studio/components/BrainsTabs/components/BrainItem/BrainItem.tsx
@@ -0,0 +1,72 @@
+import Link from "next/link";
+import { useState } from "react";
+
+import { DeleteOrUnsubscribeConfirmationModal } from "@/app/studio/[brainId]/components/BrainManagementTabs/components/Modals/DeleteOrUnsubscribeConfirmationModal";
+import { useBrainManagementTabs } from "@/app/studio/[brainId]/components/BrainManagementTabs/hooks/useBrainManagementTabs";
+import { getBrainPermissions } from "@/app/studio/[brainId]/components/BrainManagementTabs/utils/getBrainPermissions";
+import Icon from "@/lib/components/ui/Icon/Icon";
+import { useBrainContext } from "@/lib/context/BrainProvider/hooks/useBrainContext";
+import { MinimalBrainForUser } from "@/lib/context/BrainProvider/types";
+
+import styles from "./BrainItem.module.scss";
+
+type BrainItemProps = {
+ brain: MinimalBrainForUser;
+ even: boolean;
+};
+
+export const BrainItem = ({ brain, even }: BrainItemProps): JSX.Element => {
+ const {
+ handleUnsubscribeOrDeleteBrain,
+ isDeleteOrUnsubscribeModalOpened,
+ setIsDeleteOrUnsubscribeModalOpened,
+ isDeleteOrUnsubscribeRequestPending,
+ } = useBrainManagementTabs(brain.id);
+ const [isHovered, setIsHovered] = useState(false);
+
+ const { allBrains } = useBrainContext();
+
+ const { isOwnedByCurrentUser } = getBrainPermissions({
+ brainId: brain.id,
+ userAccessibleBrains: allBrains,
+ });
+
+ return (
+ setIsHovered(true)}
+ onMouseLeave={() => setIsHovered(false)}
+ >
+
+ {brain.name}
+ {brain.description}
+
+ (window.location.href = `/studio/${brain.id}`)}
+ />
+ setIsDeleteOrUnsubscribeModalOpened(true)}
+ />
+ void handleUnsubscribeOrDeleteBrain()}
+ isOwnedByCurrentUser={isOwnedByCurrentUser}
+ isDeleteOrUnsubscribeRequestPending={
+ isDeleteOrUnsubscribeRequestPending
+ }
+ />
+
+ );
+};
diff --git a/frontend/app/studio/components/BrainsTabs/components/BrainSearchBar.tsx b/frontend/app/studio/components/BrainsTabs/components/BrainSearchBar.tsx
new file mode 100644
index 000000000..68ebd90db
--- /dev/null
+++ b/frontend/app/studio/components/BrainsTabs/components/BrainSearchBar.tsx
@@ -0,0 +1,24 @@
+import { useTranslation } from "react-i18next";
+
+import { TextInput } from "@/lib/components/ui/TextInput/TextInput";
+
+type BrainSearchBarProps = {
+ searchQuery: string;
+ setSearchQuery: (searchQuery: string) => void;
+};
+
+export const BrainSearchBar = ({
+ searchQuery,
+ setSearchQuery,
+}: BrainSearchBarProps): JSX.Element => {
+ const { t } = useTranslation(["brain"]);
+
+ return (
+
+ );
+};
diff --git a/frontend/app/studio/components/BrainsTabs/components/BrainsList/BrainsList.module.scss b/frontend/app/studio/components/BrainsTabs/components/BrainsList/BrainsList.module.scss
new file mode 100644
index 000000000..a03f7061e
--- /dev/null
+++ b/frontend/app/studio/components/BrainsTabs/components/BrainsList/BrainsList.module.scss
@@ -0,0 +1,37 @@
+@use "@/styles/Colors.module.scss";
+@use "@/styles/Radius.module.scss";
+@use "@/styles/ScreenSizes.module.scss";
+@use "@/styles/Spacings.module.scss";
+@use "@/styles/Typography.module.scss";
+
+.brains_wrapper {
+ display: flex;
+ flex-direction: column;
+ box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.25);
+ border-radius: Radius.$big;
+ overflow: hidden;
+ width: 100%;
+ overflow-y: scroll;
+
+ .columns {
+ @include Typography.H3;
+ display: flex;
+ padding: Spacings.$spacing05;
+ gap: Spacings.$spacing05;
+ background-color: Colors.$lightest-grey;
+
+ .name {
+ width: 200px;
+ }
+
+ .description {
+ color: Colors.$dark-grey;
+ }
+
+ @media (max-width: ScreenSizes.$small) {
+ .description {
+ display: none;
+ }
+ }
+ }
+}
diff --git a/frontend/app/studio/components/BrainsTabs/components/BrainsList/BrainsList.tsx b/frontend/app/studio/components/BrainsTabs/components/BrainsList/BrainsList.tsx
new file mode 100644
index 000000000..40267f165
--- /dev/null
+++ b/frontend/app/studio/components/BrainsTabs/components/BrainsList/BrainsList.tsx
@@ -0,0 +1,25 @@
+import { MinimalBrainForUser } from "@/lib/context/BrainProvider/types";
+
+import styles from "./BrainsList.module.scss";
+
+import { BrainItem } from "../BrainItem/BrainItem";
+
+type BrainsListProps = {
+ brains: MinimalBrainForUser[];
+};
+
+export const BrainsList = ({ brains }: BrainsListProps): JSX.Element => {
+ return (
+
+
+ Name
+ Description
+
+ {brains.map((brain, index) => (
+
+
+
+ ))}
+
+ );
+};
diff --git a/frontend/app/studio/components/BrainsTabs/components/ManageBrains/ManageBrains.module.scss b/frontend/app/studio/components/BrainsTabs/components/ManageBrains/ManageBrains.module.scss
new file mode 100644
index 000000000..30d89bc1b
--- /dev/null
+++ b/frontend/app/studio/components/BrainsTabs/components/ManageBrains/ManageBrains.module.scss
@@ -0,0 +1,13 @@
+@use "@/styles/Spacings.module.scss";
+
+.manage_brains_wrapper {
+ display: flex;
+ flex-direction: column;
+ gap: Spacings.$spacing05;
+ padding-block: Spacings.$spacing05;
+ height: 100%;
+
+ .search_brain {
+ width: 250px;
+ }
+}
diff --git a/frontend/app/studio/components/BrainsTabs/components/ManageBrains/ManageBrains.tsx b/frontend/app/studio/components/BrainsTabs/components/ManageBrains/ManageBrains.tsx
new file mode 100644
index 000000000..b4905bc8b
--- /dev/null
+++ b/frontend/app/studio/components/BrainsTabs/components/ManageBrains/ManageBrains.tsx
@@ -0,0 +1,33 @@
+import Spinner from "@/lib/components/ui/Spinner";
+
+import styles from "./ManageBrains.module.scss";
+
+import { useBrainsTabs } from "../../hooks/useBrainsTabs";
+import { BrainSearchBar } from "../BrainSearchBar";
+import { BrainsList } from "../BrainsList/BrainsList";
+
+export const ManageBrains = (): JSX.Element => {
+ const { searchQuery, isFetchingBrains, setSearchQuery, brains } =
+ useBrainsTabs();
+
+ if (isFetchingBrains && brains.length === 0) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+ );
+};
diff --git a/frontend/app/brains-management/components/BrainsTabs/hooks/useBrainsTabs.ts b/frontend/app/studio/components/BrainsTabs/hooks/useBrainsTabs.ts
similarity index 100%
rename from frontend/app/brains-management/components/BrainsTabs/hooks/useBrainsTabs.ts
rename to frontend/app/studio/components/BrainsTabs/hooks/useBrainsTabs.ts
diff --git a/frontend/app/brains-management/components/BrainsTabs/types.ts b/frontend/app/studio/components/BrainsTabs/types.ts
similarity index 100%
rename from frontend/app/brains-management/components/BrainsTabs/types.ts
rename to frontend/app/studio/components/BrainsTabs/types.ts
diff --git a/frontend/app/brains-management/components/StyledTabsTrigger.tsx b/frontend/app/studio/components/StyledTabsTrigger.tsx
similarity index 100%
rename from frontend/app/brains-management/components/StyledTabsTrigger.tsx
rename to frontend/app/studio/components/StyledTabsTrigger.tsx
diff --git a/frontend/app/brains-management/layout.tsx b/frontend/app/studio/layout.tsx
similarity index 100%
rename from frontend/app/brains-management/layout.tsx
rename to frontend/app/studio/layout.tsx
diff --git a/frontend/app/studio/page.module.scss b/frontend/app/studio/page.module.scss
new file mode 100644
index 000000000..387580c78
--- /dev/null
+++ b/frontend/app/studio/page.module.scss
@@ -0,0 +1,16 @@
+@use "@/styles/Spacings.module.scss";
+
+.page_wrapper {
+ display: flex;
+ flex-direction: column;
+ gap: Spacings.$spacing05;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+
+ .content_wrapper {
+ padding-inline: Spacings.$spacing09;
+ padding-block: Spacings.$spacing05;
+ overflow-y: scroll;
+ }
+}
diff --git a/frontend/app/studio/page.tsx b/frontend/app/studio/page.tsx
new file mode 100644
index 000000000..eeff4863e
--- /dev/null
+++ b/frontend/app/studio/page.tsx
@@ -0,0 +1,68 @@
+"use client";
+
+import { useState } from "react";
+
+import { AddBrainModal } from "@/lib/components/AddBrainModal";
+import { useBrainCreationContext } from "@/lib/components/AddBrainModal/components/AddBrainSteps/brainCreation-provider";
+import PageHeader from "@/lib/components/PageHeader/PageHeader";
+import { UploadDocumentModal } from "@/lib/components/UploadDocumentModal/UploadDocumentModal";
+import { Tabs } from "@/lib/components/ui/Tabs/Tabs";
+import { useKnowledgeToFeedContext } from "@/lib/context/KnowledgeToFeedProvider/hooks/useKnowledgeToFeedContext";
+import { ButtonType } from "@/lib/types/QuivrButton";
+import { Tab } from "@/lib/types/Tab";
+
+import { ManageBrains } from "./components/BrainsTabs/components/ManageBrains/ManageBrains";
+import styles from "./page.module.scss";
+
+const Studio = (): JSX.Element => {
+ const [selectedTab, setSelectedTab] = useState("Manage my brains");
+ const { setShouldDisplayFeedCard } = useKnowledgeToFeedContext();
+ const { setIsBrainCreationModalOpened } = useBrainCreationContext();
+
+ const studioTabs: Tab[] = [
+ {
+ label: "Manage my brains",
+ isSelected: selectedTab === "Manage my brains",
+ onClick: () => setSelectedTab("Manage my brains"),
+ },
+ {
+ label: "Analytics - Coming soon",
+ isSelected: selectedTab === "Analytics",
+ onClick: () => setSelectedTab("Analytics"),
+ disabled: true,
+ },
+ ];
+
+ const buttons: ButtonType[] = [
+ {
+ label: "Create brain",
+ color: "primary",
+ onClick: () => {
+ setIsBrainCreationModalOpened(true);
+ },
+ },
+ {
+ label: "Add knowledge",
+ color: "primary",
+ onClick: () => {
+ setShouldDisplayFeedCard(true);
+ },
+ },
+ ];
+
+ return (
+
+
+
+
+ {selectedTab === "Manage my brains" && }
+
+
+
+
+ );
+};
+
+export default Studio;
diff --git a/frontend/app/user/components/LogoutModal/LogoutModal.tsx b/frontend/app/user/components/LogoutModal/LogoutModal.tsx
deleted file mode 100644
index 98fc32b72..000000000
--- a/frontend/app/user/components/LogoutModal/LogoutModal.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import { useTranslation } from "react-i18next";
-
-import Button from "@/lib/components/ui/Button";
-import { Modal } from "@/lib/components/ui/Modal";
-import TextButton from "@/lib/components/ui/TextButton/TextButton";
-
-import { useLogoutModal } from "./hooks/useLogoutModal";
-
-export const LogoutModal = (): JSX.Element => {
- const { t } = useTranslation(["translation", "logout"]);
- const {
- handleLogout,
- isLoggingOut,
- isLogoutModalOpened,
- setIsLogoutModalOpened,
- } = useLogoutModal();
-
- return (
- void 0}>
-
-
- }
- isOpen={isLogoutModalOpened}
- setOpen={setIsLogoutModalOpened}
- CloseTrigger={
}
- >
-
-
- {t("areYouSure", { ns: "logout" })}
-
-
- setIsLogoutModalOpened(false)}
- variant={"primary"}
- >
- {t("cancel", { ns: "logout" })}
-
- void handleLogout()}
- data-testid="logout-button"
- >
- {t("logoutButton")}
-
-
-
-
- );
-};
diff --git a/frontend/app/user/components/LogoutModal/hooks/__tests__/useLogoutModal.ts b/frontend/app/user/components/LogoutModal/hooks/__tests__/useLogoutModal.ts
deleted file mode 100644
index bdef4fd00..000000000
--- a/frontend/app/user/components/LogoutModal/hooks/__tests__/useLogoutModal.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { act, renderHook } from "@testing-library/react";
-import { describe, expect, it, vi } from "vitest";
-
-import { useLogoutModal } from "../useLogoutModal";
-
-const mockSignOut = vi.fn(() => ({ error: null }));
-
-const mockUseSupabase = () => ({
- supabase: {
- auth: {
- signOut: mockSignOut,
- },
- },
-});
-
-vi.mock("next/navigation", () => ({
- useRouter: () => ({ replace: vi.fn() }),
-}));
-
-vi.mock("@/lib/context/SupabaseProvider", () => ({
- useSupabase: () => mockUseSupabase(),
-}));
-const clearLocalStorageMock = vi.fn();
-
-Object.defineProperty(window, "localStorage", {
- value: {
- clear: clearLocalStorageMock,
- },
-});
-
-describe("useLogoutModal", () => {
- it("should call signOut", async () => {
- const { result } = renderHook(() => useLogoutModal());
-
- await act(() => result.current.handleLogout());
-
- expect(mockSignOut).toHaveBeenCalledTimes(1);
- expect(clearLocalStorageMock).toHaveBeenCalledTimes(1);
- });
-});
diff --git a/frontend/app/user/components/Settings/Settings.module.scss b/frontend/app/user/components/Settings/Settings.module.scss
index 84e23ac00..3758a4451 100644
--- a/frontend/app/user/components/Settings/Settings.module.scss
+++ b/frontend/app/user/components/Settings/Settings.module.scss
@@ -6,7 +6,4 @@
flex-direction: column;
gap: Spacings.$spacing07;
width: auto;
- box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.25);
- border-radius: Radius.$big;
- padding: Spacings.$spacing05;
}
diff --git a/frontend/app/user/components/Settings/Settings.tsx b/frontend/app/user/components/Settings/Settings.tsx
index 743f2091d..40d566399 100644
--- a/frontend/app/user/components/Settings/Settings.tsx
+++ b/frontend/app/user/components/Settings/Settings.tsx
@@ -4,7 +4,6 @@ import styles from "./Settings.module.scss";
import { ApiKeyConfig } from "../ApiKeyConfig";
import LanguageSelect from "../LanguageSelect/LanguageSelect";
-import { LogoutModal } from "../LogoutModal/LogoutModal";
type InfoDisplayerProps = {
email: string;
@@ -18,7 +17,6 @@ export const Settings = ({ email }: InfoDisplayerProps): JSX.Element => {
-
);
};
diff --git a/frontend/app/user/components/UserMenuCard/UserMenuCard.module.scss b/frontend/app/user/components/UserMenuCard/UserMenuCard.module.scss
deleted file mode 100644
index 23f8fa7b4..000000000
--- a/frontend/app/user/components/UserMenuCard/UserMenuCard.module.scss
+++ /dev/null
@@ -1,45 +0,0 @@
-@use "@/styles/Colors.module.scss";
-@use "@/styles/Radius.module.scss";
-@use "@/styles/Spacings.module.scss";
-@use "@/styles/ScreenSizes.module.scss";
-@use "@/styles/Typography.module.scss";
-
-.menu_card_container {
- padding: Spacings.$spacing05;
- border-radius: Radius.$big;
- box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.25);
- cursor: pointer;
- display: flex;
- flex-direction: column;
- gap: Spacings.$spacing03;
- width: 20%;
-
- @media (max-width: ScreenSizes.$small) {
- width: auto;
-
- .title,
- .subtitle {
- display: none;
- }
- }
-
- &:hover,
- &.selected {
- background-color: Colors.$primary-lightest;
- }
-
- .first_line_wrapper {
- display: flex;
- align-items: center;
- justify-content: space-between;
-
- .title {
- @include Typography.H2;
- }
- }
-
- .subtitle {
- font-size: Typography.$small;
- color: Colors.$normal-grey;
- }
-}
diff --git a/frontend/app/user/components/UserMenuCard/UserMenuCard.tsx b/frontend/app/user/components/UserMenuCard/UserMenuCard.tsx
deleted file mode 100644
index a8aa231c3..000000000
--- a/frontend/app/user/components/UserMenuCard/UserMenuCard.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { useState } from "react";
-
-import { Icon } from "@/lib/components/ui/Icon/Icon";
-
-import styles from "./UserMenuCard.module.scss";
-
-import { UserMenuCardProps } from "../types/types";
-
-export const UserMenuCard = ({
- title,
- subtitle,
- iconName,
- selected,
- onClick,
-}: UserMenuCardProps): JSX.Element => {
- const [isHovered, setIsHovered] = useState(false);
-
- return (
- setIsHovered(true)}
- onMouseLeave={() => setIsHovered(false)}
- onClick={onClick}
- >
-
- {title}
-
-
-
{subtitle}
-
- );
-};
diff --git a/frontend/app/user/page.module.scss b/frontend/app/user/page.module.scss
index 47793febb..b9b7f737c 100644
--- a/frontend/app/user/page.module.scss
+++ b/frontend/app/user/page.module.scss
@@ -1,13 +1,9 @@
@use "@/styles/Spacings.module.scss";
.user_page_container {
- padding: Spacings.$spacing09;
+ padding-inline: Spacings.$spacing09;
+ padding-block: Spacings.$spacing07;
display: flex;
flex-direction: column;
- gap: Spacings.$spacing09;
-
- .left_menu_wrapper {
- display: flex;
- gap: Spacings.$spacing05;
- }
+ gap: Spacings.$spacing05;
}
diff --git a/frontend/app/user/page.tsx b/frontend/app/user/page.tsx
index 88b18e729..1930d60f5 100644
--- a/frontend/app/user/page.tsx
+++ b/frontend/app/user/page.tsx
@@ -1,51 +1,61 @@
"use client";
import { useState } from "react";
+import { useTranslation } from "react-i18next";
+import PageHeader from "@/lib/components/PageHeader/PageHeader";
+import { Modal } from "@/lib/components/ui/Modal";
+import QuivrButton from "@/lib/components/ui/QuivrButton/QuivrButton";
+import { Tabs } from "@/lib/components/ui/Tabs/Tabs";
import { useSupabase } from "@/lib/context/SupabaseProvider";
import { useUserData } from "@/lib/hooks/useUserData";
import { redirectToLogin } from "@/lib/router/redirectToLogin";
+import { ButtonType } from "@/lib/types/QuivrButton";
+import { Tab } from "@/lib/types/Tab";
import { BrainsUsage } from "./components/BrainsUsage/BrainsUsage";
import { Plan } from "./components/Plan/Plan";
import { Settings } from "./components/Settings/Settings";
-import { UserMenuCard } from "./components/UserMenuCard/UserMenuCard";
-import { UserMenuCardProps } from "./components/types/types";
import styles from "./page.module.scss";
+import { useLogoutModal } from "../../lib/hooks/useLogoutModal";
+
const UserPage = (): JSX.Element => {
+ const [selectedTab, setSelectedTab] = useState("Settings");
const { session } = useSupabase();
const { userData } = useUserData();
+ const { t } = useTranslation(["translation", "logout"]);
+ const {
+ handleLogout,
+ isLoggingOut,
+ isLogoutModalOpened,
+ setIsLogoutModalOpened,
+ } = useLogoutModal();
- const [userMenuCards, setUserMenuCards] = useState([
- {
- title: "Settings",
- subtitle: "Change your settings",
- iconName: "settings",
- selected: true,
+ const button: ButtonType = {
+ label: "Logout",
+ color: "dangerous",
+ onClick: () => {
+ setIsLogoutModalOpened(true);
},
- {
- title: "Brain Usage",
- subtitle: "View your brain usage",
- iconName: "graph",
- selected: false,
- },
- {
- title: "Plan",
- subtitle: "Manage your plan",
- iconName: "unlock",
- selected: false,
- },
- ]);
-
- const handleCardClick = (index: number) => {
- setUserMenuCards(
- userMenuCards.map((card, i) => ({
- ...card,
- selected: i === index,
- }))
- );
};
+ const userTabs: Tab[] = [
+ {
+ label: "Settings",
+ isSelected: selectedTab === "Settings",
+ onClick: () => setSelectedTab("Settings"),
+ },
+ {
+ label: "Brains Usage",
+ isSelected: selectedTab === "Brains Usage",
+ onClick: () => setSelectedTab("Brains Usage"),
+ },
+ {
+ label: "Plan",
+ isSelected: selectedTab === "Plan",
+ onClick: () => setSelectedTab("Plan"),
+ },
+ ];
if (!session || !userData) {
redirectToLogin();
@@ -53,25 +63,41 @@ const UserPage = (): JSX.Element => {
return (
<>
-
-
- {userMenuCards.map((card, index) => (
- handleCardClick(index)}
- />
- ))}
-
+
+
+
- {userMenuCards[0].selected &&
}
- {userMenuCards[1].selected &&
}
- {userMenuCards[2].selected &&
}
+ {userTabs[0].isSelected &&
}
+ {userTabs[1].isSelected &&
}
+ {userTabs[2].isSelected &&
}
-
+
+ }
+ >
+
+
+ {t("areYouSure", { ns: "logout" })}
+
+
+ setIsLogoutModalOpened(false)}
+ color="primary"
+ label={t("cancel", { ns: "logout" })}
+ >
+ void handleLogout()}
+ label={t("logoutButton")}
+ >
+
+
+
>
);
};
diff --git a/frontend/lib/api/brain/brain.ts b/frontend/lib/api/brain/brain.ts
index 4f2361517..833331b41 100644
--- a/frontend/lib/api/brain/brain.ts
+++ b/frontend/lib/api/brain/brain.ts
@@ -146,8 +146,12 @@ export const getDocsFromQuestion = async (
question: string,
axiosInstance: AxiosInstance
): Promise => {
- return (await axiosInstance.post>(`/brains/${brainId}/documents`, {
- question,
- })).data.docs;
- }
-
+ return (
+ await axiosInstance.post>(
+ `/brains/${brainId}/documents`,
+ {
+ question,
+ }
+ )
+ ).data.docs;
+};
diff --git a/frontend/lib/components/AddBrainModal/AddBrainModal.tsx b/frontend/lib/components/AddBrainModal/AddBrainModal.tsx
index 5be6c11e3..70869b8a8 100644
--- a/frontend/lib/components/AddBrainModal/AddBrainModal.tsx
+++ b/frontend/lib/components/AddBrainModal/AddBrainModal.tsx
@@ -5,11 +5,7 @@ import { addBrainDefaultValues } from "@/lib/config/defaultBrainConfig";
import { AddBrainSteps } from "./components/AddBrainSteps/AddBrainSteps";
import { CreateBrainProps } from "./types";
-export const AddBrainModal = ({
- isMenuButton,
-}: {
- isMenuButton?: boolean;
-}): JSX.Element => {
+export const AddBrainModal = (): JSX.Element => {
const defaultValues: CreateBrainProps = {
...addBrainDefaultValues,
setDefault: true,
@@ -22,7 +18,7 @@ export const AddBrainModal = ({
return (
-
+
);
};
diff --git a/frontend/lib/components/AddBrainModal/components/AddBrainSteps/AddBrainSteps.tsx b/frontend/lib/components/AddBrainModal/components/AddBrainSteps/AddBrainSteps.tsx
index 2414fa150..b5fd16e1f 100644
--- a/frontend/lib/components/AddBrainModal/components/AddBrainSteps/AddBrainSteps.tsx
+++ b/frontend/lib/components/AddBrainModal/components/AddBrainSteps/AddBrainSteps.tsx
@@ -1,45 +1,21 @@
import { useTranslation } from "react-i18next";
-import { MenuButton } from "@/lib/components/Menu/components/MenuButton/MenuButton";
import { Modal } from "@/lib/components/ui/Modal";
-import TextButton from "@/lib/components/ui/TextButton/TextButton";
+import { useBrainCreationContext } from "./brainCreation-provider";
import { BrainKnowledgeStep } from "./components/BrainKnowledgeStep/BrainKnowledgeStep";
import { BrainParamsStep } from "./components/BrainParamsStep/BrainParamsStep";
import { BrainTypeSelectionStep } from "./components/BrainTypeSelectionStep/BrainTypeSelectionStep";
import { Stepper } from "./components/Stepper/Stepper";
-import { useAddBrainConfig } from "./hooks/useAddBrainConfig";
-export const AddBrainSteps = ({
- isMenuButton,
-}: {
- isMenuButton?: boolean;
-}): JSX.Element => {
+export const AddBrainSteps = (): JSX.Element => {
const { t } = useTranslation(["translation", "brain", "config"]);
const { isBrainCreationModalOpened, setIsBrainCreationModalOpened } =
- useAddBrainConfig();
+ useBrainCreationContext();
return (
void 0}>
- {isMenuButton ? (
-
- ) : (
-
- )}
-
- }
title={t("newBrainTitle", { ns: "brain" })}
desc={t("newBrainSubtitle", { ns: "brain" })}
isOpen={isBrainCreationModalOpened}
diff --git a/frontend/lib/components/AddBrainModal/components/AddBrainSteps/brainCreation-provider.tsx b/frontend/lib/components/AddBrainModal/components/AddBrainSteps/brainCreation-provider.tsx
new file mode 100644
index 000000000..92e62d032
--- /dev/null
+++ b/frontend/lib/components/AddBrainModal/components/AddBrainSteps/brainCreation-provider.tsx
@@ -0,0 +1,38 @@
+import { createContext, useContext, useState } from "react";
+
+interface BrainCreationContextProps {
+ isBrainCreationModalOpened: boolean;
+ setIsBrainCreationModalOpened: React.Dispatch
>;
+}
+
+export const BrainCreationContext = createContext<
+ BrainCreationContextProps | undefined
+>(undefined);
+
+export const BrainCreationProvider = ({
+ children,
+}: {
+ children: React.ReactNode;
+}): JSX.Element => {
+ const [isBrainCreationModalOpened, setIsBrainCreationModalOpened] =
+ useState(false);
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useBrainCreationContext = (): BrainCreationContextProps => {
+ const context = useContext(BrainCreationContext);
+ if (!context) {
+ throw new Error(
+ "useBrainCreationContext must be used within a BrainCreationProvider"
+ );
+ }
+
+ return context;
+};
diff --git a/frontend/lib/components/AddBrainModal/components/AddBrainSteps/hooks/useAddBrainConfig.ts b/frontend/lib/components/AddBrainModal/components/AddBrainSteps/hooks/useAddBrainConfig.ts
deleted file mode 100644
index daec160be..000000000
--- a/frontend/lib/components/AddBrainModal/components/AddBrainSteps/hooks/useAddBrainConfig.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { useState } from "react";
-
-// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
-export const useAddBrainConfig = () => {
- const [isBrainCreationModalOpened, setIsBrainCreationModalOpened] =
- useState(false);
-
- return {
- isBrainCreationModalOpened,
- setIsBrainCreationModalOpened,
- };
-};
diff --git a/frontend/lib/components/ApiBrainSecretsInputs/ApiBrainSecretsInputs.tsx b/frontend/lib/components/ApiBrainSecretsInputs/ApiBrainSecretsInputs.tsx
index b9b6198cc..349715667 100644
--- a/frontend/lib/components/ApiBrainSecretsInputs/ApiBrainSecretsInputs.tsx
+++ b/frontend/lib/components/ApiBrainSecretsInputs/ApiBrainSecretsInputs.tsx
@@ -2,7 +2,7 @@ import { UUID } from "crypto";
import { Fragment } from "react";
import { useTranslation } from "react-i18next";
-import { useBrainFetcher } from "@/app/brains-management/[brainId]/components/BrainManagementTabs/hooks/useBrainFetcher";
+import { useBrainFetcher } from "@/app/studio/[brainId]/components/BrainManagementTabs/hooks/useBrainFetcher";
import { useApiBrainSecretsInputs } from "./hooks/useApiBrainSecretsInputs";
diff --git a/frontend/lib/components/Menu/Menu.module.scss b/frontend/lib/components/Menu/Menu.module.scss
index b0d5daa08..3f7ab5bc0 100644
--- a/frontend/lib/components/Menu/Menu.module.scss
+++ b/frontend/lib/components/Menu/Menu.module.scss
@@ -46,6 +46,6 @@
z-index: ZIndexes.$overlay;
&.shifted {
- margin-left: 230px;
+ margin-left: 180px;
}
}
diff --git a/frontend/lib/components/Menu/Menu.tsx b/frontend/lib/components/Menu/Menu.tsx
index f373e35ca..3b7c6cd64 100644
--- a/frontend/lib/components/Menu/Menu.tsx
+++ b/frontend/lib/components/Menu/Menu.tsx
@@ -10,15 +10,12 @@ import { useMenuContext } from "@/lib/context/MenuProvider/hooks/useMenuContext"
import styles from "./Menu.module.scss";
import { AnimatedDiv } from "./components/AnimationDiv";
-import { BrainsManagementButton } from "./components/BrainsManagementButton/BrainsManagementButton";
import { DiscussionButton } from "./components/DiscussionButton/DiscussionButton";
import { HistoryButton } from "./components/HistoryButton/HistoryButton";
import { HomeButton } from "./components/HomeButton/HomeButton";
import { ProfileButton } from "./components/ProfileButton/ProfileButton";
+import { StudioButton } from "./components/StudioButton/StudioButton";
import { UpgradeToPlusButton } from "./components/UpgradeToPlusButton/UpgradeToPlusButton";
-import { UploadDocumentButton } from "./components/UploadDocumentButton/UploadDocumentButton";
-
-import { AddBrainModal } from "../AddBrainModal";
export const Menu = (): JSX.Element => {
const { isOpened } = useMenuContext();
@@ -32,13 +29,7 @@ export const Menu = (): JSX.Element => {
return <>>;
}
- const displayedOnPages = [
- "/chat",
- "/library",
- "/brains-management",
- "/search",
- "/user",
- ];
+ const displayedOnPages = ["/chat", "/library", "/studio", "/search", "/user"];
const isMenuDisplayed = displayedOnPages.some((page) =>
pathname.includes(page)
@@ -69,9 +60,7 @@ export const Menu = (): JSX.Element => {
diff --git a/frontend/lib/components/Menu/components/BrainsManagementButton/BrainsManagementButton.tsx b/frontend/lib/components/Menu/components/BrainsManagementButton/BrainsManagementButton.tsx
deleted file mode 100644
index 38a549931..000000000
--- a/frontend/lib/components/Menu/components/BrainsManagementButton/BrainsManagementButton.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import Link from "next/link";
-import { usePathname } from "next/navigation";
-import { useTranslation } from "react-i18next";
-
-import { MenuButton } from "@/lib/components/Menu/components/MenuButton/MenuButton";
-
-export const BrainsManagementButton = (): JSX.Element => {
- const pathname = usePathname() ?? "";
- const isSelected =
- pathname.includes("/brains-management") && !pathname.includes("/library");
- const { t } = useTranslation("brain");
-
- return (
-
-
-
- );
-};
diff --git a/frontend/lib/components/Menu/components/HistoryButton/ChatsSection/ChatHistoryItem/ChatHistoryItem.tsx b/frontend/lib/components/Menu/components/HistoryButton/ChatsSection/ChatHistoryItem/ChatHistoryItem.tsx
index 6dae42038..96a434038 100644
--- a/frontend/lib/components/Menu/components/HistoryButton/ChatsSection/ChatHistoryItem/ChatHistoryItem.tsx
+++ b/frontend/lib/components/Menu/components/HistoryButton/ChatsSection/ChatHistoryItem/ChatHistoryItem.tsx
@@ -59,7 +59,7 @@ export const ChatHistoryItem = ({
void deleteChat()}
/>
diff --git a/frontend/lib/components/Menu/components/BrainsManagementButton/BrainsManagementButton.module.scss b/frontend/lib/components/Menu/components/StudioButton/StudioButton.module.scss
similarity index 100%
rename from frontend/lib/components/Menu/components/BrainsManagementButton/BrainsManagementButton.module.scss
rename to frontend/lib/components/Menu/components/StudioButton/StudioButton.module.scss
diff --git a/frontend/lib/components/Menu/components/StudioButton/StudioButton.tsx b/frontend/lib/components/Menu/components/StudioButton/StudioButton.tsx
new file mode 100644
index 000000000..1b7867421
--- /dev/null
+++ b/frontend/lib/components/Menu/components/StudioButton/StudioButton.tsx
@@ -0,0 +1,18 @@
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+
+import { MenuButton } from "@/lib/components/Menu/components/MenuButton/MenuButton";
+
+export const StudioButton = (): JSX.Element => {
+ return (
+
+
+
+ );
+};
diff --git a/frontend/lib/components/Menu/components/UploadDocumentButton/UploadDocumentButton.module.scss b/frontend/lib/components/Menu/components/UploadDocumentButton/UploadDocumentButton.module.scss
deleted file mode 100644
index e69de29bb..000000000
diff --git a/frontend/lib/components/Menu/components/UploadDocumentButton/UploadDocumentButton.tsx b/frontend/lib/components/Menu/components/UploadDocumentButton/UploadDocumentButton.tsx
deleted file mode 100644
index 668e20dd6..000000000
--- a/frontend/lib/components/Menu/components/UploadDocumentButton/UploadDocumentButton.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import { useTranslation } from "react-i18next";
-
-import { MenuButton } from "@/lib/components/Menu/components/MenuButton/MenuButton";
-import { UploadDocumentModal } from "@/lib/components/UploadDocumentModal/UploadDocumentModal";
-import { Modal } from "@/lib/components/ui/Modal";
-import { useKnowledgeToFeedContext } from "@/lib/context/KnowledgeToFeedProvider/hooks/useKnowledgeToFeedContext";
-
-export const UploadDocumentButton = (): JSX.Element => {
- const { shouldDisplayFeedCard, setShouldDisplayFeedCard } =
- useKnowledgeToFeedContext();
- const { t } = useTranslation("upload");
-
- return (
- void 0}>
- setShouldDisplayFeedCard(true)}
- color="primary"
- />
-
- }
- title={t("title", { ns: "upload" })}
- isOpen={shouldDisplayFeedCard}
- setOpen={setShouldDisplayFeedCard}
- CloseTrigger={
}
- >
-
-
- );
-};
diff --git a/frontend/lib/components/PageHeader/PageHeader.module.scss b/frontend/lib/components/PageHeader/PageHeader.module.scss
new file mode 100644
index 000000000..590271266
--- /dev/null
+++ b/frontend/lib/components/PageHeader/PageHeader.module.scss
@@ -0,0 +1,30 @@
+@use "@/styles/Colors.module.scss";
+@use "@/styles/Spacings.module.scss";
+@use "@/styles/Typography.module.scss";
+
+.page_header_wrapper {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: Spacings.$spacing04;
+ padding-left: Spacings.$spacing09;
+ border-bottom: 1px solid Colors.$lightest-black;
+
+ .left {
+ @include Typography.H2;
+ display: flex;
+ align-items: center;
+ gap: Spacings.$spacing03;
+ visibility: hidden;
+
+ &.menu_closed {
+ visibility: visible;
+ padding-left: Spacings.$spacing07;
+ }
+ }
+
+ .buttons_wrapper {
+ display: flex;
+ gap: Spacings.$spacing03;
+ }
+}
diff --git a/frontend/lib/components/PageHeader/PageHeader.tsx b/frontend/lib/components/PageHeader/PageHeader.tsx
new file mode 100644
index 000000000..b48ec7b71
--- /dev/null
+++ b/frontend/lib/components/PageHeader/PageHeader.tsx
@@ -0,0 +1,42 @@
+import { useMenuContext } from "@/lib/context/MenuProvider/hooks/useMenuContext";
+import { ButtonType } from "@/lib/types/QuivrButton";
+
+import styles from "./PageHeader.module.scss";
+
+import { Icon } from "../ui/Icon/Icon";
+import { QuivrButton } from "../ui/QuivrButton/QuivrButton";
+
+type Props = {
+ iconName: string;
+ label: string;
+ buttons: ButtonType[];
+};
+
+export const PageHeader = ({
+ iconName,
+ label,
+ buttons,
+}: Props): JSX.Element => {
+ const { isOpened } = useMenuContext();
+
+ return (
+
+
+
+ {label}
+
+
+ {buttons.map((button, index) => (
+
+ ))}
+
+
+ );
+};
+
+export default PageHeader;
diff --git a/frontend/lib/components/UploadDocumentModal/UploadDocumentModal.tsx b/frontend/lib/components/UploadDocumentModal/UploadDocumentModal.tsx
index 13f3c315b..1a7da5e00 100644
--- a/frontend/lib/components/UploadDocumentModal/UploadDocumentModal.tsx
+++ b/frontend/lib/components/UploadDocumentModal/UploadDocumentModal.tsx
@@ -6,8 +6,11 @@ import { useKnowledgeToFeedContext } from "@/lib/context/KnowledgeToFeedProvider
import styles from "./UploadDocumentModal.module.scss";
+import { Modal } from "../ui/Modal";
+
export const UploadDocumentModal = (): JSX.Element => {
- const { shouldDisplayFeedCard } = useKnowledgeToFeedContext();
+ const { shouldDisplayFeedCard, setShouldDisplayFeedCard } =
+ useKnowledgeToFeedContext();
const { setHasPendingRequests } = useActionBar();
if (!shouldDisplayFeedCard) {
@@ -15,19 +18,25 @@ export const UploadDocumentModal = (): JSX.Element => {
}
return (
-
-
-
- setHasPendingRequests(true)}
- />
-
-
-
+ }
+ >
+
+
+
+ setHasPendingRequests(true)}
+ />
+
+
+
+
);
};
diff --git a/frontend/lib/components/ui/QuivrButton/QuivrButton.module.scss b/frontend/lib/components/ui/QuivrButton/QuivrButton.module.scss
new file mode 100644
index 000000000..4da1ce738
--- /dev/null
+++ b/frontend/lib/components/ui/QuivrButton/QuivrButton.module.scss
@@ -0,0 +1,34 @@
+@use "@/styles/Colors.module.scss";
+@use "@/styles/Radius.module.scss";
+@use "@/styles/Spacings.module.scss";
+@use "@/styles/Typography.module.scss";
+
+.button_wrapper {
+ font-size: Typography.$small;
+ white-space: nowrap;
+ padding-inline: Spacings.$spacing04;
+ padding-block: Spacings.$spacing02;
+ border-radius: Radius.$normal;
+ border: 1.5px solid transparent;
+ cursor: pointer;
+
+ &.primary {
+ border-color: Colors.$primary;
+ color: Colors.$primary;
+
+ &:hover {
+ background-color: Colors.$primary;
+ color: Colors.$white;
+ }
+ }
+
+ &.dangerous {
+ border-color: Colors.$dangerous;
+ color: Colors.$dangerous;
+
+ &:hover {
+ background-color: Colors.$dangerous;
+ color: Colors.$white;
+ }
+ }
+}
diff --git a/frontend/lib/components/ui/QuivrButton/QuivrButton.tsx b/frontend/lib/components/ui/QuivrButton/QuivrButton.tsx
new file mode 100644
index 000000000..3d49bf9b8
--- /dev/null
+++ b/frontend/lib/components/ui/QuivrButton/QuivrButton.tsx
@@ -0,0 +1,27 @@
+import { ButtonType } from "@/lib/types/QuivrButton";
+
+import styles from "./QuivrButton.module.scss";
+
+import { LoaderIcon } from "../LoaderIcon/LoaderIcon";
+
+export const QuivrButton = ({
+ onClick,
+ label,
+ color,
+ isLoading,
+}: ButtonType): JSX.Element => {
+ return (
+
+ {!isLoading ? (
+ {label}
+ ) : (
+
+ )}
+
+ );
+};
+
+export default QuivrButton;
diff --git a/frontend/lib/components/ui/Tabs/Tabs.module.scss b/frontend/lib/components/ui/Tabs/Tabs.module.scss
new file mode 100644
index 000000000..098777670
--- /dev/null
+++ b/frontend/lib/components/ui/Tabs/Tabs.module.scss
@@ -0,0 +1,34 @@
+@use "@/styles/Colors.module.scss";
+@use "@/styles/Radius.module.scss";
+@use "@/styles/Spacings.module.scss";
+
+.tabs_container {
+ display: flex;
+ justify-content: space-between;
+
+ .tab_wrapper {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex: 1;
+ border-bottom: 2px solid Colors.$lightest-grey;
+ padding-block: Spacings.$spacing03;
+ cursor: pointer;
+ box-sizing: border-box;
+
+ &.selected {
+ border-bottom-color: Colors.$primary;
+ color: Colors.$primary;
+ background-color: Colors.$lightest-grey;
+ }
+
+ &:hover {
+ color: Colors.$primary;
+ }
+
+ &.disabled {
+ pointer-events: none;
+ color: Colors.$normal-grey;
+ }
+ }
+}
diff --git a/frontend/lib/components/ui/Tabs/Tabs.tsx b/frontend/lib/components/ui/Tabs/Tabs.tsx
new file mode 100644
index 000000000..51b5fa8b4
--- /dev/null
+++ b/frontend/lib/components/ui/Tabs/Tabs.tsx
@@ -0,0 +1,27 @@
+import { Tab } from "@/lib/types/Tab";
+
+import styles from "./Tabs.module.scss";
+
+type TabsProps = {
+ tabList: Tab[];
+};
+
+export const Tabs = ({ tabList }: TabsProps): JSX.Element => {
+ return (
+
+ {tabList.map((tab, index) => (
+
+ {tab.label}
+
+ ))}
+
+ );
+};
diff --git a/frontend/lib/components/ui/TextButton/TextButton.tsx b/frontend/lib/components/ui/TextButton/TextButton.tsx
index b65a4efae..2e3097aad 100644
--- a/frontend/lib/components/ui/TextButton/TextButton.tsx
+++ b/frontend/lib/components/ui/TextButton/TextButton.tsx
@@ -11,6 +11,7 @@ interface TextButtonProps {
iconName: keyof typeof iconList;
label: string;
color: Color;
+ onClick?: () => void;
}
export const TextButton = (props: TextButtonProps): JSX.Element => {
@@ -21,6 +22,7 @@ export const TextButton = (props: TextButtonProps): JSX.Element => {
className={styles.text_button_wrapper}
onMouseEnter={() => setHovered(true)}
onMouseLeave={() => setHovered(false)}
+ onClick={props.onClick}
>
{
return (
-
setInputValue(e.target.value)}
+ placeholder={label}
/>
+
);
};
diff --git a/frontend/lib/context/BrainProvider/hooks/useBrainProvider.ts b/frontend/lib/context/BrainProvider/hooks/useBrainProvider.ts
index 874ecc543..ef1619f1d 100644
--- a/frontend/lib/context/BrainProvider/hooks/useBrainProvider.ts
+++ b/frontend/lib/context/BrainProvider/hooks/useBrainProvider.ts
@@ -3,7 +3,7 @@ import { UUID } from "crypto";
import { useCallback, useState } from "react";
import { useTranslation } from "react-i18next";
-import { useBrainFetcher } from "@/app/brains-management/[brainId]/components/BrainManagementTabs/hooks/useBrainFetcher";
+import { useBrainFetcher } from "@/app/studio/[brainId]/components/BrainManagementTabs/hooks/useBrainFetcher";
import { CreateBrainInput } from "@/lib/api/brain/types";
import { useBrainApi } from "@/lib/api/brain/useBrainApi";
import { usePromptApi } from "@/lib/api/prompt/usePromptApi";
diff --git a/frontend/lib/helpers/iconList.ts b/frontend/lib/helpers/iconList.ts
index 895c6386a..dbff22d63 100644
--- a/frontend/lib/helpers/iconList.ts
+++ b/frontend/lib/helpers/iconList.ts
@@ -1,6 +1,6 @@
import { AiOutlineLoading3Quarters } from "react-icons/ai";
import { BsArrowRightShort } from "react-icons/bs";
-import { CiFlag1 } from "react-icons/ci";
+import { CiChat1, CiFlag1 } from "react-icons/ci";
import {
FaCheck,
FaCheckCircle,
@@ -25,9 +25,9 @@ import {
} from "react-icons/lu";
import {
MdAlternateEmail,
- MdDelete,
- MdEdit,
+ MdDeleteOutline,
MdHistory,
+ MdOutlineModeEditOutline,
MdUploadFile,
} from "react-icons/md";
import { RiHashtag } from "react-icons/ri";
@@ -38,14 +38,15 @@ export const iconList: { [name: string]: IconType } = {
addWithoutCircle: IoIosAdd,
brain: LuBrain,
brainCircuit: LuBrainCircuit,
+ chat: CiChat1,
check: FaCheck,
checkCircle: FaCheckCircle,
chevronDown: LuChevronDown,
chevronRight: LuChevronRight,
close: IoMdClose,
copy: LuCopy,
- delete: MdDelete,
- edit: MdEdit,
+ delete: MdDeleteOutline,
+ edit: MdOutlineModeEditOutline,
email: MdAlternateEmail,
file: LuFile,
flag: CiFlag1,
diff --git a/frontend/lib/hooks/useBrainIdFromUrl.ts b/frontend/lib/hooks/useBrainIdFromUrl.ts
index 69d42ca37..3cf9a4a46 100644
--- a/frontend/lib/hooks/useBrainIdFromUrl.ts
+++ b/frontend/lib/hooks/useBrainIdFromUrl.ts
@@ -1,7 +1,7 @@
import { UUID } from "crypto";
import { useParams } from "next/navigation";
-import { useBrainFetcher } from "@/app/brains-management/[brainId]/components/BrainManagementTabs/hooks/useBrainFetcher";
+import { useBrainFetcher } from "@/app/studio/[brainId]/components/BrainManagementTabs/hooks/useBrainFetcher";
import { useBrainContext } from "../context/BrainProvider/hooks/useBrainContext";
diff --git a/frontend/app/user/components/LogoutModal/hooks/useLogoutModal.ts b/frontend/lib/hooks/useLogoutModal.ts
similarity index 93%
rename from frontend/app/user/components/LogoutModal/hooks/useLogoutModal.ts
rename to frontend/lib/hooks/useLogoutModal.ts
index 42bb7d921..d8844b18b 100644
--- a/frontend/app/user/components/LogoutModal/hooks/useLogoutModal.ts
+++ b/frontend/lib/hooks/useLogoutModal.ts
@@ -1,4 +1,3 @@
-import { useRouter } from "next/navigation";
import { useState } from "react";
import { useTranslation } from "react-i18next";
@@ -17,7 +16,6 @@ export const useLogoutModal = () => {
const { t } = useTranslation(["translation", "logout"]);
const { publish } = useToast();
- const router = useRouter();
const handleLogout = async () => {
setIsLoggingOut(true);
@@ -36,7 +34,7 @@ export const useLogoutModal = () => {
variant: "success",
text: t("loggedOut", { ns: "logout" }),
});
- router.replace("/");
+ window.location.href = "/";
}
setIsLoggingOut(false);
};
diff --git a/frontend/lib/types/QuivrButton.ts b/frontend/lib/types/QuivrButton.ts
new file mode 100644
index 000000000..b57f8adbe
--- /dev/null
+++ b/frontend/lib/types/QuivrButton.ts
@@ -0,0 +1,8 @@
+import { Color } from "./Colors";
+
+export interface ButtonType {
+ label: string;
+ color: Color;
+ isLoading?: boolean;
+ onClick: () => void;
+}
diff --git a/frontend/lib/types/Tab.ts b/frontend/lib/types/Tab.ts
new file mode 100644
index 000000000..a18b81b07
--- /dev/null
+++ b/frontend/lib/types/Tab.ts
@@ -0,0 +1,6 @@
+export interface Tab {
+ label: string;
+ isSelected: boolean;
+ disabled?: boolean;
+ onClick: () => void;
+}
diff --git a/frontend/next.config.js b/frontend/next.config.js
index c402d02ba..7cf515fb7 100644
--- a/frontend/next.config.js
+++ b/frontend/next.config.js
@@ -16,7 +16,7 @@ const nextConfig = {
redirects: async () => {
return [
{
- source: "/brains-management/library",
+ source: "/studio/library",
destination: "/library",
permanent: false,
},
diff --git a/frontend/package.json b/frontend/package.json
index 608fe0d77..5da6b8c68 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -33,7 +33,7 @@
"@radix-ui/react-tabs": "1.0.4",
"@radix-ui/react-toast": "1.1.4",
"@radix-ui/react-tooltip": "1.0.6",
- "@sentry/nextjs": "7.61.1",
+ "@sentry/nextjs": "^7.99.0",
"@supabase/auth-helpers-nextjs": "0.6.1",
"@supabase/auth-ui-react": "0.4.2",
"@supabase/auth-ui-shared": "0.1.6",
@@ -61,7 +61,7 @@
"@typescript-eslint/eslint-plugin": "5.62.0",
"@vercel/analytics": "1.0.1",
"autoprefixer": "10.4.16",
- "axios": "1.4.0",
+ "axios": "^1.6.7",
"change-case": "^5.4.2",
"class-variance-authority": "0.7.0",
"clsx": "1.2.1",
@@ -96,7 +96,7 @@
"rehype-highlight": "6.0.0",
"rehype-raw": "7.0.0",
"sass": "^1.70.0",
- "sharp": "0.32.4",
+ "sharp": "^0.32.6",
"tailwind-merge": "1.14.0",
"tailwindcss": "3.4.0",
"tippy.js": "6.3.7",
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index ad7deeb1a..eb8ed54b6 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -8,9 +8,9 @@
integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
"@adobe/css-tools@^4.3.0":
- version "4.3.1"
- resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz"
- integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==
+ version "4.3.3"
+ resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz"
+ integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==
"@alloc/quick-lru@^5.2.0":
version "5.2.0"
@@ -25,12 +25,13 @@
"@jridgewell/gen-mapping" "^0.3.0"
"@jridgewell/trace-mapping" "^0.3.9"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.5":
- version "7.22.5"
- resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz"
- integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.23.5":
+ version "7.23.5"
+ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz"
+ integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==
dependencies:
- "@babel/highlight" "^7.22.5"
+ "@babel/highlight" "^7.23.4"
+ chalk "^2.4.2"
"@babel/compat-data@^7.22.9":
version "7.22.9"
@@ -58,12 +59,12 @@
json5 "^2.2.2"
semver "^6.3.1"
-"@babel/generator@^7.22.7", "@babel/generator@^7.22.9":
- version "7.22.9"
- resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz"
- integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==
+"@babel/generator@^7.22.9", "@babel/generator@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz"
+ integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==
dependencies:
- "@babel/types" "^7.22.5"
+ "@babel/types" "^7.23.6"
"@jridgewell/gen-mapping" "^0.3.2"
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
@@ -79,18 +80,18 @@
lru-cache "^5.1.1"
semver "^6.3.1"
-"@babel/helper-environment-visitor@^7.22.5":
- version "7.22.5"
- resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz"
- integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==
+"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5":
+ version "7.22.20"
+ resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz"
+ integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
-"@babel/helper-function-name@^7.22.5":
- version "7.22.5"
- resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz"
- integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==
+"@babel/helper-function-name@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz"
+ integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
dependencies:
- "@babel/template" "^7.22.5"
- "@babel/types" "^7.22.5"
+ "@babel/template" "^7.22.15"
+ "@babel/types" "^7.23.0"
"@babel/helper-hoist-variables@^7.22.5":
version "7.22.5"
@@ -136,15 +137,15 @@
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-string-parser@^7.22.5":
- version "7.22.5"
- resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz"
- integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
+"@babel/helper-string-parser@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz"
+ integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==
-"@babel/helper-validator-identifier@^7.22.5":
- version "7.22.5"
- resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz"
- integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==
+"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.22.5":
+ version "7.22.20"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz"
+ integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
"@babel/helper-validator-option@^7.22.5":
version "7.22.5"
@@ -160,19 +161,19 @@
"@babel/traverse" "^7.22.6"
"@babel/types" "^7.22.5"
-"@babel/highlight@^7.22.5":
- version "7.22.5"
- resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz"
- integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==
+"@babel/highlight@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz"
+ integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==
dependencies:
- "@babel/helper-validator-identifier" "^7.22.5"
- chalk "^2.0.0"
+ "@babel/helper-validator-identifier" "^7.22.20"
+ chalk "^2.4.2"
js-tokens "^4.0.0"
-"@babel/parser@^7.22.5", "@babel/parser@^7.22.7":
- version "7.22.7"
- resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz"
- integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==
+"@babel/parser@^7.22.7", "@babel/parser@^7.23.9":
+ version "7.23.9"
+ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz"
+ integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==
"@babel/plugin-transform-react-jsx-self@^7.22.5":
version "7.22.5"
@@ -188,45 +189,45 @@
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/runtime@^7.1.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.9.2":
- version "7.22.6"
- resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz"
- integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==
+"@babel/runtime@^7.1.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+ version "7.23.9"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz"
+ integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==
dependencies:
- regenerator-runtime "^0.13.11"
+ regenerator-runtime "^0.14.0"
-"@babel/template@^7.22.5":
- version "7.22.5"
- resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz"
- integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==
+"@babel/template@^7.22.15", "@babel/template@^7.22.5":
+ version "7.23.9"
+ resolved "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz"
+ integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==
dependencies:
- "@babel/code-frame" "^7.22.5"
- "@babel/parser" "^7.22.5"
- "@babel/types" "^7.22.5"
+ "@babel/code-frame" "^7.23.5"
+ "@babel/parser" "^7.23.9"
+ "@babel/types" "^7.23.9"
"@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8":
- version "7.22.8"
- resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz"
- integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==
+ version "7.23.9"
+ resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz"
+ integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==
dependencies:
- "@babel/code-frame" "^7.22.5"
- "@babel/generator" "^7.22.7"
- "@babel/helper-environment-visitor" "^7.22.5"
- "@babel/helper-function-name" "^7.22.5"
+ "@babel/code-frame" "^7.23.5"
+ "@babel/generator" "^7.23.6"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
"@babel/helper-hoist-variables" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6"
- "@babel/parser" "^7.22.7"
- "@babel/types" "^7.22.5"
- debug "^4.1.0"
+ "@babel/parser" "^7.23.9"
+ "@babel/types" "^7.23.9"
+ debug "^4.3.1"
globals "^11.1.0"
-"@babel/types@^7.22.5":
- version "7.22.5"
- resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz"
- integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==
+"@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9":
+ version "7.23.9"
+ resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz"
+ integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==
dependencies:
- "@babel/helper-string-parser" "^7.22.5"
- "@babel/helper-validator-identifier" "^7.22.5"
+ "@babel/helper-string-parser" "^7.23.4"
+ "@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
"@corex/deepmerge@^4.0.43":
@@ -495,32 +496,32 @@
resolved "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz"
integrity sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==
-"@floating-ui/core@^1.4.1":
- version "1.4.1"
- resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz"
- integrity sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==
+"@floating-ui/core@^1.6.0":
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz"
+ integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==
dependencies:
- "@floating-ui/utils" "^0.1.1"
+ "@floating-ui/utils" "^0.2.1"
-"@floating-ui/dom@^1.3.0":
- version "1.5.1"
- resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz"
- integrity sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==
+"@floating-ui/dom@^1.6.1":
+ version "1.6.1"
+ resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.1.tgz"
+ integrity sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==
dependencies:
- "@floating-ui/core" "^1.4.1"
- "@floating-ui/utils" "^0.1.1"
+ "@floating-ui/core" "^1.6.0"
+ "@floating-ui/utils" "^0.2.1"
-"@floating-ui/react-dom@^2.0.0":
- version "2.0.1"
- resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz"
- integrity sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==
+"@floating-ui/react-dom@^2.0.0", "@floating-ui/react-dom@^2.0.8":
+ version "2.0.8"
+ resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz"
+ integrity sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==
dependencies:
- "@floating-ui/dom" "^1.3.0"
+ "@floating-ui/dom" "^1.6.1"
-"@floating-ui/utils@^0.1.1":
- version "0.1.1"
- resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz"
- integrity sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==
+"@floating-ui/utils@^0.2.1":
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz"
+ integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==
"@growthbook/growthbook-react@0.17.0":
version "0.17.0"
@@ -778,7 +779,7 @@
dependencies:
playwright "1.38.0"
-"@popperjs/core@^2.9.0":
+"@popperjs/core@^2.11.8", "@popperjs/core@^2.9.0":
version "2.11.8"
resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
@@ -1300,32 +1301,51 @@
dset "^3.1.1"
tiny-hashes "^1.0.1"
-"@sentry-internal/tracing@7.61.1":
- version "7.61.1"
- resolved "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.61.1.tgz"
- integrity sha512-E8J6ZMXHGdWdmgKBK/ounuUppDK65c4Hphin6iVckDGMEATn0auYAKngeyRUMLof1167DssD8wxcIA4aBvmScA==
+"@sentry-internal/feedback@7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.99.0.tgz"
+ integrity sha512-exIO1o+bE0MW4z30FxC0cYzJ4ZHSMlDPMHCBDPzU+MWGQc/fb8s58QUrx5Dnm6HTh9G3H+YlroCxIo9u0GSwGQ==
dependencies:
- "@sentry/core" "7.61.1"
- "@sentry/types" "7.61.1"
- "@sentry/utils" "7.61.1"
- tslib "^2.4.1 || ^1.9.3"
+ "@sentry/core" "7.99.0"
+ "@sentry/types" "7.99.0"
+ "@sentry/utils" "7.99.0"
-"@sentry/browser@7.61.1":
- version "7.61.1"
- resolved "https://registry.npmjs.org/@sentry/browser/-/browser-7.61.1.tgz"
- integrity sha512-v6Wv0O/PF+sqji+WWpJmxAlQafsiKmsXQLzKAIntVjl3HbYO5oVS3ubCyqfxSlLxIhM5JuHcEOLn6Zi3DPtpcw==
+"@sentry-internal/replay-canvas@7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.99.0.tgz"
+ integrity sha512-PoIkfusToDq0snfl2M6HJx/1KJYtXxYhQplrn11kYadO04SdG0XGXf4h7wBTMEQ7LDEAtQyvsOu4nEQtTO3YjQ==
dependencies:
- "@sentry-internal/tracing" "7.61.1"
- "@sentry/core" "7.61.1"
- "@sentry/replay" "7.61.1"
- "@sentry/types" "7.61.1"
- "@sentry/utils" "7.61.1"
- tslib "^2.4.1 || ^1.9.3"
+ "@sentry/core" "7.99.0"
+ "@sentry/replay" "7.99.0"
+ "@sentry/types" "7.99.0"
+ "@sentry/utils" "7.99.0"
-"@sentry/cli@^1.74.6":
- version "1.75.2"
- resolved "https://registry.npmjs.org/@sentry/cli/-/cli-1.75.2.tgz"
- integrity sha512-CG0CKH4VCKWzEaegouWfCLQt9SFN+AieFESCatJ7zSuJmzF05ywpMusjxqRul6lMwfUhRKjGKOzcRJ1jLsfTBw==
+"@sentry-internal/tracing@7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.99.0.tgz"
+ integrity sha512-z3JQhHjoM1KdM20qrHwRClKJrNLr2CcKtCluq7xevLtXHJWNAQQbafnWD+Aoj85EWXBzKt9yJMv2ltcXJ+at+w==
+ dependencies:
+ "@sentry/core" "7.99.0"
+ "@sentry/types" "7.99.0"
+ "@sentry/utils" "7.99.0"
+
+"@sentry/browser@7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry/browser/-/browser-7.99.0.tgz"
+ integrity sha512-bgfoUv3wkwwLgN5YUOe0ibB3y268ZCnamZh6nLFqnY/UBKC1+FXWFdvzVON/XKUm62LF8wlpCybOf08ebNj2yg==
+ dependencies:
+ "@sentry-internal/feedback" "7.99.0"
+ "@sentry-internal/replay-canvas" "7.99.0"
+ "@sentry-internal/tracing" "7.99.0"
+ "@sentry/core" "7.99.0"
+ "@sentry/replay" "7.99.0"
+ "@sentry/types" "7.99.0"
+ "@sentry/utils" "7.99.0"
+
+"@sentry/cli@^1.77.1":
+ version "1.77.3"
+ resolved "https://registry.npmjs.org/@sentry/cli/-/cli-1.77.3.tgz"
+ integrity sha512-c3eDqcDRmy4TFz2bFU5Y6QatlpoBPPa8cxBooaS4aMQpnIdLYPF1xhyyiW0LQlDUNc3rRjNF7oN5qKoaRoMTQQ==
dependencies:
https-proxy-agent "^5.0.0"
mkdirp "^0.5.5"
@@ -1334,96 +1354,102 @@
proxy-from-env "^1.1.0"
which "^2.0.2"
-"@sentry/core@7.61.1":
- version "7.61.1"
- resolved "https://registry.npmjs.org/@sentry/core/-/core-7.61.1.tgz"
- integrity sha512-WTRt0J33KhUbYuDQZ5G58kdsNeQ5JYrpi6o+Qz+1xTv60DQq/tBGRJ7d86SkmdnGIiTs6W1hsxAtyiLS0y9d2A==
+"@sentry/core@7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry/core/-/core-7.99.0.tgz"
+ integrity sha512-vOAtzcAXEUtS/oW7wi3wMkZ3hsb5Ch96gKyrrj/mXdOp2zrcwdNV6N9/pawq2E9P/7Pw8AXw4CeDZztZrjQLuA==
dependencies:
- "@sentry/types" "7.61.1"
- "@sentry/utils" "7.61.1"
- tslib "^2.4.1 || ^1.9.3"
+ "@sentry/types" "7.99.0"
+ "@sentry/utils" "7.99.0"
-"@sentry/integrations@7.61.1":
- version "7.61.1"
- resolved "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.61.1.tgz"
- integrity sha512-mdmWzUQmW1viOiW0/Gi6AQ5LXukqhuefjzLdn5o6HMxiAgskIpNX+0+BOQ/6162/o7mHWSTNEHqEzMNTK2ppLw==
+"@sentry/integrations@7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.99.0.tgz"
+ integrity sha512-q4Nwpc27DTWlR7nDerd1o6KHlT/0usK+3xfBTZ1feVIAHCxt6ohCyZdoQ97+4kQiJJdX47MEmJYsXUlj62yZNg==
dependencies:
- "@sentry/types" "7.61.1"
- "@sentry/utils" "7.61.1"
+ "@sentry/core" "7.99.0"
+ "@sentry/types" "7.99.0"
+ "@sentry/utils" "7.99.0"
localforage "^1.8.1"
- tslib "^2.4.1 || ^1.9.3"
-"@sentry/nextjs@7.61.1":
- version "7.61.1"
- resolved "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-7.61.1.tgz"
- integrity sha512-ssq0AX+QaDzLSeA45lQLt3OVkzUNiNsI5loMU9gq+Bsts3KOHnykturFvdrb5T3WuIucE6PsswNjZIWqP+lrMg==
+"@sentry/nextjs@^7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-7.99.0.tgz"
+ integrity sha512-8eeEPFJjRBiCp2sFUhDLQFdWFagQ2yBvmALZIOIuoMei69N+clYVSxz84beeztbLal0zvRadJO5LAkBCb6d66Q==
dependencies:
"@rollup/plugin-commonjs" "24.0.0"
- "@sentry/core" "7.61.1"
- "@sentry/integrations" "7.61.1"
- "@sentry/node" "7.61.1"
- "@sentry/react" "7.61.1"
- "@sentry/types" "7.61.1"
- "@sentry/utils" "7.61.1"
- "@sentry/webpack-plugin" "1.20.0"
+ "@sentry/core" "7.99.0"
+ "@sentry/integrations" "7.99.0"
+ "@sentry/node" "7.99.0"
+ "@sentry/react" "7.99.0"
+ "@sentry/types" "7.99.0"
+ "@sentry/utils" "7.99.0"
+ "@sentry/vercel-edge" "7.99.0"
+ "@sentry/webpack-plugin" "1.21.0"
chalk "3.0.0"
+ resolve "1.22.8"
rollup "2.78.0"
stacktrace-parser "^0.1.10"
- tslib "^2.4.1 || ^1.9.3"
-"@sentry/node@7.61.1":
- version "7.61.1"
- resolved "https://registry.npmjs.org/@sentry/node/-/node-7.61.1.tgz"
- integrity sha512-+crVAeymXdWZcDuwU9xySf4sVv2fHOFlr13XqeXl73q4zqKJM1IX4VUO9On3+jTyGfB5SCAuBBYpzA3ehBfeYw==
+"@sentry/node@7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry/node/-/node-7.99.0.tgz"
+ integrity sha512-34wYtLddnPcQ8qvKq62AfxowaMFw+GMUZGv7fIs9FxeBqqqn6Ckl0gFCTADudIIBQ3rSbmN7sHJIXdyiQv+pcw==
dependencies:
- "@sentry-internal/tracing" "7.61.1"
- "@sentry/core" "7.61.1"
- "@sentry/types" "7.61.1"
- "@sentry/utils" "7.61.1"
- cookie "^0.4.1"
- https-proxy-agent "^5.0.0"
- lru_map "^0.3.3"
- tslib "^2.4.1 || ^1.9.3"
+ "@sentry-internal/tracing" "7.99.0"
+ "@sentry/core" "7.99.0"
+ "@sentry/types" "7.99.0"
+ "@sentry/utils" "7.99.0"
-"@sentry/react@7.61.1":
- version "7.61.1"
- resolved "https://registry.npmjs.org/@sentry/react/-/react-7.61.1.tgz"
- integrity sha512-n8xNT05gdERpETvq3GJZ2lP6HZYLRQQoUDc13egDzKf840MzCjle0LiLmsVhRv8AL1GnWaIPwnvTGvS4BuNlvw==
+"@sentry/react@7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry/react/-/react-7.99.0.tgz"
+ integrity sha512-RtHwgzMHJhzJfSQpVG0SDPQYMTGDX3Q37/YWI59S4ALMbSW4/F6n/eQAvGVYZKbh2UCSqgFuRWaXOYkSZT17wA==
dependencies:
- "@sentry/browser" "7.61.1"
- "@sentry/types" "7.61.1"
- "@sentry/utils" "7.61.1"
+ "@sentry/browser" "7.99.0"
+ "@sentry/core" "7.99.0"
+ "@sentry/types" "7.99.0"
+ "@sentry/utils" "7.99.0"
hoist-non-react-statics "^3.3.2"
- tslib "^2.4.1 || ^1.9.3"
-"@sentry/replay@7.61.1":
- version "7.61.1"
- resolved "https://registry.npmjs.org/@sentry/replay/-/replay-7.61.1.tgz"
- integrity sha512-Nsnnzx8c+DRjnfQ0Md11KGdY21XOPa50T2B3eBEyFAhibvYEc/68PuyVWkMBQ7w9zo/JV+q6HpIXKD0THUtqZA==
+"@sentry/replay@7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry/replay/-/replay-7.99.0.tgz"
+ integrity sha512-gyN/I2WpQrLAZDT+rScB/0jnFL2knEVBo8U8/OVt8gNP20Pq8T/rDZKO/TG0cBfvULDUbJj2P4CJryn2p/O2rA==
dependencies:
- "@sentry/core" "7.61.1"
- "@sentry/types" "7.61.1"
- "@sentry/utils" "7.61.1"
+ "@sentry-internal/tracing" "7.99.0"
+ "@sentry/core" "7.99.0"
+ "@sentry/types" "7.99.0"
+ "@sentry/utils" "7.99.0"
-"@sentry/types@7.61.1":
- version "7.61.1"
- resolved "https://registry.npmjs.org/@sentry/types/-/types-7.61.1.tgz"
- integrity sha512-CpPKL+OfwYOduRX9AT3p+Ie1fftgcCPd5WofTVVq7xeWRuerOOf2iJd0v+8yHQ25omgres1YOttDkCcvQRn4Jw==
+"@sentry/types@7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry/types/-/types-7.99.0.tgz"
+ integrity sha512-94qwOw4w40sAs5mCmzcGyj8ZUu/KhnWnuMZARRq96k+SjRW/tHFAOlIdnFSrt3BLPvSOK7R3bVAskZQ0N4FTmA==
-"@sentry/utils@7.61.1":
- version "7.61.1"
- resolved "https://registry.npmjs.org/@sentry/utils/-/utils-7.61.1.tgz"
- integrity sha512-pUPXoiuYrTEPcBHjRizFB6eZEGm/6cTBwdWSHUjkGKvt19zuZ1ixFJQV6LrIL/AMeiQbmfQ+kTd/8SR7E9rcTQ==
+"@sentry/utils@7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry/utils/-/utils-7.99.0.tgz"
+ integrity sha512-cYZy5WNTkWs5GgggGnjfGqC44CWir0pAv4GVVSx0fsup4D4pMKBJPrtub15f9uC+QkUf3vVkqwpBqeFxtmJQTQ==
dependencies:
- "@sentry/types" "7.61.1"
- tslib "^2.4.1 || ^1.9.3"
+ "@sentry/types" "7.99.0"
-"@sentry/webpack-plugin@1.20.0":
- version "1.20.0"
- resolved "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-1.20.0.tgz"
- integrity sha512-Ssj1mJVFsfU6vMCOM2d+h+KQR7QHSfeIP16t4l20Uq/neqWXZUQ2yvQfe4S3BjdbJXz/X4Rw8Hfy1Sd0ocunYw==
+"@sentry/vercel-edge@7.99.0":
+ version "7.99.0"
+ resolved "https://registry.npmjs.org/@sentry/vercel-edge/-/vercel-edge-7.99.0.tgz"
+ integrity sha512-9Uw3Iuy8KMlcv71ifnaguwndb1NkHeOAbYcBEeq9W+n0f5ocFZvMlnwszSlVNAL3cK+hlpcBhelXNAO/mBWCfg==
dependencies:
- "@sentry/cli" "^1.74.6"
+ "@sentry-internal/tracing" "7.99.0"
+ "@sentry/core" "7.99.0"
+ "@sentry/types" "7.99.0"
+ "@sentry/utils" "7.99.0"
+
+"@sentry/webpack-plugin@1.21.0":
+ version "1.21.0"
+ resolved "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-1.21.0.tgz"
+ integrity sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og==
+ dependencies:
+ "@sentry/cli" "^1.77.1"
webpack-sources "^2.0.0 || ^3.0.0"
"@sinclair/typebox@^0.27.8":
@@ -2387,6 +2413,13 @@
lodash.merge "^4.6.2"
postcss-selector-parser "6.0.10"
+"@tanstack/match-sorter-utils@8.11.7":
+ version "8.11.7"
+ resolved "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.11.7.tgz"
+ integrity sha512-4PUKgaaFpiB7MK406N5VAiLu2VUhDumojGWhEC8kNQ767RGU2vsJDI7Xp4D8lMBzijqswRWz3U8ioa2zUKnFeQ==
+ dependencies:
+ remove-accents "0.4.2"
+
"@tanstack/query-core@5.4.3":
version "5.4.3"
resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.4.3.tgz"
@@ -2792,10 +2825,10 @@
resolved "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.0.tgz"
integrity sha512-qwfpsHmFuhAS/dVd4uBIraMxRd56vwBUYQGZ6GpXnFuM2XMRFJbIyruFKKlW2daQliuYZwe0qfn/UjFCDKic5g==
-"@types/prop-types@*", "@types/prop-types@^15.0.0":
- version "15.7.5"
- resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz"
- integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
+"@types/prop-types@*", "@types/prop-types@^15.0.0", "@types/prop-types@^15.7.11":
+ version "15.7.11"
+ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz"
+ integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==
"@types/react-dom@18.2.7", "@types/react-dom@^18.0.0":
version "18.2.7"
@@ -3266,12 +3299,12 @@ axe-core@^4.6.2:
resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz"
integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==
-axios@1.4.0:
- version "1.4.0"
- resolved "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz"
- integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==
+axios@^1.6.7:
+ version "1.6.7"
+ resolved "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz"
+ integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==
dependencies:
- follow-redirects "^1.15.0"
+ follow-redirects "^1.15.4"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
@@ -3554,6 +3587,11 @@ clsx@2.0.0:
resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz"
integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==
+clsx@^2.0.0, clsx@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb"
+ integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==
+
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
@@ -3626,11 +3664,6 @@ convert-source-map@^1.5.0, convert-source-map@^1.7.0:
resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
-cookie@^0.4.1:
- version "0.4.2"
- resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz"
- integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
-
copy-to-clipboard@^3.3.1:
version "3.3.3"
resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz"
@@ -4036,6 +4069,14 @@ dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9:
resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz"
integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==
+dom-helpers@^5.0.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902"
+ integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
+ dependencies:
+ "@babel/runtime" "^7.8.7"
+ csstype "^3.0.2"
+
dom-mutator@^0.5.0:
version "0.5.0"
resolved "https://registry.npmjs.org/dom-mutator/-/dom-mutator-0.5.0.tgz"
@@ -4706,10 +4747,10 @@ flatted@^3.1.0:
resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz"
integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
-follow-redirects@^1.15.0:
- version "1.15.2"
- resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz"
- integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
+follow-redirects@^1.15.4:
+ version "1.15.5"
+ resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz"
+ integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==
for-each@^0.3.3:
version "0.3.3"
@@ -4816,9 +4857,9 @@ gensync@^1.0.0-beta.2:
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
get-func-name@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz"
- integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz"
+ integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==
get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1:
version "1.2.1"
@@ -5129,6 +5170,11 @@ heroicons@2.0.18:
resolved "https://registry.npmjs.org/heroicons/-/heroicons-2.0.18.tgz"
integrity sha512-3iaqznaz5GJ8Mox/eDfKHo7tYKuPiZV4vbg6pB6wjJhBa7ZKQlXT1KuUnsjkEiPy/ezyiqppOX6wUqYguMIq8w==
+highlight-words@1.2.2:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/highlight-words/-/highlight-words-1.2.2.tgz"
+ integrity sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ==
+
highlight.js@~11.8.0:
version "11.8.0"
resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz"
@@ -5961,6 +6007,16 @@ marked@9.0.3:
resolved "https://registry.npmjs.org/marked/-/marked-9.0.3.tgz"
integrity sha512-pI/k4nzBG1PEq1J3XFEHxVvjicfjl8rgaMaqclouGSMPhk7Q3Ejb2ZRxx/ZQOcQ1909HzVoWCFYq6oLgtL4BpQ==
+material-react-table@^2.10.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/material-react-table/-/material-react-table-2.10.0.tgz#1189fa6b4e6725553438683ac8de2ccf721f48f8"
+ integrity sha512-khKm/AMuLp6zV/Lj7ttdTy59cNXuEc0LyD6jh6GydslEWMHqasn4PKElGQKDnO+u5AInB+CzoK1U4zTOqRiIlQ==
+ dependencies:
+ "@tanstack/match-sorter-utils" "8.11.7"
+ "@tanstack/react-table" "8.11.7"
+ "@tanstack/react-virtual" "3.0.2"
+ highlight-words "1.2.2"
+
mdast-util-definitions@^5.0.0:
version "5.1.2"
resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz"
@@ -7074,7 +7130,7 @@ promise-retry@^2.0.1:
err-code "^2.0.2"
retry "^0.12.0"
-prop-types@^15.0.0, prop-types@^15.7.2, prop-types@^15.8.1:
+prop-types@^15.0.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -7350,7 +7406,7 @@ react-is@^17.0.1:
resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz"
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
-react-is@^18.0.0:
+react-is@^18.0.0, react-is@^18.2.0:
version "18.2.0"
resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz"
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
@@ -7409,6 +7465,16 @@ react-style-singleton@^2.2.1:
invariant "^2.2.4"
tslib "^2.0.0"
+react-transition-group@^4.4.5:
+ version "4.4.5"
+ resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
+ integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ dom-helpers "^5.0.1"
+ loose-envify "^1.4.0"
+ prop-types "^15.6.2"
+
react-universal-interface@^0.6.2:
version "0.6.2"
resolved "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz"
@@ -7484,10 +7550,10 @@ reflect.getprototypeof@^1.0.4:
globalthis "^1.0.3"
which-builtin-type "^1.1.3"
-regenerator-runtime@^0.13.11:
- version "0.13.11"
- resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz"
- integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
+regenerator-runtime@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
regexp.prototype.flags@^1.5.0:
version "1.5.0"
@@ -7537,6 +7603,11 @@ remark-rehype@^10.0.0:
mdast-util-to-hast "^12.1.0"
unified "^10.0.0"
+remove-accents@0.4.2:
+ version "0.4.2"
+ resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz"
+ integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==
+
requires-port@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz"
@@ -7557,10 +7628,10 @@ resolve-pkg-maps@^1.0.0:
resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz"
integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==
-resolve@^1.1.7, resolve@^1.19.0, resolve@^1.22.2, resolve@^1.22.4:
- version "1.22.4"
- resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz"
- integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==
+resolve@1.22.8, resolve@^1.1.7, resolve@^1.19.0, resolve@^1.22.2, resolve@^1.22.4:
+ version "1.22.8"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
dependencies:
is-core-module "^2.13.0"
path-parse "^1.0.7"
@@ -7727,10 +7798,10 @@ set-harmonic-interval@^1.0.1:
resolved "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz"
integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==
-sharp@0.32.4:
- version "0.32.4"
- resolved "https://registry.npmjs.org/sharp/-/sharp-0.32.4.tgz"
- integrity sha512-exUnZewqVZC6UXqXuQ8fyJJv0M968feBi04jb9GcUHrWtkRoAKnbJt8IfwT4NJs7FskArbJ14JAFGVuooszoGg==
+sharp@^0.32.6:
+ version "0.32.6"
+ resolved "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz"
+ integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==
dependencies:
color "^4.2.3"
detect-libc "^2.0.2"