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 ( 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 (
- +
- } - isOpen={isLogoutModalOpened} - setOpen={setIsLogoutModalOpened} - CloseTrigger={
} - > -
-

- {t("areYouSure", { ns: "logout" })} -

-
- - -
-
- - ); -}; 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"