diff --git a/apps/portal/package.json b/apps/portal/package.json
index e51165fa21e..c4c98301222 100644
--- a/apps/portal/package.json
+++ b/apps/portal/package.json
@@ -25,9 +25,11 @@
"@next/mdx": "15.3.2",
"@radix-ui/react-dialog": "1.1.10",
"@radix-ui/react-dropdown-menu": "^2.1.11",
+ "@radix-ui/react-popover": "^1.1.10",
"@radix-ui/react-select": "^2.2.2",
"@radix-ui/react-slot": "^1.2.0",
"@radix-ui/react-tabs": "^1.1.8",
+ "@radix-ui/react-tooltip": "1.2.3",
"@tanstack/react-query": "5.74.4",
"@tryghost/content-api": "^1.11.22",
"class-variance-authority": "^0.7.1",
diff --git a/apps/portal/src/app/globals.css b/apps/portal/src/app/globals.css
index fd60cbe43f9..c43bb51ad8c 100644
--- a/apps/portal/src/app/globals.css
+++ b/apps/portal/src/app/globals.css
@@ -47,6 +47,7 @@ html {
--success-text: 142.09 70.56% 35.29%;
--warning-text: 38 92% 40%;
--destructive-text: 357.15deg 100% 68.72%;
+ --nebula-pink-foreground: 321 90% 51%;
/* Borders */
--border: 0 0% 85%;
@@ -83,6 +84,7 @@ html {
--destructive-text: 360 72% 55%;
--success-text: 142 75% 50%;
--inverted-foreground: 0 0% 0%;
+ --nebula-pink-foreground: 321 90% 51%;
/* Borders */
--border: 0 0% 15%;
@@ -159,3 +161,11 @@ button {
.hide-scrollbar::-webkit-scrollbar {
display: none; /* Safari and Chrome */
}
+
+.no-scrollbar {
+ scrollbar-width: none; /* Firefox */
+}
+
+.no-scrollbar::-webkit-scrollbar {
+ display: none; /* Safari and Chrome */
+}
diff --git a/apps/portal/src/app/layout.tsx b/apps/portal/src/app/layout.tsx
index 15943c55928..28457390249 100644
--- a/apps/portal/src/app/layout.tsx
+++ b/apps/portal/src/app/layout.tsx
@@ -6,6 +6,8 @@ import { Fira_Code, Inter } from "next/font/google";
import Script from "next/script";
import NextTopLoader from "nextjs-toploader";
import { StickyTopContainer } from "../components/Document/StickyTopContainer";
+import { CustomChatButton } from "../components/SiwaChat/CustomChatButton";
+import { examplePrompts } from "../components/SiwaChat/examplePrompts";
import { Banner } from "../components/others/Banner";
import { EnableSmoothScroll } from "../components/others/SmoothScroll";
import { PHProvider } from "../lib/posthog/Posthog";
@@ -67,6 +69,17 @@ export default function RootLayout({
/>
+ {/* Siwa AI Chat Widget Floating Button */}
+
+
{/* Note: Please change id as well when changing text or href so that new banner is shown to user even if user dismissed the older one */}
diff --git a/apps/portal/src/components/SiwaChat/ChatBar.tsx b/apps/portal/src/components/SiwaChat/ChatBar.tsx
new file mode 100644
index 00000000000..f77ca9d41f4
--- /dev/null
+++ b/apps/portal/src/components/SiwaChat/ChatBar.tsx
@@ -0,0 +1,212 @@
+"use client";
+
+import { ArrowUpIcon, CircleStopIcon } from "lucide-react";
+import { useState } from "react";
+import { cn } from "../../lib/utils";
+// NOTE: You will need to update these imports to match your portal's structure or stub them if not available
+import { Button } from "../ui/button";
+import { AutoResizeTextarea } from "../ui/textarea";
+import type { NebulaUserMessage } from "./types";
+
+// Define proper TypeScript interfaces
+interface ChatContext {
+ chainId?: number;
+ contractAddress?: string;
+ functionName?: string;
+ parameters?: Record;
+ [key: string]: unknown;
+}
+
+interface ConnectedWallet {
+ address: string;
+ walletId: string;
+ chainId?: number;
+ isActive?: boolean;
+}
+
+// Props interfaces for better organization
+interface MessageHandlingProps {
+ sendMessage: (message: NebulaUserMessage) => void;
+ prefillMessage?: string;
+ placeholder: string;
+}
+
+interface ChatStateProps {
+ isChatStreaming: boolean;
+ abortChatStream: () => void;
+ isConnectingWallet: boolean;
+}
+
+interface WalletProps {
+ connectedWallets: ConnectedWallet[];
+ setActiveWallet: (wallet: ConnectedWallet) => void;
+}
+
+interface ContextProps {
+ context: ChatContext | undefined;
+ setContext: (context: ChatContext | undefined) => void;
+ showContextSelector: boolean;
+}
+
+interface UIProps {
+ className?: string;
+ onLoginClick?: () => void;
+}
+
+// Combined props interface
+interface ChatBarProps
+ extends MessageHandlingProps,
+ ChatStateProps,
+ Partial,
+ Partial,
+ UIProps {}
+
+export function ChatBar(props: ChatBarProps) {
+ const [message, setMessage] = useState(props.prefillMessage || "");
+
+ const handleSendMessage = () => {
+ if (message.trim() === "") return;
+
+ const userMessage: NebulaUserMessage = {
+ role: "user",
+ content: [{ type: "text", text: message }],
+ };
+
+ props.sendMessage(userMessage);
+ setMessage("");
+ };
+
+ return (
+
+ );
+}
+
+// Updated MessageInput component
+interface MessageInputProps {
+ message: string;
+ setMessage: (message: string) => void;
+ placeholder: string;
+ isChatStreaming: boolean;
+ onSend: () => void;
+}
+
+function MessageInput({
+ message,
+ setMessage,
+ placeholder,
+ isChatStreaming,
+ onSend,
+}: MessageInputProps) {
+ return (
+
+
setMessage(e.target.value)}
+ onKeyDown={(e) => {
+ if (e.shiftKey) return;
+ if (e.key === "Enter" && !isChatStreaming) {
+ e.preventDefault();
+ onSend();
+ }
+ }}
+ className="min-h-[60px] resize-none border-none bg-transparent pt-2 leading-relaxed focus-visible:ring-0 focus-visible:ring-offset-0"
+ disabled={isChatStreaming}
+ />
+
+ );
+}
+
+// Updated ChatActions component
+interface ChatActionsProps {
+ isChatStreaming: boolean;
+ isConnectingWallet: boolean;
+ abortChatStream: () => void;
+ onSendMessage: () => void;
+ canSend: boolean;
+}
+
+function ChatActions({
+ isChatStreaming,
+ isConnectingWallet,
+ abortChatStream,
+ onSendMessage,
+ canSend,
+}: ChatActionsProps) {
+ return (
+
+
+
+ {isChatStreaming ? (
+
+ ) : (
+
+ )}
+
+
+ );
+}
+
+// Decomposed component for stop button
+interface StopButtonProps {
+ onStop: () => void;
+}
+
+function StopButton({ onStop }: StopButtonProps) {
+ return (
+
+ );
+}
+
+// Decomposed component for send button
+interface SendButtonProps {
+ onSend: () => void;
+ disabled: boolean;
+}
+
+function SendButton({ onSend, disabled }: SendButtonProps) {
+ return (
+
+ );
+}
diff --git a/apps/portal/src/components/SiwaChat/Chats.tsx b/apps/portal/src/components/SiwaChat/Chats.tsx
new file mode 100644
index 00000000000..46d8a91237b
--- /dev/null
+++ b/apps/portal/src/components/SiwaChat/Chats.tsx
@@ -0,0 +1,154 @@
+import { NebulaIcon } from "@/icons";
+import { useEffect, useRef } from "react";
+import { cn } from "../../lib/utils";
+import { ScrollShadow } from "../others/ScrollShadow/ScrollShadow";
+import type { NebulaUserMessageContent } from "./types";
+
+export type ChatMessage =
+ | {
+ type: "user";
+ content: NebulaUserMessageContent;
+ }
+ | {
+ texts: string[];
+ type: "presence";
+ }
+ | {
+ request_id: string | undefined;
+ text: string;
+ type: "assistant";
+ };
+
+export function Chats(props: {
+ messages: Array;
+ className?: string;
+ setEnableAutoScroll: (enable: boolean) => void;
+ enableAutoScroll: boolean;
+ useSmallText?: boolean;
+}) {
+ const { messages, setEnableAutoScroll, enableAutoScroll } = props;
+ const scrollAnchorRef = useRef(null);
+ const chatContainerRef = useRef(null);
+
+ useEffect(() => {
+ if (!enableAutoScroll || messages.length === 0) {
+ return;
+ }
+ scrollAnchorRef.current?.scrollIntoView({ behavior: "smooth" });
+ }, [messages, enableAutoScroll]);
+
+ useEffect(() => {
+ if (!enableAutoScroll) {
+ return;
+ }
+ const chatScrollContainer =
+ chatContainerRef.current?.querySelector("[data-scrollable]");
+ if (!chatScrollContainer) {
+ return;
+ }
+ const disableScroll = () => {
+ setEnableAutoScroll(false);
+ chatScrollContainer.removeEventListener("mousedown", disableScroll);
+ chatScrollContainer.removeEventListener("wheel", disableScroll);
+ };
+ chatScrollContainer.addEventListener("mousedown", disableScroll);
+ chatScrollContainer.addEventListener("wheel", disableScroll);
+
+ return () => {
+ chatScrollContainer.removeEventListener("mousedown", disableScroll);
+ chatScrollContainer.removeEventListener("wheel", disableScroll);
+ };
+ }, [setEnableAutoScroll, enableAutoScroll]);
+
+ return (
+
+
+
+
+ {props.messages.map((message, index) => {
+ const shouldHideMessage =
+ message.type === "user" &&
+ message.content.every((msg) => msg.type === "transaction");
+ if (shouldHideMessage) {
+ return null;
+ }
+
+ // Create a unique key based on message content and position
+ const messageKey =
+ message.type === "user"
+ ? `user-${index}-${message.content[0]?.type === "text" ? message.content[0].text.slice(0, 50) : "unknown"}`
+ : message.type === "assistant"
+ ? `assistant-${index}-${message.text?.slice(0, 50) || "empty"}`
+ : `${message.type}-${index}`;
+
+ return (
+
+
+
+ );
+ })}
+
+
+
+
+
+ );
+}
+
+function RenderMessage(props: {
+ message: ChatMessage;
+}) {
+ if (props.message.type === "user") {
+ return (
+
+ {props.message.content.map((msg, index) => {
+ if (msg.type === "text") {
+ // Create unique key based on content type and text
+ const contentKey = `${msg.type}-${msg.text.slice(0, 100)}-${index}`;
+ return (
+
+ );
+ }
+ return null;
+ })}
+
+ );
+ }
+ if (props.message.type === "assistant") {
+ return (
+
+
+
+
+
+ {props.message.text}
+
+
+
+
+ );
+ }
+ return null;
+}
diff --git a/apps/portal/src/components/SiwaChat/CustomChatButton.tsx b/apps/portal/src/components/SiwaChat/CustomChatButton.tsx
new file mode 100644
index 00000000000..f7b994fc193
--- /dev/null
+++ b/apps/portal/src/components/SiwaChat/CustomChatButton.tsx
@@ -0,0 +1,99 @@
+"use client";
+
+import { MessageCircleIcon, XIcon } from "lucide-react";
+import { useCallback, useRef, useState } from "react";
+import { cn } from "../../lib/utils";
+import { Button } from "../ui/button";
+import CustomChatContent from "./CustomChatContent";
+
+interface CustomApiParams {
+ apiUrl?: string;
+ apiKey?: string;
+ timeout?: number;
+ retryAttempts?: number;
+ [key: string]: unknown; // Allow additional custom parameters
+}
+
+export function CustomChatButton(props: {
+ isLoggedIn?: boolean;
+ networks: "mainnet" | "testnet" | "all" | null;
+ pageType: "chain" | "contract" | "support";
+ label: string;
+ customApiParams: CustomApiParams;
+ examplePrompts: { title: string; message: string }[];
+ authToken: string | undefined;
+ requireLogin?: boolean;
+}) {
+ const [isOpen, setIsOpen] = useState(false);
+ const [hasBeenOpened, setHasBeenOpened] = useState(false);
+ const [isDismissed, _setIsDismissed] = useState(false);
+ const closeModal = useCallback(() => setIsOpen(false), []);
+ const ref = useRef(null);
+
+ if (isDismissed) {
+ return null;
+ }
+
+ return (
+ <>
+ {/* Floating Button (hide when modal is open) */}
+ {!isOpen && (
+
+ )}
+
+ {/* Popup/Modal */}
+
+ {/* Header with close button */}
+
+
+
+ {props.label}
+
+
+
+ {/* Chat Content */}
+
+ {hasBeenOpened && isOpen && (
+
+ )}
+
+
+ >
+ );
+}
diff --git a/apps/portal/src/components/SiwaChat/CustomChatContent.tsx b/apps/portal/src/components/SiwaChat/CustomChatContent.tsx
new file mode 100644
index 00000000000..23e68a788f3
--- /dev/null
+++ b/apps/portal/src/components/SiwaChat/CustomChatContent.tsx
@@ -0,0 +1,214 @@
+"use client";
+import { NebulaIcon } from "@/icons";
+import { useCallback, useState } from "react";
+import { Button } from "../ui/button";
+import { ChatBar } from "./ChatBar";
+import { Chats } from "./Chats";
+import type { ChatMessage } from "./Chats";
+import type { ExamplePrompt } from "./examplePrompts";
+import type { NebulaUserMessage } from "./types";
+
+export default function CustomChatContent(props: {
+ examplePrompts: ExamplePrompt[];
+ networks: "mainnet" | "testnet" | "all" | null;
+ requireLogin?: boolean;
+}) {
+ // No login required for portal
+ return (
+
+ );
+}
+
+function CustomChatContentLoggedIn(props: {
+ examplePrompts: ExamplePrompt[];
+ networks: "mainnet" | "testnet" | "all" | null;
+}) {
+ const [userHasSubmittedMessage, setUserHasSubmittedMessage] = useState(false);
+ const [messages, setMessages] = useState>([]);
+ const [sessionId, setSessionId] = useState(undefined);
+ const [chatAbortController, setChatAbortController] = useState<
+ AbortController | undefined
+ >();
+ const [isChatStreaming, setIsChatStreaming] = useState(false);
+ const [enableAutoScroll, setEnableAutoScroll] = useState(false);
+
+ const handleSendMessage = useCallback(
+ async (userMessage: NebulaUserMessage) => {
+ const abortController = new AbortController();
+ setUserHasSubmittedMessage(true);
+ setIsChatStreaming(true);
+ setEnableAutoScroll(true);
+
+ setMessages((prev) => [
+ ...prev,
+ {
+ type: "user",
+ content: userMessage.content,
+ },
+ {
+ type: "presence",
+ texts: [],
+ },
+ ]);
+
+ const messageToSend = {
+ ...userMessage,
+ content: [...userMessage.content],
+ } as NebulaUserMessage;
+
+ try {
+ setChatAbortController(abortController);
+ const payload = {
+ message:
+ messageToSend.content.find((x) => x.type === "text")?.text ?? "",
+ conversationId: sessionId,
+ };
+ const apiUrl = process.env.NEXT_PUBLIC_SIWA_URL;
+ if (!apiUrl) {
+ throw new Error(
+ "API URL is not configured. Please set NEXT_PUBLIC_SIWA_URL environment variable.",
+ );
+ }
+ const response = await fetch(`${apiUrl}/v1/chat`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(payload),
+ signal: abortController.signal,
+ });
+ if (!response.ok) {
+ const errorText = await response
+ .text()
+ .catch(() => "No error details available");
+ throw new Error(
+ `HTTP error! Status: ${response.status}. Details: ${errorText}`,
+ );
+ }
+ const data = await response.json();
+ if (!data || typeof data.data !== "string") {
+ throw new Error("Invalid response format from API");
+ }
+ if (data.conversationId && data.conversationId !== sessionId) {
+ setSessionId(data.conversationId);
+ }
+ setMessages((prev) => [
+ ...prev.slice(0, -1),
+ {
+ type: "assistant",
+ request_id: undefined,
+ text: data.data,
+ },
+ ]);
+ } catch (error) {
+ if (abortController.signal.aborted) {
+ return;
+ }
+ setMessages((prev) => [
+ ...prev.slice(0, -1),
+ {
+ type: "assistant",
+ request_id: undefined,
+ text: `Sorry, something went wrong. ${error instanceof Error ? error.message : "Unknown error"}`,
+ },
+ ]);
+ } finally {
+ setIsChatStreaming(false);
+ setEnableAutoScroll(false);
+ }
+ },
+ [sessionId],
+ );
+
+ const showEmptyState = !userHasSubmittedMessage && messages.length === 0;
+ return (
+
+ {showEmptyState ? (
+
+ ) : (
+
+ )}
+ {}}
+ showContextSelector={false}
+ connectedWallets={[]}
+ setActiveWallet={() => {}}
+ abortChatStream={() => {
+ chatAbortController?.abort();
+ setChatAbortController(undefined);
+ setIsChatStreaming(false);
+ if (messages[messages.length - 1]?.type === "presence") {
+ setMessages((prev) => prev.slice(0, -1));
+ }
+ }}
+ isChatStreaming={isChatStreaming}
+ prefillMessage={undefined}
+ sendMessage={handleSendMessage}
+ className="rounded-none border-x-0 border-b-0"
+ />
+
+ );
+}
+
+function EmptyStateChatPageContent(props: {
+ sendMessage: (message: NebulaUserMessage) => void;
+ examplePrompts: ExamplePrompt[];
+}) {
+ return (
+
+
+
+
+ How can I help you
+ today?
+
+
+
+
+ {props.examplePrompts.map((prompt) => (
+
+ ))}
+
+
+ );
+}
diff --git a/apps/portal/src/components/SiwaChat/examplePrompts.ts b/apps/portal/src/components/SiwaChat/examplePrompts.ts
new file mode 100644
index 00000000000..27b415d5e39
--- /dev/null
+++ b/apps/portal/src/components/SiwaChat/examplePrompts.ts
@@ -0,0 +1,30 @@
+export type ExamplePrompt = {
+ title: string;
+ message: string;
+ interceptedReply?: string;
+};
+
+export const examplePrompts: ExamplePrompt[] = [
+ {
+ title:
+ "How do I add in-app wallet with sign in with google to my react app?",
+ message:
+ "How do I add in-app wallet with sign in with google to my react app?",
+ },
+ {
+ title: "How do I send a transaction in Unity?",
+ message: "How do I send a transaction in Unity?",
+ },
+ {
+ title: "What does this contract revert error mean?",
+ message: "What does this contract revert error mean?",
+ },
+ {
+ title: "I see thirdweb support id in my console log, can you help me?",
+ message: "I see thirdweb support id in my console log, can you help me?",
+ },
+ {
+ title: "Here is my code, can you tell me why I'm seeing this error?",
+ message: "Here is my code, can you tell me why I'm seeing this error?",
+ },
+];
diff --git a/apps/portal/src/components/SiwaChat/types.ts b/apps/portal/src/components/SiwaChat/types.ts
new file mode 100644
index 00000000000..9cb49c5cbf6
--- /dev/null
+++ b/apps/portal/src/components/SiwaChat/types.ts
@@ -0,0 +1,67 @@
+type SessionContextFilter = {
+ chain_ids: string[] | null;
+ wallet_address: string | null;
+};
+
+type NebulaUserMessageContentItem =
+ | {
+ type: "text";
+ text: string;
+ }
+ | {
+ type: "transaction";
+ transaction_hash: string;
+ chain_id: number;
+ };
+
+export type NebulaUserMessageContent = NebulaUserMessageContentItem[];
+
+export type NebulaUserMessage = {
+ role: "user";
+ content: NebulaUserMessageContent;
+};
+
+export type NebulaSessionHistoryMessage =
+ | {
+ role: "assistant" | "action";
+ content: string;
+ timestamp: number;
+ }
+ | {
+ role: "user";
+ content: NebulaUserMessageContent | string;
+ };
+
+export type SessionInfo = {
+ id: string;
+ account_id: string;
+ modal_name: string;
+ can_execute: boolean;
+ created_at: string;
+ updated_at: string;
+ deleted_at: string | null;
+ archived_at: string | null;
+ history: Array | null;
+ title: string | null;
+ is_public: boolean | null;
+ context: SessionContextFilter | null;
+};
+
+export type UpdatedSessionInfo = {
+ title: string;
+ modal_name: string;
+ account_id: string;
+ context: SessionContextFilter | null;
+};
+
+export type DeletedSessionInfo = {
+ id: string;
+ deleted_at: string;
+};
+
+export type TruncatedSessionInfo = {
+ created_at: string;
+ id: string;
+ updated_at: string;
+ title: string | null;
+};
diff --git a/apps/portal/src/components/others/ScrollShadow/ScrollShadow.tsx b/apps/portal/src/components/others/ScrollShadow/ScrollShadow.tsx
index b9ebac181b6..932c909bc9d 100644
--- a/apps/portal/src/components/others/ScrollShadow/ScrollShadow.tsx
+++ b/apps/portal/src/components/others/ScrollShadow/ScrollShadow.tsx
@@ -1,7 +1,8 @@
"use client";
-import { cn } from "@/lib/utils";
-import { useEffect, useRef } from "react";
+import { useRef } from "react";
+import { useIsomorphicLayoutEffect } from "../../../lib/useIsomorphicLayoutEffect";
+import { cn } from "../../../lib/utils";
import styles from "./ScrollShadow.module.css";
export function ScrollShadow(props: {
@@ -19,7 +20,7 @@ export function ScrollShadow(props: {
const shadowRightEl = useRef(null);
const wrapperEl = useRef(null);
- useEffect(() => {
+ useIsomorphicLayoutEffect(() => {
const content = scrollableEl.current;
const shadowTop = shadowTopEl.current;
const shadowBottom = shadowBottomEl.current;
@@ -139,10 +140,7 @@ export function ScrollShadow(props: {
}}
/>
diff --git a/apps/portal/src/components/ui/button.tsx b/apps/portal/src/components/ui/button.tsx
index 61614702b1c..f867d915d68 100644
--- a/apps/portal/src/components/ui/button.tsx
+++ b/apps/portal/src/components/ui/button.tsx
@@ -19,6 +19,7 @@ const buttonVariants = cva(
"bg-secondary hover:bg-secondary/80 text-secondary-foreground ",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline",
+ pink: "border border-nebula-pink-foreground !text-nebula-pink-foreground bg-[hsl(var(--nebula-pink-foreground)/5%)] hover:bg-nebula-pink-foreground/10 dark:!text-foreground dark:bg-nebula-pink-foreground/10 dark:hover:bg-nebula-pink-foreground/20",
upsell:
"bg-gradient-to-r from-purple-500 to-pink-500 text-white hover:from-purple-600 hover:to-pink-600 shadow-lg hover:shadow-xl transform hover:-translate-y-0.5 transition-all duration-200",
},
diff --git a/apps/portal/src/components/ui/popover.tsx b/apps/portal/src/components/ui/popover.tsx
new file mode 100644
index 00000000000..001b1630857
--- /dev/null
+++ b/apps/portal/src/components/ui/popover.tsx
@@ -0,0 +1,31 @@
+"use client";
+
+import * as PopoverPrimitive from "@radix-ui/react-popover";
+import * as React from "react";
+
+import { cn } from "../../lib/utils";
+
+const Popover = PopoverPrimitive.Root;
+
+const PopoverTrigger = PopoverPrimitive.Trigger;
+
+const PopoverContent = React.forwardRef<
+ React.ElementRef
,
+ React.ComponentPropsWithoutRef
+>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
+
+
+
+));
+PopoverContent.displayName = PopoverPrimitive.Content.displayName;
+
+export { Popover, PopoverTrigger, PopoverContent };
diff --git a/apps/portal/src/components/ui/textarea.tsx b/apps/portal/src/components/ui/textarea.tsx
new file mode 100644
index 00000000000..520e9db4f34
--- /dev/null
+++ b/apps/portal/src/components/ui/textarea.tsx
@@ -0,0 +1,47 @@
+import * as React from "react";
+
+import { cn } from "../../lib/utils";
+
+export interface TextareaProps
+ extends React.TextareaHTMLAttributes {}
+
+const Textarea = React.forwardRef(
+ ({ className, ...props }, ref) => {
+ return (
+
+ );
+ },
+);
+Textarea.displayName = "Textarea";
+
+export { Textarea };
+
+export function AutoResizeTextarea(props: TextareaProps) {
+ const textareaRef = React.useRef(null);
+
+ React.useEffect(() => {
+ const textarea = textareaRef.current;
+ if (textarea) {
+ textarea.style.height = "auto";
+ textarea.style.height = `${textarea.scrollHeight}px`;
+ }
+ });
+
+ return (
+
+ );
+}
diff --git a/apps/portal/src/components/ui/tooltip.tsx b/apps/portal/src/components/ui/tooltip.tsx
new file mode 100644
index 00000000000..39d651daf27
--- /dev/null
+++ b/apps/portal/src/components/ui/tooltip.tsx
@@ -0,0 +1,70 @@
+"use client";
+
+import * as TooltipPrimitive from "@radix-ui/react-tooltip";
+import * as React from "react";
+
+import { cn } from "../../lib/utils";
+
+const TooltipProvider = TooltipPrimitive.Provider;
+
+const Tooltip = TooltipPrimitive.Root;
+
+const TooltipTrigger = TooltipPrimitive.Trigger;
+
+const TooltipContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+));
+TooltipContent.displayName = TooltipPrimitive.Content.displayName;
+
+export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
+
+export function TooltipLabel(props: {
+ children: React.ReactNode;
+ label: React.ReactNode;
+ rightIcon?: React.ReactNode;
+ leftIcon?: React.ReactNode;
+ hoverable?: boolean;
+ contentClassName?: string;
+ side?: "top" | "right" | "bottom" | "left";
+ align?: "center" | "start" | "end";
+}) {
+ if (!props.label) {
+ return props.children;
+ }
+
+ return (
+
+
+
+ {props.children}
+
+
+
+ {props.leftIcon}
+ {props.label}
+ {props.rightIcon}
+
+
+
+
+ );
+}
diff --git a/apps/portal/src/icons/NebulaIcon.tsx b/apps/portal/src/icons/NebulaIcon.tsx
new file mode 100644
index 00000000000..bfd2636bf1b
--- /dev/null
+++ b/apps/portal/src/icons/NebulaIcon.tsx
@@ -0,0 +1,24 @@
+export function NebulaIcon(props: { className?: string }) {
+ return (
+
+ );
+}
diff --git a/apps/portal/src/icons/index.ts b/apps/portal/src/icons/index.ts
index 0fca6590c9b..be4d82e4740 100644
--- a/apps/portal/src/icons/index.ts
+++ b/apps/portal/src/icons/index.ts
@@ -22,5 +22,8 @@ export { WalletsSmartIcon } from "./products/wallets/WalletsSmartIcon";
//sidebar
export { NebulaSideIcon } from "./sidebar/NebulaSideIcon";
+// nebula chat
+export { NebulaIcon } from "./NebulaIcon";
+
// general purposes
export { ExternalLinkIcon } from "./ExternalLinkIcon";
diff --git a/apps/portal/src/lib/useIsomorphicLayoutEffect.ts b/apps/portal/src/lib/useIsomorphicLayoutEffect.ts
new file mode 100644
index 00000000000..ea6a0bc0166
--- /dev/null
+++ b/apps/portal/src/lib/useIsomorphicLayoutEffect.ts
@@ -0,0 +1,4 @@
+import { useEffect, useLayoutEffect } from "react";
+
+export const useIsomorphicLayoutEffect =
+ typeof window !== "undefined" ? useLayoutEffect : useEffect;
diff --git a/apps/portal/tailwind.config.ts b/apps/portal/tailwind.config.ts
index 081e1250c07..69ff4524272 100644
--- a/apps/portal/tailwind.config.ts
+++ b/apps/portal/tailwind.config.ts
@@ -36,6 +36,9 @@ module.exports = {
lg: "var(--radius)",
md: "calc(var(--radius) - 2px)",
sm: "calc(var(--radius) - 4px)",
+ xl: "calc(var(--radius) + 4px)",
+ "2xl": "1rem",
+ "3xl": "1.5rem",
full: "9999px",
none: "0",
},
@@ -77,6 +80,9 @@ module.exports = {
DEFAULT: "hsl(var(--muted))",
foreground: "hsl(var(--muted-foreground))",
},
+ "nebula-pink": {
+ foreground: "hsl(var(--nebula-pink-foreground))",
+ },
accent: {
DEFAULT: "hsl(var(--accent))",
foreground: "hsl(var(--accent-foreground))",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5fe4394f50d..2f6d53eb0da 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -135,7 +135,7 @@ importers:
version: 0.6.19(@hyperjump/browser@1.3.0)(axios@1.9.0)(idb-keyval@6.2.1)(nprogress@0.2.0)(qrcode@1.5.4)(react@19.1.0)(tailwindcss@3.4.17)(typescript@5.8.3)
'@sentry/nextjs':
specifier: 9.13.0
- version: 9.13.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.9(esbuild@0.25.4))
+ version: 9.13.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.9)
'@shazow/whatsabi':
specifier: 0.21.0
version: 0.21.0(@noble/hashes@1.8.0)(typescript@5.8.3)(zod@3.24.3)
@@ -219,7 +219,7 @@ importers:
version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
nextjs-toploader:
specifier: ^1.6.12
- version: 1.6.12(next@15.3.2(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ version: 1.6.12(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
nuqs:
specifier: ^2.4.3
version: 2.4.3(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)
@@ -349,7 +349,7 @@ importers:
version: 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))
'@storybook/nextjs':
specifier: 8.6.14
- version: 8.6.14(esbuild@0.25.4)(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(esbuild@0.25.4))
+ version: 8.6.14(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9)
'@storybook/react':
specifier: 8.6.14
version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)
@@ -415,7 +415,7 @@ importers:
version: 5.56.0(@types/node@22.14.1)(typescript@5.8.3)
next-sitemap:
specifier: ^4.2.3
- version: 4.2.3(next@15.3.2(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))
+ version: 4.2.3(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))
postcss:
specifier: 8.5.3
version: 8.5.3
@@ -581,7 +581,7 @@ importers:
version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
nextjs-toploader:
specifier: ^1.6.12
- version: 1.6.12(next@15.3.2(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ version: 1.6.12(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
openapi-types:
specifier: ^12.1.3
version: 12.1.3
@@ -682,6 +682,9 @@ importers:
'@radix-ui/react-dropdown-menu':
specifier: ^2.1.11
version: 2.1.11(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-popover':
+ specifier: ^1.1.10
+ version: 1.1.10(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@radix-ui/react-select':
specifier: ^2.2.2
version: 2.2.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -691,6 +694,9 @@ importers:
'@radix-ui/react-tabs':
specifier: ^1.1.8
version: 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-tooltip':
+ specifier: 1.2.3
+ version: 1.2.3(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@tanstack/react-query':
specifier: 5.74.4
version: 5.74.4(react@19.1.0)
@@ -726,7 +732,7 @@ importers:
version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
nextjs-toploader:
specifier: ^1.6.12
- version: 1.6.12(next@15.3.2(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ version: 1.6.12(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
node-html-markdown:
specifier: ^1.3.0
version: 1.3.0
@@ -829,7 +835,7 @@ importers:
version: 5.56.0(@types/node@22.14.1)(typescript@5.8.3)
next-sitemap:
specifier: ^4.2.3
- version: 4.2.3(next@15.3.2(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))
+ version: 4.2.3(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))
postcss:
specifier: 8.5.3
version: 8.5.3
@@ -1071,7 +1077,7 @@ importers:
version: 22.14.1
'@vitest/coverage-v8':
specifier: 3.1.2
- version: 3.1.2(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.14.1)(@vitest/ui@3.1.4)(happy-dom@17.4.7)(jiti@2.4.2)(lightningcss@1.30.1)(msw@2.8.4(@types/node@22.14.1)(typescript@5.8.3))(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))
+ version: 3.1.2(vitest@3.1.4)
typescript:
specifier: 5.8.3
version: 5.8.3
@@ -1183,7 +1189,7 @@ importers:
version: 3.2.6(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))
'@codspeed/vitest-plugin':
specifier: 4.0.1
- version: 4.0.1(vite@6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.20)(@vitest/ui@3.1.4)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.15.20)(typescript@5.8.3))(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))
+ version: 4.0.1(vite@6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.1.4)
'@coinbase/wallet-mobile-sdk':
specifier: 1.1.2
version: 1.1.2(expo@53.0.9(@babel/core@7.27.1)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.78.1(@babel/core@7.27.1)(@babel/preset-env@7.27.2(@babel/core@7.27.1))(@types/react@19.1.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(utf-8-validate@5.0.10))(react-native@0.78.1(@babel/core@7.27.1)(@babel/preset-env@7.27.2(@babel/core@7.27.1))(@types/react@19.1.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)
@@ -1195,7 +1201,7 @@ importers:
version: 2.1.2(react-native@0.78.1(@babel/core@7.27.1)(@babel/preset-env@7.27.2(@babel/core@7.27.1))(@types/react@19.1.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))
'@size-limit/preset-big-lib':
specifier: 11.2.0
- version: 11.2.0(bufferutil@4.0.9)(size-limit@11.2.0)(utf-8-validate@5.0.10)
+ version: 11.2.0(bufferutil@4.0.9)(esbuild@0.25.4)(size-limit@11.2.0)(utf-8-validate@5.0.10)
'@storybook/addon-essentials':
specifier: 8.6.14
version: 8.6.14(@types/react@19.1.4)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))
@@ -1243,7 +1249,7 @@ importers:
version: 4.4.1(vite@6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))
'@vitest/coverage-v8':
specifier: 3.1.2
- version: 3.1.2(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.20)(@vitest/ui@3.1.4)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.15.20)(typescript@5.8.3))(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))
+ version: 3.1.2(vitest@3.1.4)
'@vitest/ui':
specifier: 3.1.4
version: 3.1.4(vitest@3.1.4)
@@ -18438,7 +18444,7 @@ snapshots:
transitivePeerDependencies:
- debug
- '@codspeed/vitest-plugin@4.0.1(vite@6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.20)(@vitest/ui@3.1.4)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.15.20)(typescript@5.8.3))(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))':
+ '@codspeed/vitest-plugin@4.0.1(vite@6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.1.4)':
dependencies:
'@codspeed/core': 4.0.1
vite: 6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0)
@@ -20912,7 +20918,7 @@ snapshots:
dependencies:
playwright: 1.52.0
- '@pmmmwh/react-refresh-webpack-plugin@0.5.16(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(esbuild@0.25.4))':
+ '@pmmmwh/react-refresh-webpack-plugin@0.5.16(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-hot-middleware@2.26.1)(webpack@5.99.9)':
dependencies:
ansi-html: 0.0.9
core-js-pure: 3.42.0
@@ -20922,7 +20928,7 @@ snapshots:
react-refresh: 0.14.2
schema-utils: 4.3.2
source-map: 0.7.4
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
optionalDependencies:
type-fest: 4.41.0
webpack-hot-middleware: 2.26.1
@@ -23183,7 +23189,7 @@ snapshots:
'@sentry/core@9.13.0': {}
- '@sentry/nextjs@9.13.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.9(esbuild@0.25.4))':
+ '@sentry/nextjs@9.13.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.9)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/semantic-conventions': 1.32.0
@@ -23194,7 +23200,7 @@ snapshots:
'@sentry/opentelemetry': 9.13.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.32.0)
'@sentry/react': 9.13.0(react@19.1.0)
'@sentry/vercel-edge': 9.13.0
- '@sentry/webpack-plugin': 3.3.1(encoding@0.1.13)(webpack@5.99.9(esbuild@0.25.4))
+ '@sentry/webpack-plugin': 3.3.1(encoding@0.1.13)(webpack@5.99.9)
chalk: 3.0.0
next: 15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
resolve: 1.22.8
@@ -23271,12 +23277,12 @@ snapshots:
'@opentelemetry/api': 1.9.0
'@sentry/core': 9.13.0
- '@sentry/webpack-plugin@3.3.1(encoding@0.1.13)(webpack@5.99.9(esbuild@0.25.4))':
+ '@sentry/webpack-plugin@3.3.1(encoding@0.1.13)(webpack@5.99.9)':
dependencies:
'@sentry/bundler-plugin-core': 3.3.1(encoding@0.1.13)
unplugin: 1.0.1
uuid: 9.0.1
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
transitivePeerDependencies:
- encoding
- supports-color
@@ -23367,11 +23373,11 @@ snapshots:
dependencies:
size-limit: 11.2.0
- '@size-limit/preset-big-lib@11.2.0(bufferutil@4.0.9)(size-limit@11.2.0)(utf-8-validate@5.0.10)':
+ '@size-limit/preset-big-lib@11.2.0(bufferutil@4.0.9)(esbuild@0.25.4)(size-limit@11.2.0)(utf-8-validate@5.0.10)':
dependencies:
'@size-limit/file': 11.2.0(size-limit@11.2.0)
'@size-limit/time': 11.2.0(bufferutil@4.0.9)(size-limit@11.2.0)(utf-8-validate@5.0.10)
- '@size-limit/webpack': 11.2.0(size-limit@11.2.0)
+ '@size-limit/webpack': 11.2.0(esbuild@0.25.4)(size-limit@11.2.0)
size-limit: 11.2.0
transitivePeerDependencies:
- '@swc/core'
@@ -23393,11 +23399,11 @@ snapshots:
- supports-color
- utf-8-validate
- '@size-limit/webpack@11.2.0(size-limit@11.2.0)':
+ '@size-limit/webpack@11.2.0(esbuild@0.25.4)(size-limit@11.2.0)':
dependencies:
nanoid: 5.1.5
size-limit: 11.2.0
- webpack: 5.99.9
+ webpack: 5.99.9(esbuild@0.25.4)
transitivePeerDependencies:
- '@swc/core'
- esbuild
@@ -24177,7 +24183,7 @@ snapshots:
ts-dedent: 2.2.0
vite: 6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0)
- '@storybook/builder-webpack5@8.6.14(esbuild@0.25.4)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)':
+ '@storybook/builder-webpack5@8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)':
dependencies:
'@storybook/core-webpack': 8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))
'@types/semver': 7.7.0
@@ -24185,23 +24191,23 @@ snapshots:
case-sensitive-paths-webpack-plugin: 2.4.0
cjs-module-lexer: 1.4.3
constants-browserify: 1.0.0
- css-loader: 6.11.0(webpack@5.99.9(esbuild@0.25.4))
+ css-loader: 6.11.0(webpack@5.99.9)
es-module-lexer: 1.7.0
- fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.99.9(esbuild@0.25.4))
- html-webpack-plugin: 5.6.3(webpack@5.99.9(esbuild@0.25.4))
+ fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.99.9)
+ html-webpack-plugin: 5.6.3(webpack@5.99.9)
magic-string: 0.30.17
path-browserify: 1.0.1
process: 0.11.10
semver: 7.7.2
storybook: 8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)
- style-loader: 3.3.4(webpack@5.99.9(esbuild@0.25.4))
- terser-webpack-plugin: 5.3.14(esbuild@0.25.4)(webpack@5.99.9(esbuild@0.25.4))
+ style-loader: 3.3.4(webpack@5.99.9)
+ terser-webpack-plugin: 5.3.14(webpack@5.99.9)
ts-dedent: 2.2.0
url: 0.11.4
util: 0.12.5
util-deprecate: 1.0.2
- webpack: 5.99.9(esbuild@0.25.4)
- webpack-dev-middleware: 6.1.3(webpack@5.99.9(esbuild@0.25.4))
+ webpack: 5.99.9
+ webpack-dev-middleware: 6.1.3(webpack@5.99.9)
webpack-hot-middleware: 2.26.1
webpack-virtual-modules: 0.6.2
optionalDependencies:
@@ -24269,7 +24275,7 @@ snapshots:
dependencies:
storybook: 8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)
- '@storybook/nextjs@8.6.14(esbuild@0.25.4)(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(esbuild@0.25.4))':
+ '@storybook/nextjs@8.6.14(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9)':
dependencies:
'@babel/core': 7.27.1
'@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.1)
@@ -24284,30 +24290,30 @@ snapshots:
'@babel/preset-react': 7.27.1(@babel/core@7.27.1)
'@babel/preset-typescript': 7.27.1(@babel/core@7.27.1)
'@babel/runtime': 7.27.1
- '@pmmmwh/react-refresh-webpack-plugin': 0.5.16(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(esbuild@0.25.4))
- '@storybook/builder-webpack5': 8.6.14(esbuild@0.25.4)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)
- '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(esbuild@0.25.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)
+ '@pmmmwh/react-refresh-webpack-plugin': 0.5.16(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-hot-middleware@2.26.1)(webpack@5.99.9)
+ '@storybook/builder-webpack5': 8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)
+ '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)
'@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)
'@storybook/test': 8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))
'@types/semver': 7.7.0
- babel-loader: 9.2.1(@babel/core@7.27.1)(webpack@5.99.9(esbuild@0.25.4))
- css-loader: 6.11.0(webpack@5.99.9(esbuild@0.25.4))
+ babel-loader: 9.2.1(@babel/core@7.27.1)(webpack@5.99.9)
+ css-loader: 6.11.0(webpack@5.99.9)
find-up: 5.0.0
image-size: 1.2.1
loader-utils: 3.3.1
next: 15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
- node-polyfill-webpack-plugin: 2.0.1(webpack@5.99.9(esbuild@0.25.4))
+ node-polyfill-webpack-plugin: 2.0.1(webpack@5.99.9)
pnp-webpack-plugin: 1.7.0(typescript@5.8.3)
postcss: 8.5.3
- postcss-loader: 8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.9(esbuild@0.25.4))
+ postcss-loader: 8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.9)
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
react-refresh: 0.14.2
resolve-url-loader: 5.0.0
- sass-loader: 14.2.1(webpack@5.99.9(esbuild@0.25.4))
+ sass-loader: 14.2.1(webpack@5.99.9)
semver: 7.7.2
storybook: 8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)
- style-loader: 3.3.4(webpack@5.99.9(esbuild@0.25.4))
+ style-loader: 3.3.4(webpack@5.99.9)
styled-jsx: 5.1.7(@babel/core@7.27.1)(react@19.1.0)
ts-dedent: 2.2.0
tsconfig-paths: 4.2.0
@@ -24315,7 +24321,7 @@ snapshots:
optionalDependencies:
sharp: 0.33.5
typescript: 5.8.3
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
transitivePeerDependencies:
- '@rspack/core'
- '@swc/core'
@@ -24334,11 +24340,11 @@ snapshots:
- webpack-hot-middleware
- webpack-plugin-serve
- '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(esbuild@0.25.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)':
+ '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)':
dependencies:
'@storybook/core-webpack': 8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))
'@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)
- '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.99.9(esbuild@0.25.4))
+ '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.99.9)
'@types/semver': 7.7.0
find-up: 5.0.0
magic-string: 0.30.17
@@ -24349,7 +24355,7 @@ snapshots:
semver: 7.7.2
storybook: 8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)
tsconfig-paths: 4.2.0
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
optionalDependencies:
typescript: 5.8.3
transitivePeerDependencies:
@@ -24364,7 +24370,7 @@ snapshots:
dependencies:
storybook: 8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)
- '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.99.9(esbuild@0.25.4))':
+ '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.99.9)':
dependencies:
debug: 4.4.1(supports-color@8.1.1)
endent: 2.1.0
@@ -24374,7 +24380,7 @@ snapshots:
react-docgen-typescript: 2.2.2(typescript@5.8.3)
tslib: 2.8.1
typescript: 5.8.3
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
transitivePeerDependencies:
- supports-color
@@ -25533,7 +25539,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@vitest/coverage-v8@3.1.2(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.14.1)(@vitest/ui@3.1.4)(happy-dom@17.4.7)(jiti@2.4.2)(lightningcss@1.30.1)(msw@2.8.4(@types/node@22.14.1)(typescript@5.8.3))(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))':
+ '@vitest/coverage-v8@3.1.2(vitest@3.1.4)':
dependencies:
'@ampproject/remapping': 2.3.0
'@bcoe/v8-coverage': 1.0.2
@@ -25551,24 +25557,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@vitest/coverage-v8@3.1.2(vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.20)(@vitest/ui@3.1.4)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.15.20)(typescript@5.8.3))(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0))':
- dependencies:
- '@ampproject/remapping': 2.3.0
- '@bcoe/v8-coverage': 1.0.2
- debug: 4.4.1(supports-color@8.1.1)
- istanbul-lib-coverage: 3.2.2
- istanbul-lib-report: 3.0.1
- istanbul-lib-source-maps: 5.0.6
- istanbul-reports: 3.1.7
- magic-string: 0.30.17
- magicast: 0.3.5
- std-env: 3.9.0
- test-exclude: 7.0.1
- tinyrainbow: 2.0.0
- vitest: 3.1.4(@types/debug@4.1.12)(@types/node@22.15.20)(@vitest/ui@3.1.4)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.15.20)(typescript@5.8.3))(terser@5.39.2)(tsx@4.19.4)(yaml@2.8.0)
- transitivePeerDependencies:
- - supports-color
-
'@vitest/expect@2.0.5':
dependencies:
'@vitest/spy': 2.0.5
@@ -27281,12 +27269,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
- babel-loader@9.2.1(@babel/core@7.27.1)(webpack@5.99.9(esbuild@0.25.4)):
+ babel-loader@9.2.1(@babel/core@7.27.1)(webpack@5.99.9):
dependencies:
'@babel/core': 7.27.1
find-cache-dir: 4.0.0
schema-utils: 4.3.2
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
babel-plugin-istanbul@6.1.1:
dependencies:
@@ -28267,7 +28255,7 @@ snapshots:
css-gradient-parser@0.0.16: {}
- css-loader@6.11.0(webpack@5.99.9(esbuild@0.25.4)):
+ css-loader@6.11.0(webpack@5.99.9):
dependencies:
icss-utils: 5.1.0(postcss@8.5.3)
postcss: 8.5.3
@@ -28278,7 +28266,7 @@ snapshots:
postcss-value-parser: 4.2.0
semver: 7.7.2
optionalDependencies:
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
css-select@4.3.0:
dependencies:
@@ -29054,7 +29042,7 @@ snapshots:
- bluebird
- supports-color
- eslint-module-utils@2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0):
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.0):
dependencies:
debug: 3.2.7
optionalDependencies:
@@ -29065,7 +29053,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.12.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2)):
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.24.0(jiti@2.4.2)):
dependencies:
debug: 3.2.7
optionalDependencies:
@@ -29087,7 +29075,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0)
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.0)
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -29116,7 +29104,7 @@ snapshots:
doctrine: 2.1.0
eslint: 9.24.0(jiti@2.4.2)
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2))
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.24.0(jiti@2.4.2))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -29948,7 +29936,7 @@ snapshots:
cross-spawn: 7.0.6
signal-exit: 4.1.0
- fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.99.9(esbuild@0.25.4)):
+ fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.99.9):
dependencies:
'@babel/code-frame': 7.27.1
chalk: 4.1.2
@@ -29963,7 +29951,7 @@ snapshots:
semver: 7.7.2
tapable: 2.2.2
typescript: 5.8.3
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
form-data-encoder@2.1.4: {}
@@ -30552,7 +30540,7 @@ snapshots:
html-void-elements@3.0.0: {}
- html-webpack-plugin@5.6.3(webpack@5.99.9(esbuild@0.25.4)):
+ html-webpack-plugin@5.6.3(webpack@5.99.9):
dependencies:
'@types/html-minifier-terser': 6.1.0
html-minifier-terser: 6.1.0
@@ -30560,7 +30548,7 @@ snapshots:
pretty-error: 4.0.0
tapable: 2.2.2
optionalDependencies:
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
html-whitespace-sensitive-tag-names@3.0.1: {}
@@ -33036,7 +33024,7 @@ snapshots:
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
- next-sitemap@4.2.3(next@15.3.2(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)):
+ next-sitemap@4.2.3(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)):
dependencies:
'@corex/deepmerge': 4.0.43
'@next/env': 13.5.8
@@ -33076,7 +33064,7 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
- nextjs-toploader@1.6.12(next@15.3.2(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+ nextjs-toploader@1.6.12(next@15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies:
next: 15.3.2(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
nprogress: 0.2.0
@@ -33132,7 +33120,7 @@ snapshots:
node-int64@0.4.0: {}
- node-polyfill-webpack-plugin@2.0.1(webpack@5.99.9(esbuild@0.25.4)):
+ node-polyfill-webpack-plugin@2.0.1(webpack@5.99.9):
dependencies:
assert: 2.1.0
browserify-zlib: 0.2.0
@@ -33159,7 +33147,7 @@ snapshots:
url: 0.11.4
util: 0.12.5
vm-browserify: 1.1.2
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
node-releases@2.0.19: {}
@@ -33946,14 +33934,14 @@ snapshots:
tsx: 4.19.4
yaml: 2.8.0
- postcss-loader@8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.9(esbuild@0.25.4)):
+ postcss-loader@8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.9):
dependencies:
cosmiconfig: 9.0.0(typescript@5.8.3)
jiti: 1.21.7
postcss: 8.5.3
semver: 7.7.2
optionalDependencies:
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
transitivePeerDependencies:
- typescript
@@ -35130,11 +35118,11 @@ snapshots:
safer-buffer@2.1.2: {}
- sass-loader@14.2.1(webpack@5.99.9(esbuild@0.25.4)):
+ sass-loader@14.2.1(webpack@5.99.9):
dependencies:
neo-async: 2.6.2
optionalDependencies:
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
satori@0.12.2:
dependencies:
@@ -35756,9 +35744,9 @@ snapshots:
structured-headers@0.4.1: {}
- style-loader@3.3.4(webpack@5.99.9(esbuild@0.25.4)):
+ style-loader@3.3.4(webpack@5.99.9):
dependencies:
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
style-mod@4.1.2: {}
@@ -37208,7 +37196,7 @@ snapshots:
- bufferutil
- utf-8-validate
- webpack-dev-middleware@6.1.3(webpack@5.99.9(esbuild@0.25.4)):
+ webpack-dev-middleware@6.1.3(webpack@5.99.9):
dependencies:
colorette: 2.0.20
memfs: 3.5.3
@@ -37216,7 +37204,7 @@ snapshots:
range-parser: 1.2.1
schema-utils: 4.3.2
optionalDependencies:
- webpack: 5.99.9(esbuild@0.25.4)
+ webpack: 5.99.9
webpack-hot-middleware@2.26.1:
dependencies: