diff --git a/apps/web/src/docs/shell-content.tsx b/apps/web/src/docs/shell-content.tsx
index 21c7e85734..eaa235e433 100644
--- a/apps/web/src/docs/shell-content.tsx
+++ b/apps/web/src/docs/shell-content.tsx
@@ -3,14 +3,46 @@ import type { Root } from 'fumadocs-core/page-tree'
import { useRouterState } from '@tanstack/react-router'
import { LogoVitNode } from '@vitnode/core/components/logo-vitnode'
import { ThemeSwitcher } from '@vitnode/core/components/switchers/themes/theme-switcher'
-import { DocsLayout } from 'fumadocs-ui/layouts/notebook'
+import { cn } from 'cn'
+import { DocsLayout, useSpaciousLayout } from 'fumadocs-ui/layouts/spacious'
import { RootProvider } from 'fumadocs-ui/provider/tanstack'
-import React from 'react'
+import React, { useId } from 'react'
import { docsSectionOf } from './section'
const DocsSearchDialog = React.lazy(async () => await import('./search-dialog'))
+const DocsNavTitle = () => {
+ const logoId = useId()
+
+ return
+}
+
+const DocsActions = ({ className, ...props }: React.ComponentProps<'div'>) => {
+ const { menuItems } = useSpaciousLayout()
+
+ return (
+
+ {menuItems.map(
+ (item) =>
+ item.type === 'icon' && (
+
+ {item.icon}
+
+ ),
+ )}
+
+
+ )
+}
+
export const DocsShellContent = ({
children,
pageTree,
@@ -34,11 +66,8 @@ export const DocsShellContent = ({
}}
- slots={{ themeSwitch: ThemeSwitcher }}
+ nav={{ title:
}}
+ slots={{ actions: DocsActions, themeSwitch: ThemeSwitcher }}
tabs={{
transform(option) {
const tab = docsSectionOf(option.url)
@@ -50,10 +79,8 @@ export const DocsShellContent = ({
...option,
icon: (
{option.icon}
diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css
index ac2210d26d..a01404d819 100644
--- a/apps/web/src/styles.css
+++ b/apps/web/src/styles.css
@@ -10,38 +10,38 @@
:root:not(.dark) {
color-scheme: light;
- --background: oklch(0.97 0 0);
- --foreground: oklch(0.205 0 0);
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.214 0.006 264);
--card: oklch(1 0 0);
- --card-foreground: oklch(0.205 0 0);
+ --card-foreground: oklch(0.214 0.006 264);
--popover: oklch(1 0 0);
- --popover-foreground: oklch(0.205 0 0);
+ --popover-foreground: oklch(0.214 0.006 264);
--primary: oklch(0.52 0.2 264);
--primary-foreground: oklch(0.985 0 0);
- --secondary: oklch(0.95 0 0);
- --secondary-foreground: oklch(0.269 0 0);
- --muted: oklch(0.95 0 0);
- --muted-foreground: oklch(0.52 0 0);
- --accent: oklch(0.95 0 0);
- --accent-foreground: oklch(0.205 0 0);
+ --secondary: oklch(0.955 0.004 264);
+ --secondary-foreground: oklch(0.214 0.006 264);
+ --muted: oklch(0.97 0.004 264);
+ --muted-foreground: oklch(0.552 0.005 264);
+ --accent: oklch(0.97 0.004 264);
+ --accent-foreground: oklch(0.214 0.006 264);
--destructive: oklch(0.565 0.209 27);
--success: oklch(0.52 0.128 155);
--warn: oklch(0.55 0.145 50);
- --border: oklch(0.925 0 0);
- --input: oklch(0.9 0 0);
+ --border: oklch(0.928 0.004 264);
+ --input: oklch(0.908 0.003 264);
--ring: oklch(0.52 0.2 264);
--chart-1: oklch(0.52 0.2 264);
--chart-2: oklch(0.72 0.15 55);
--chart-3: oklch(0.6 0 0);
--chart-4: oklch(0.45 0.11 155);
--chart-5: oklch(0.63 0.2 27);
- --sidebar: oklch(0.955 0 0);
- --sidebar-foreground: oklch(0.46 0 0);
+ --sidebar: oklch(0.97 0.004 264);
+ --sidebar-foreground: oklch(0.373 0.003 264);
--sidebar-primary: oklch(0.52 0.2 264);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(1 0 0);
- --sidebar-accent-foreground: oklch(0.205 0 0);
- --sidebar-border: oklch(0.91 0 0);
+ --sidebar-accent-foreground: oklch(0.214 0.006 264);
+ --sidebar-border: oklch(0.928 0.004 264);
--sidebar-ring: oklch(0.52 0.2 264);
}
diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/root/src/styles.css b/packages/create-vitnode-app/copy-of-vitnode-app/root/src/styles.css
index 363f5df91b..f03b228add 100644
--- a/packages/create-vitnode-app/copy-of-vitnode-app/root/src/styles.css
+++ b/packages/create-vitnode-app/copy-of-vitnode-app/root/src/styles.css
@@ -8,38 +8,38 @@
:root:not(.dark) {
color-scheme: light;
- --background: oklch(0.97 0 0);
- --foreground: oklch(0.205 0 0);
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.214 0.006 264);
--card: oklch(1 0 0);
- --card-foreground: oklch(0.205 0 0);
+ --card-foreground: oklch(0.214 0.006 264);
--popover: oklch(1 0 0);
- --popover-foreground: oklch(0.205 0 0);
+ --popover-foreground: oklch(0.214 0.006 264);
--primary: oklch(0.52 0.2 264);
--primary-foreground: oklch(0.985 0 0);
- --secondary: oklch(0.95 0 0);
- --secondary-foreground: oklch(0.269 0 0);
- --muted: oklch(0.95 0 0);
- --muted-foreground: oklch(0.52 0 0);
- --accent: oklch(0.95 0 0);
- --accent-foreground: oklch(0.205 0 0);
+ --secondary: oklch(0.955 0.004 264);
+ --secondary-foreground: oklch(0.214 0.006 264);
+ --muted: oklch(0.97 0.004 264);
+ --muted-foreground: oklch(0.552 0.005 264);
+ --accent: oklch(0.97 0.004 264);
+ --accent-foreground: oklch(0.214 0.006 264);
--destructive: oklch(0.565 0.209 27);
--success: oklch(0.52 0.128 155);
--warn: oklch(0.55 0.145 50);
- --border: oklch(0.925 0 0);
- --input: oklch(0.9 0 0);
+ --border: oklch(0.928 0.004 264);
+ --input: oklch(0.908 0.003 264);
--ring: oklch(0.52 0.2 264);
--chart-1: oklch(0.52 0.2 264);
--chart-2: oklch(0.72 0.15 55);
--chart-3: oklch(0.6 0 0);
--chart-4: oklch(0.45 0.11 155);
--chart-5: oklch(0.63 0.2 27);
- --sidebar: oklch(0.955 0 0);
- --sidebar-foreground: oklch(0.46 0 0);
+ --sidebar: oklch(0.97 0.004 264);
+ --sidebar-foreground: oklch(0.373 0.003 264);
--sidebar-primary: oklch(0.52 0.2 264);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(1 0 0);
- --sidebar-accent-foreground: oklch(0.205 0 0);
- --sidebar-border: oklch(0.91 0 0);
+ --sidebar-accent-foreground: oklch(0.214 0.006 264);
+ --sidebar-border: oklch(0.928 0.004 264);
--sidebar-ring: oklch(0.52 0.2 264);
}
diff --git a/packages/vitnode/src/components/ui/copy-button.test.tsx b/packages/vitnode/src/components/ui/copy-button.test.tsx
index e271d97a26..f07492c0b8 100644
--- a/packages/vitnode/src/components/ui/copy-button.test.tsx
+++ b/packages/vitnode/src/components/ui/copy-button.test.tsx
@@ -150,4 +150,89 @@ describe("CopyButton", () => {
expect(writeText).not.toHaveBeenCalled();
});
+
+ it("copies text resolved from async content", async () => {
+ const writeText = stubClipboard(async () => {});
+ render(
"# Page"} />);
+
+ await clickAndFlush(screen.getByRole("button"));
+ await act(async () => {
+ await Promise.resolve();
+ });
+
+ expect(writeText).toHaveBeenCalledWith("# Page");
+ expect(
+ screen.getByRole("button", { name: "core.global.copied" }),
+ ).toBeTruthy();
+ });
+
+ it("hands a pending clipboard item to the clipboard when supported", async () => {
+ class FakeClipboardItem {
+ readonly items: Record>;
+
+ constructor(items: Record>) {
+ this.items = items;
+ }
+ }
+ vi.stubGlobal("ClipboardItem", FakeClipboardItem);
+ const write = vi.fn(async (_items: FakeClipboardItem[]) => {});
+ Object.defineProperty(navigator, "clipboard", {
+ configurable: true,
+ value: { write, writeText: vi.fn() },
+ });
+ render( "# Page"} />);
+
+ await clickAndFlush(screen.getByRole("button"));
+
+ expect(write).toHaveBeenCalledTimes(1);
+ const [item] = write.mock.calls[0][0];
+ const blob = await item.items["text/plain"];
+ expect(await blob.text()).toBe("# Page");
+ vi.unstubAllGlobals();
+ });
+
+ it("shows an error toast when async content fails", async () => {
+ const writeText = stubClipboard(async () => {});
+ const toastError = vi.spyOn(toast, "error");
+ render(
+ Promise.reject(new Error("Not Found"))}
+ />,
+ );
+
+ await clickAndFlush(screen.getByRole("button"));
+ await act(async () => {
+ await Promise.resolve();
+ });
+
+ expect(writeText).not.toHaveBeenCalled();
+ expect(toastError).toHaveBeenCalledWith("core.global.errors.title", {
+ description: "core.global.copy_failed",
+ });
+ });
+
+ it("ignores clicks while async content is loading", async () => {
+ stubClipboard(async () => {});
+ let resolveContent: (value: string) => void = () => {};
+ const content = vi.fn(
+ async () =>
+ new Promise(resolve => {
+ resolveContent = resolve;
+ }),
+ );
+ render();
+
+ await clickAndFlush(screen.getByRole("button"));
+ expect(screen.getByRole("button").getAttribute("aria-busy")).toBe("true");
+ await clickAndFlush(screen.getByRole("button"));
+
+ expect(content).toHaveBeenCalledTimes(1);
+
+ await act(async () => {
+ resolveContent("done");
+ await Promise.resolve();
+ });
+
+ expect(screen.getByRole("button").getAttribute("aria-busy")).toBeNull();
+ });
});
diff --git a/packages/vitnode/src/components/ui/copy-button.tsx b/packages/vitnode/src/components/ui/copy-button.tsx
index 25d4c24f63..75bce72104 100644
--- a/packages/vitnode/src/components/ui/copy-button.tsx
+++ b/packages/vitnode/src/components/ui/copy-button.tsx
@@ -22,7 +22,7 @@ type CopyButtonProps = Omit<
VariantProps & {
children?: React.ReactNode;
className?: string;
- content: string;
+ content: (() => Promise) | string;
copied?: boolean;
delay?: number;
onCopiedChange?: (copied: boolean) => void;
@@ -56,6 +56,28 @@ const useIconMotion = () => {
};
};
+const writeToClipboard = async (content: CopyButtonProps["content"]) => {
+ if (typeof content === "string") {
+ await navigator.clipboard.writeText(content);
+
+ return;
+ }
+
+ if (typeof ClipboardItem === "undefined" || !navigator.clipboard.write) {
+ await navigator.clipboard.writeText(await content());
+
+ return;
+ }
+
+ await navigator.clipboard.write([
+ new ClipboardItem({
+ "text/plain": content().then(
+ text => new Blob([text], { type: "text/plain" }),
+ ),
+ }),
+ ]);
+};
+
const CopiedCheck = ({
initial,
transition,
@@ -94,6 +116,7 @@ function CopyButton({
const t = useTranslations("core.global");
const [uncontrolledCopied, setUncontrolledCopied] = React.useState(false);
const [copyCount, setCopyCount] = React.useState(0);
+ const [isLoading, setIsLoading] = React.useState(false);
const isCopied = copied ?? uncontrolledCopied;
const iconMotion = useIconMotion();
@@ -117,12 +140,17 @@ function CopyButton({
}, [isCopied, delay, copyCount]);
const copyToClipboard = async () => {
+ if (isLoading) return;
+ setIsLoading(typeof content !== "string");
+
try {
- await navigator.clipboard.writeText(content);
+ await writeToClipboard(content);
setCopied(true);
setCopyCount(count => count + 1);
} catch {
toast.error(t("errors.title"), { description: t("copy_failed") });
+ } finally {
+ setIsLoading(false);
}
};
@@ -132,6 +160,7 @@ function CopyButton({
return (
+ item.getClientRects().length > 0 && !item.closest(ANIMATING_PANEL_SELECTOR);
+
+const findActiveItem = (area: HTMLElement) => {
+ const activeItems = [
+ ...area.querySelectorAll(`:is(${ITEM_SELECTOR})[data-active]`),
+ ].filter(isShown);
+
+ return (
+ activeItems.find(item =>
+ item.matches('[data-sidebar="menu-sub-button"]'),
+ ) ??
+ activeItems[0] ??
+ null
+ );
+};
+
+const itemOf = (target: EventTarget | null) =>
+ target instanceof Element ? target.closest(ITEM_SELECTOR) : null;
+
+const createIndicator = (area: HTMLElement, indicator: HTMLElement) => {
+ let current: Element | null = null;
+
+ const measure = (item: Element) => {
+ const rect = item.getBoundingClientRect();
+ const origin = area.getBoundingClientRect();
+ const width = item instanceof HTMLElement ? item.offsetWidth : rect.width;
+ const height =
+ item instanceof HTMLElement ? item.offsetHeight : rect.height;
+ const left =
+ rect.left + rect.width / 2 - width / 2 - origin.left - area.clientLeft;
+ const top =
+ rect.top + rect.height / 2 - height / 2 - origin.top - area.clientTop;
+
+ return {
+ height: `${height}px`,
+ translate: `${left + area.scrollLeft}px ${top + area.scrollTop}px`,
+ width: `${width}px`,
+ };
+ };
+
+ const place = (box: ReturnType) => {
+ indicator.style.translate = box.translate;
+ indicator.style.width = box.width;
+ indicator.style.height = box.height;
+ };
+
+ const isPlacedAt = (box: ReturnType) =>
+ indicator.style.translate === box.translate &&
+ indicator.style.width === box.width &&
+ indicator.style.height === box.height;
+
+ const show = (item: Element | null, isVisible = true) => {
+ if (!item) {
+ if (current) indicator.style.transitionProperty = "opacity";
+ current = null;
+ indicator.style.opacity = "0";
+
+ return;
+ }
+
+ const box = measure(item);
+ if (item === current) {
+ if (!isPlacedAt(box)) {
+ indicator.style.transitionProperty = "none";
+ place(box);
+ }
+ } else {
+ indicator.style.transitionProperty = current ? "" : "opacity";
+ current = item;
+ place(box);
+ }
+ indicator.style.opacity = isVisible ? "1" : "0";
+ };
+
+ return {
+ get current() {
+ return current;
+ },
+ show,
+ };
+};
+
+export const glideSidebarIndicators = (area: HTMLElement) => {
+ const hoverElement = area.querySelector(
+ ':scope > [data-sidebar="hover-indicator"]',
+ );
+ const activeElement = area.querySelector(
+ ':scope > [data-sidebar="active-indicator"]',
+ );
+ if (
+ !(hoverElement instanceof HTMLElement) ||
+ !(activeElement instanceof HTMLElement)
+ ) {
+ return () => undefined;
+ }
+
+ const hover = createIndicator(area, hoverElement);
+ const active = createIndicator(area, activeElement);
+ let hoveredItem: Element | null = null;
+
+ const showHover = (item: Element | null) => {
+ hoveredItem = item;
+ hover.show(item, item !== active.current);
+ };
+
+ const sync = () => {
+ const activeItem = findActiveItem(area);
+ active.show(activeItem);
+ showHover(hoveredItem?.isConnected ? hoveredItem : null);
+ };
+
+ const resizeObserver = new ResizeObserver(sync);
+ const observeLayout = () => {
+ resizeObserver.observe(area);
+ area
+ .querySelectorAll(
+ `[data-sidebar="menu"], [data-sidebar="menu-sub"], ${ITEM_SELECTOR}`,
+ )
+ .forEach(element => {
+ resizeObserver.observe(element);
+ });
+ };
+
+ const mutationObserver = new MutationObserver(() => {
+ observeLayout();
+ sync();
+ });
+ mutationObserver.observe(area, {
+ attributeFilter: [
+ "data-active",
+ "data-starting-style",
+ "data-ending-style",
+ ],
+ attributes: true,
+ childList: true,
+ subtree: true,
+ });
+
+ const controller = new AbortController();
+ const { signal } = controller;
+
+ area.addEventListener(
+ "pointerover",
+ event => {
+ const item = itemOf(event.target);
+ if (item && event.pointerType === "mouse") showHover(item);
+ },
+ { signal },
+ );
+ area.addEventListener(
+ "pointerleave",
+ () => {
+ showHover(null);
+ },
+ { signal },
+ );
+ area.addEventListener(
+ "focusin",
+ event => {
+ if (
+ event.target instanceof Element &&
+ event.target.matches(":focus-visible")
+ ) {
+ showHover(itemOf(event.target));
+ }
+ },
+ { signal },
+ );
+ area.addEventListener(
+ "focusout",
+ () => {
+ if (!area.matches(":hover")) showHover(null);
+ },
+ { signal },
+ );
+
+ observeLayout();
+ sync();
+ area.dataset.glide = "";
+
+ return () => {
+ controller.abort();
+ resizeObserver.disconnect();
+ mutationObserver.disconnect();
+ delete area.dataset.glide;
+ };
+};
diff --git a/packages/vitnode/src/components/ui/sidebar.test.tsx b/packages/vitnode/src/components/ui/sidebar.test.tsx
new file mode 100644
index 0000000000..09278be419
--- /dev/null
+++ b/packages/vitnode/src/components/ui/sidebar.test.tsx
@@ -0,0 +1,156 @@
+import { fireEvent, render, screen } from "@testing-library/react";
+import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
+
+import {
+ SidebarContent,
+ SidebarMenu,
+ SidebarMenuButton,
+ SidebarMenuItem,
+ SidebarMenuSub,
+ SidebarMenuSubButton,
+ SidebarMenuSubItem,
+ SidebarProvider,
+} from "./sidebar";
+
+const ITEM_TOPS: Record = {
+ Dashboard: 0,
+ Roles: 72,
+ Users: 36,
+};
+
+const Nav = ({ activeItem }: { activeItem: string }) => (
+
+
+
+
+
+ Dashboard
+
+
+
+
+ Users
+
+
+
+
+ Roles
+
+
+
+
+
+
+
+);
+
+const sidebarPart = (name: string) => {
+ const element = document.querySelector(`[data-sidebar="${name}"]`);
+ if (!(element instanceof HTMLElement)) {
+ throw new Error(`Missing sidebar ${name}`);
+ }
+
+ return element;
+};
+
+const indicator = (name: "active" | "hover") =>
+ sidebarPart(`${name}-indicator`);
+
+const rectOf = (top: number) => new DOMRect(0, top, 200, 32);
+
+describe("SidebarContent gliding indicators", () => {
+ beforeEach(() => {
+ vi.stubGlobal(
+ "matchMedia",
+ vi.fn(() => ({
+ addEventListener: vi.fn(),
+ matches: false,
+ removeEventListener: vi.fn(),
+ })),
+ );
+ vi.stubGlobal(
+ "ResizeObserver",
+ class {
+ disconnect() {}
+ observe() {}
+ unobserve() {}
+ },
+ );
+ vi.spyOn(Element.prototype, "getClientRects").mockImplementation(
+ () => [rectOf(0)] as unknown as DOMRectList,
+ );
+ vi.spyOn(Element.prototype, "getBoundingClientRect").mockImplementation(
+ function (this: Element) {
+ return rectOf(ITEM_TOPS[this.textContent] ?? 0);
+ },
+ );
+ vi.spyOn(HTMLElement.prototype, "offsetWidth", "get").mockReturnValue(200);
+ vi.spyOn(HTMLElement.prototype, "offsetHeight", "get").mockReturnValue(32);
+ });
+
+ afterEach(() => {
+ vi.restoreAllMocks();
+ vi.unstubAllGlobals();
+ });
+
+ it("places the active indicator under the active item", () => {
+ render();
+
+ expect(indicator("active").style.opacity).toBe("1");
+ expect(indicator("active").style.translate).toBe("0px 0px");
+ expect(indicator("active").style.width).toBe("200px");
+ });
+
+ it("glides the active indicator to the newly active item", async () => {
+ const { rerender } = render();
+
+ rerender();
+
+ await vi.waitFor(() => {
+ expect(indicator("active").style.translate).toBe("0px 36px");
+ });
+ expect(indicator("active").style.transitionProperty).toBe("");
+ });
+
+ it("prefers the active sub-item over its active parent", () => {
+ render();
+
+ expect(indicator("active").style.translate).toBe("0px 72px");
+ });
+
+ it("follows the mouse with the hover indicator and hides it on leave", () => {
+ render();
+
+ fireEvent.pointerOver(screen.getByText("Users"), { pointerType: "mouse" });
+
+ expect(indicator("hover").style.opacity).toBe("1");
+ expect(indicator("hover").style.translate).toBe("0px 36px");
+
+ fireEvent.pointerLeave(sidebarPart("content"));
+
+ expect(indicator("hover").style.opacity).toBe("0");
+ });
+
+ it("keeps the hover indicator hidden over the active item", () => {
+ render();
+
+ fireEvent.pointerOver(screen.getByText("Dashboard"), {
+ pointerType: "mouse",
+ });
+
+ expect(indicator("hover").style.opacity).toBe("0");
+ });
+
+ it("ignores touch pointers", () => {
+ render();
+
+ fireEvent.pointerOver(screen.getByText("Users"), { pointerType: "touch" });
+
+ expect(indicator("hover").style.opacity).not.toBe("1");
+ });
+});
diff --git a/packages/vitnode/src/components/ui/sidebar.tsx b/packages/vitnode/src/components/ui/sidebar.tsx
index e80217302f..7c6153b985 100644
--- a/packages/vitnode/src/components/ui/sidebar.tsx
+++ b/packages/vitnode/src/components/ui/sidebar.tsx
@@ -29,6 +29,7 @@ import {
import { useIsMobile } from "@/hooks/use-mobile";
import { SIDEBAR_COOKIE_MAX_AGE, SIDEBAR_COOKIE_NAME } from "./sidebar-cookie";
+import { glideSidebarIndicators } from "./sidebar-glide";
const SIDEBAR_WIDTH = "16rem";
const SIDEBAR_WIDTH_MOBILE = "18rem";
@@ -370,17 +371,42 @@ function SidebarSeparator({
);
}
-function SidebarContent({ className, ...props }: React.ComponentProps<"div">) {
+function SidebarContent({
+ children,
+ className,
+ ...props
+}: React.ComponentProps<"div">) {
+ const contentRef = React.useRef(null);
+
+ React.useEffect(() => {
+ if (!contentRef.current) return;
+
+ return glideSidebarIndicators(contentRef.current);
+ }, []);
+
return (
+ >
+
+
+ {children}
+
);
}
@@ -479,8 +505,11 @@ function SidebarMenuItem({ className, ...props }: React.ComponentProps<"li">) {
);
}
+const glidingItemClassName =
+ "group-data-glide/sidebar-content:hover:bg-transparent group-data-glide/sidebar-content:active:bg-transparent group-data-glide/sidebar-content:data-open:hover:bg-transparent group-data-glide/sidebar-content:data-active:bg-transparent group-data-glide/sidebar-content:data-active:shadow-none group-data-glide/sidebar-content:data-active:inset-ring-0";
+
const sidebarMenuButtonVariants = cva(
- "peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-start text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pe-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground data-active:shadow-xs data-active:inset-ring data-active:inset-ring-sidebar-border [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate",
+ "peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-start text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding,scale] ease-fluid group-has-data-[sidebar=menu-action]/menu-item:pe-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:scale-98 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground data-active:shadow-xs data-active:inset-ring data-active:inset-ring-sidebar-border [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate",
{
variants: {
variant: {
@@ -533,7 +562,11 @@ function SidebarMenuButton({
defaultTagName: "button",
props: mergeProps<"button">(
{
- className: cn(sidebarMenuButtonVariants({ variant, size }), className),
+ className: cn(
+ sidebarMenuButtonVariants({ variant, size }),
+ glidingItemClassName,
+ className,
+ ),
},
props,
),
@@ -696,7 +729,8 @@ function SidebarMenuSubButton({
props: mergeProps<"a">(
{
className: cn(
- "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden group-data-[collapsible=icon]:hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs rtl:translate-x-px [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
+ "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground ease-fluid flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden transition-[color,scale] group-data-[collapsible=icon]:hidden focus-visible:ring-2 active:scale-98 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs rtl:translate-x-px [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
+ glidingItemClassName,
className,
),
},
diff --git a/packages/vitnode/src/components/ui/tooltip.test.tsx b/packages/vitnode/src/components/ui/tooltip.test.tsx
new file mode 100644
index 0000000000..9655b27ec7
--- /dev/null
+++ b/packages/vitnode/src/components/ui/tooltip.test.tsx
@@ -0,0 +1,56 @@
+import { act, fireEvent, render, screen } from "@testing-library/react";
+import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
+
+import { TooltipProvider, TooltipWithContent } from "./tooltip";
+
+const hover = (element: HTMLElement) => {
+ fireEvent.pointerEnter(element, { pointerType: "mouse" });
+ fireEvent.mouseEnter(element);
+ fireEvent.mouseMove(element);
+};
+
+const advance = async (ms: number) => {
+ await act(async () => {
+ await vi.advanceTimersByTimeAsync(ms);
+ });
+};
+
+describe("TooltipWithContent", () => {
+ beforeEach(() => {
+ vi.useFakeTimers();
+ });
+
+ afterEach(() => {
+ vi.useRealTimers();
+ });
+
+ it("opens shortly after hovering without a provider", async () => {
+ render(
+
+
+ ,
+ );
+
+ hover(screen.getByRole("button", { name: "Delete" }));
+ await advance(150);
+ expect(screen.queryByText("Delete post")).toBeNull();
+
+ await advance(100);
+ expect(screen.getByText("Delete post")).toBeTruthy();
+ });
+
+ it("follows the delay of its provider", async () => {
+ render(
+
+
+
+
+ ,
+ );
+
+ hover(screen.getByRole("button", { name: "Delete" }));
+ await advance(0);
+
+ expect(screen.getByText("Delete post")).toBeTruthy();
+ });
+});
diff --git a/packages/vitnode/src/components/ui/tooltip.tsx b/packages/vitnode/src/components/ui/tooltip.tsx
index 8469783672..f207f19df9 100644
--- a/packages/vitnode/src/components/ui/tooltip.tsx
+++ b/packages/vitnode/src/components/ui/tooltip.tsx
@@ -2,16 +2,22 @@ import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
import { cn } from "cn";
import React from "react";
+const TOOLTIP_OPEN_DELAY = 200;
+
+const TooltipDelayContext = React.createContext(TOOLTIP_OPEN_DELAY);
+
function TooltipProvider({
- delay = 500,
+ delay = TOOLTIP_OPEN_DELAY,
...props
}: TooltipPrimitive.Provider.Props) {
return (
-
+
+
+
);
}
@@ -19,8 +25,16 @@ function Tooltip({ ...props }: TooltipPrimitive.Root.Props) {
return
;
}
-function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {
- return
;
+function TooltipTrigger({ delay, ...props }: TooltipPrimitive.Trigger.Props) {
+ const providerDelay = React.use(TooltipDelayContext);
+
+ return (
+
+ );
}
function TooltipContent({
@@ -161,15 +175,18 @@ function useIsInTooltipGroup() {
function TooltipGroupTrigger({
content,
+ delay,
...props
}: Omit
& {
content: React.ReactNode;
}) {
const handle = React.use(TooltipGroupContext);
+ const providerDelay = React.use(TooltipDelayContext);
return (
-
+
{breadcrumb != null && (
diff --git a/packages/vitnode/src/views/admin/views/core/dashboard/grid/board-provider.tsx b/packages/vitnode/src/views/admin/views/core/dashboard/grid/board-provider.tsx
index c69cd125a0..b5e4deabb2 100644
--- a/packages/vitnode/src/views/admin/views/core/dashboard/grid/board-provider.tsx
+++ b/packages/vitnode/src/views/admin/views/core/dashboard/grid/board-provider.tsx
@@ -439,19 +439,7 @@ export const DashboardBoardProvider = ({
onDragStart={onDragStart}
sensors={sensors}
>
-
- {children}
-
+ {children}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 816aeff96d..c1b52075cf 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -202,14 +202,14 @@ importers:
specifier: 1.0.0-rc.4
version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.5)
fumadocs-core:
- specifier: ^16.16.2
- version: 16.16.2(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5)
+ specifier: 16.17.1
+ version: 16.17.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5)
fumadocs-mdx:
specifier: ^15.4.6
- version: 15.4.6(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.3.0)(fumadocs-core@16.16.2(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(rolldown@1.2.13)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))
+ version: 15.4.6(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.3.0)(fumadocs-core@16.17.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(rolldown@1.2.13)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))
fumadocs-ui:
- specifier: ^16.16.2
- version: 16.16.2(@types/mdx@2.0.14)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(fumadocs-core@16.16.2(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(tailwindcss@4.3.3)
+ specifier: npm:@fumadocs/base-ui@16.17.1
+ version: '@fumadocs/base-ui@16.17.1(@date-fns/tz@1.5.0)(@types/mdx@2.0.14)(@types/react@19.3.0)(date-fns@4.4.0)(fumadocs-core@16.17.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(tailwindcss@4.3.3)'
hono:
specifier: ^4.13.13
version: 4.13.13
@@ -1883,8 +1883,28 @@ packages:
'@types/react':
optional: true
- '@fumadocs/tailwind@0.1.2':
- resolution: {integrity: sha512-VppeXgIRXjZMgpf2qijj1hcfxyeYl1s0ok8k6N3jyjiX64M7sDwnt2zGPd6dbfDybgbBvDw6C6J1e42gB5NzsA==}
+ '@fumadocs/base-ui@16.17.1':
+ resolution: {integrity: sha512-Gm/XRTYum2RafuzI4RV95Pr8+C8fgzsry5m/HYkrYCHy2L0TZISvVGkXlqh4ZiCIbrmpRXBbL1WX/HX37drOLQ==}
+ peerDependencies:
+ '@types/mdx': '*'
+ '@types/react': '*'
+ fumadocs-core: 16.17.1
+ next: ~16.3.8
+ react: ^19.2.0
+ react-dom: ^19.2.0
+ takumi-js: '*'
+ peerDependenciesMeta:
+ '@types/mdx':
+ optional: true
+ '@types/react':
+ optional: true
+ next:
+ optional: true
+ takumi-js:
+ optional: true
+
+ '@fumadocs/tailwind@0.1.3':
+ resolution: {integrity: sha512-gDgLbTnY5b+nogCg2y/pP7GsaQS4Zt/0vftJAu07Wy7Wsb3/lwd9GwoGqccCnPElTFwMG+pPwrmHXBPexEfE8A==}
peerDependencies:
tailwindcss: ^4.0.0
peerDependenciesMeta:
@@ -3404,64 +3424,9 @@ packages:
peerDependencies:
preact: '>= 10.25.0 || >=11.0.0-0'
- '@radix-ui/number@1.1.3':
- resolution: {integrity: sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==}
-
'@radix-ui/primitive@1.1.7':
resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==}
- '@radix-ui/react-accordion@1.2.21':
- resolution: {integrity: sha512-2fmc6COuKLq2k3P7JZrOt9Zf8HT9nTQhHN5V+A3ih7ftqoyDcoEUrPoLq8ngr7QwTd7hpQ2xoUKWtvy1Xw9RAQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-arrow@1.1.16':
- resolution: {integrity: sha512-nXPI1tzJsnQw8oXvB2r49rO9TIbbJ8VFeaWDiBsqY8+iwO5xb7WjUsrXDagjAgPKTdhW8WODQnAltUhBx8I+sg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-collapsible@1.1.21':
- resolution: {integrity: sha512-IzkusZHCZBnED5skW+b+syl8d+e3+zelvxZ2Ed9lfawqEBfa5osPj53sTJ+q/uNmGAj9e7wMYgyzwPu/luWJ4Q==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-collection@1.1.16':
- resolution: {integrity: sha512-yEQrjfI5eBbeYEJXOASpm+gs9eNHY8+UjkZ81GzcuwdLrSMOlEM8jnGoGdeGo92oiBMkuwZUhHTsnsrDiJLcyA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
'@radix-ui/react-compose-refs@1.1.5':
resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==}
peerDependencies:
@@ -3493,28 +3458,6 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-dialog@1.2.0':
- resolution: {integrity: sha512-l5CX8HdNL+9cc4s7HkNyplumSA3FIx68sg9dttBHKr286fRBwq1MBniDVTeI/tkof92/APntMQvC1YG1Khb0Cg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-direction@1.1.5':
- resolution: {integrity: sha512-/NlO/rOqQabmg+GGr86vCmbJVhqTv85NfM9g6Gknf/JVygXeZ6e6HM/RW1omerW9HsFtecwNqgEAKV6UqDsvpA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
'@radix-ui/react-dismissable-layer@1.1.19':
resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==}
peerDependencies:
@@ -3528,19 +3471,6 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-dismissable-layer@1.1.20':
- resolution: {integrity: sha512-35WHRrycfnj2m4LvPiKMKHGLM3Y2WvUA744CkRdxjs1BGDX1c8PVMfmiSGTUwnHRbqdtIoxveYTXvcJSt7VfgQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
'@radix-ui/react-focus-guards@1.1.6':
resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==}
peerDependencies:
@@ -3563,19 +3493,6 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-focus-scope@1.2.0':
- resolution: {integrity: sha512-I5S7vsAOozx2lWSBAyuXjWIJ/A8qx4fjbv6115WoaRYQSb1yZDaeNHonUAQzXyE8oD+0whJHbQRl4HIE2gQ0Xw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
'@radix-ui/react-id@1.1.4':
resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==}
peerDependencies:
@@ -3585,45 +3502,6 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-navigation-menu@1.3.0':
- resolution: {integrity: sha512-hZqTqDwc8Z5aI4rGIyPqCSJ2JoSNorqX/F1/gqNHkZzWJO6JuYzL7hn5sWOZJjpkfT+cbxWWRbKVU/IeiOM9ag==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-popover@1.2.0':
- resolution: {integrity: sha512-e70Nh+0iQ+hRAIM2nAGib5BhaDL2Rjlzxw9kIzsU2nz+t3/t82Z5qtPhY5nTnfj8FbmrU6RRIKH8RF3ynCe+vw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-popper@1.3.8':
- resolution: {integrity: sha512-y92/9iIdG1FyNvow0Y0qP5WJZ7oRTAKDVKCy9kJnhZfItwIKYtt0KKQeOhBKfXz0ETizduKwDRbrQHrTQScs5A==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
'@radix-ui/react-portal@1.1.17':
resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==}
peerDependencies:
@@ -3637,19 +3515,6 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-portal@1.1.18':
- resolution: {integrity: sha512-ygFIJ+QXNKf72AAq8x3hd22+ws7pYpmc1S0E4kW0Je+qD4qEb3FvxeKVQRGrVDMOkQaYfsB+Qs+KDh81a1gAOw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
'@radix-ui/react-presence@1.1.10':
resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==}
peerDependencies:
@@ -3663,19 +3528,6 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-presence@1.1.11':
- resolution: {integrity: sha512-Z7/atlkab36Z8hm+V8zYc79r0W+tiOB1o0tun1By94JyadkekLQmtEAnBSP9XKXBNQsStoStS4+gX10JpS5akA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
'@radix-ui/react-primitive@2.1.10':
resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==}
peerDependencies:
@@ -3689,45 +3541,6 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-primitive@2.1.11':
- resolution: {integrity: sha512-RzcaSw5aKl0OPhBJ1wbolKSF6nVvN+0o/QLeIVq+09npiPdnCkPggy2k6gI6yetxl4ZyrlBPYFgCB8BQJZwXcQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-roving-focus@1.1.20':
- resolution: {integrity: sha512-+ZjbkU21fTSJdn4nq/IFKUdKS+JSZHORBZ8ma1f6YpOMNzRt0xf3sVAWVK/+ktHCajPy4HYDsyHXZIZmOMxzIA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-scroll-area@1.3.0':
- resolution: {integrity: sha512-1WSuAXaahfeLmFX/dfYo/ftg1filMfaWjVye2d40VlgtWMMq/NOVocfukZEXkG+dwrAoNI+qpo9bjhNSJ/XC8g==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
'@radix-ui/react-slot@1.3.3':
resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==}
peerDependencies:
@@ -3737,28 +3550,6 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-slot@1.4.0':
- resolution: {integrity: sha512-IuMVHZ+Ah5fkctu3X3qeFrV/ZrBcuWuDTFUUPfS/L5hvoTjzhp/HdWGE14CsQombPdEidsa33HVlYZXi49PZ1Q==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-tabs@1.1.22':
- resolution: {integrity: sha512-GmVH+P3wx1ZPMuH7WajQzygZIbqgnsb5h8z4Ow3sQMuDqgcqISSBNom6MLVNJvfrkuJTtqfXc3ZolHjX+w0CHg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
'@radix-ui/react-use-callback-ref@1.1.4':
resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==}
peerDependencies:
@@ -3786,15 +3577,6 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-use-is-hydrated@0.1.3':
- resolution: {integrity: sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
'@radix-ui/react-use-layout-effect@1.1.4':
resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==}
peerDependencies:
@@ -3804,49 +3586,6 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-use-previous@1.1.4':
- resolution: {integrity: sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-rect@1.1.4':
- resolution: {integrity: sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-size@1.1.5':
- resolution: {integrity: sha512-V1McDQkMGzgivwqdu7u96APs7oi0Jvj9LTzgq3WWrDZqxWdAqU9yZnZQqk5OizGFR8badUQwZsrlao7MOlWYOA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-visually-hidden@1.2.12':
- resolution: {integrity: sha512-/iPLVHRBzKWvekN+5xaDmXw80f+nleYYceomVORrGjuJe0LF2SCbSH4f/LG4hu32q92QSuPZx4hmSACYBVBfzQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/rect@1.1.3':
- resolution: {integrity: sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==}
-
'@react-email/render@2.1.0':
resolution: {integrity: sha512-F+zE3O6d6sW6Aj2UjvZAA17R7tJKM7kcq2mgV6k4HCT8jeLLFaVP2txMtH1lgqYFRMZ0Gxsd37q2PRyiXLXXxA==}
engines: {node: '>=20.0.0'}
@@ -6613,10 +6352,6 @@ packages:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
- entities@6.0.1:
- resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
- engines: {node: '>=0.12'}
-
entities@8.1.0:
resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==}
engines: {node: '>=20.19.0'}
@@ -7030,8 +6765,8 @@ packages:
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
- fumadocs-core@16.16.2:
- resolution: {integrity: sha512-nC7NMDGbfgLa4NuA2X30QJt+zcE+xIiuATCrbWZD742fC6+DccgTQCBP9Ry0/OXdYrFtlsIcpO4MhzV9NkBvRw==}
+ fumadocs-core@16.17.1:
+ resolution: {integrity: sha512-zquUMPZaCEdsxFZ6ReZPzVN2yCP9tS3GZRndK0WtxbsvZ9KvvUDCeoLIpOZ6d3JU0uwSsclaIUGxI5ifvTftOQ==}
peerDependencies:
'@mdx-js/mdx': '*'
'@mixedbread/sdk': 0.x.x
@@ -7132,26 +6867,6 @@ packages:
vite:
optional: true
- fumadocs-ui@16.16.2:
- resolution: {integrity: sha512-pP8+B8cZ20WYYlwg1LsrN/ZowcivK24c9/RMzRx1inPZbjV66ga76NwWEhBmK7VX5OC/TSxGpDpxQ/bcI2XiqQ==}
- peerDependencies:
- '@types/mdx': '*'
- '@types/react': '*'
- fumadocs-core: 16.16.2
- next: ~16.3.8
- react: ^19.2.0
- react-dom: ^19.2.0
- takumi-js: '*'
- peerDependenciesMeta:
- '@types/mdx':
- optional: true
- '@types/react':
- optional: true
- next:
- optional: true
- takumi-js:
- optional: true
-
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
@@ -7279,15 +6994,12 @@ packages:
resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
engines: {node: '>= 0.4'}
- hast-util-from-parse5@8.0.3:
- resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==}
+ hast-util-from-dom@5.0.1:
+ resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==}
hast-util-parse-selector@4.0.0:
resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
- hast-util-raw@9.1.0:
- resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==}
-
hast-util-to-estree@3.1.3:
resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==}
@@ -7297,9 +7009,6 @@ packages:
hast-util-to-jsx-runtime@2.3.6:
resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==}
- hast-util-to-parse5@8.0.1:
- resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==}
-
hast-util-whitespace@3.0.0:
resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
@@ -8478,9 +8187,6 @@ packages:
parse-srcset@1.0.2:
resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==}
- parse5@7.3.0:
- resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
-
parse5@8.0.1:
resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==}
@@ -8889,9 +8595,6 @@ packages:
regex@6.1.0:
resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==}
- rehype-raw@7.0.0:
- resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
-
rehype-recma@1.0.0:
resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==}
@@ -9693,9 +9396,6 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
- vfile-location@5.0.3:
- resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
-
vfile-message@4.0.3:
resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
@@ -10901,7 +10601,34 @@ snapshots:
optionalDependencies:
'@types/react': 19.3.0
- '@fumadocs/tailwind@0.1.2(tailwindcss@4.3.3)':
+ '@fumadocs/base-ui@16.17.1(@date-fns/tz@1.5.0)(@types/mdx@2.0.14)(@types/react@19.3.0)(date-fns@4.4.0)(fumadocs-core@16.17.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(tailwindcss@4.3.3)':
+ dependencies:
+ '@base-ui/react': 1.8.0(@date-fns/tz@1.5.0)(@types/react@19.3.0)(date-fns@4.4.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ '@fuma-translate/react': 1.0.2(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ '@fumadocs/tailwind': 0.1.3(tailwindcss@4.3.3)
+ class-variance-authority: 0.7.1
+ cn: 0.4.0
+ fumadocs-core: 16.17.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5)
+ hast-util-to-jsx-runtime: 2.3.6
+ lucide-react: 1.52.0(@types/react@19.3.0)(react@19.3.0)
+ motion: 14.0.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ next-themes: 0.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
+ react-remove-scroll: 2.7.2(@types/react@19.3.0)(react@19.3.0)
+ scroll-into-view-if-needed: 3.1.0
+ shiki: 4.5.0
+ optionalDependencies:
+ '@types/mdx': 2.0.14
+ '@types/react': 19.3.0
+ next: 16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ transitivePeerDependencies:
+ - '@date-fns/tz'
+ - date-fns
+ - supports-color
+ - tailwindcss
+
+ '@fumadocs/tailwind@0.1.3(tailwindcss@4.3.3)':
optionalDependencies:
tailwindcss: 4.3.3
@@ -11980,74 +11707,18 @@ snapshots:
tsyringe: 4.10.0
'@playwright/test@1.61.1':
- dependencies:
- playwright: 1.61.1
- optional: true
-
- '@preact/signals-core@1.14.4': {}
-
- '@preact/signals@2.11.3(preact@10.29.8)':
- dependencies:
- '@preact/signals-core': 1.14.4
- preact: 10.29.8
-
- '@radix-ui/number@1.1.3': {}
-
- '@radix-ui/primitive@1.1.7': {}
-
- '@radix-ui/react-accordion@1.2.21(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/primitive': 1.1.7
- '@radix-ui/react-collapsible': 1.1.21(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-collection': 1.1.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-direction': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
- '@radix-ui/react-arrow@1.1.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
- '@radix-ui/react-collapsible@1.1.21(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/primitive': 1.1.7
- '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-presence': 1.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
+ dependencies:
+ playwright: 1.61.1
+ optional: true
+
+ '@preact/signals-core@1.14.4': {}
- '@radix-ui/react-collection@1.1.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
+ '@preact/signals@2.11.3(preact@10.29.8)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-slot': 1.4.0(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
+ '@preact/signals-core': 1.14.4
+ preact: 10.29.8
+
+ '@radix-ui/primitive@1.1.7': {}
'@radix-ui/react-compose-refs@1.1.5(@types/react@19.3.0)(react@19.3.0)':
dependencies:
@@ -12084,35 +11755,6 @@ snapshots:
'@types/react': 19.3.0
'@types/react-dom': 19.3.0(@types/react@19.3.0)
- '@radix-ui/react-dialog@1.2.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/primitive': 1.1.7
- '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-dismissable-layer': 1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-focus-scope': 1.2.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-portal': 1.1.18(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-presence': 1.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-slot': 1.4.0(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- aria-hidden: 1.2.6
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- react-remove-scroll: 2.7.2(@types/react@19.3.0)(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
- '@radix-ui/react-direction@1.1.5(@types/react@19.3.0)(react@19.3.0)':
- dependencies:
- react: 19.3.0
- optionalDependencies:
- '@types/react': 19.3.0
-
'@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
dependencies:
'@radix-ui/primitive': 1.1.7
@@ -12126,19 +11768,6 @@ snapshots:
'@types/react': 19.3.0
'@types/react-dom': 19.3.0(@types/react@19.3.0)
- '@radix-ui/react-dismissable-layer@1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/primitive': 1.1.7
- '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
'@radix-ui/react-focus-guards@1.1.6(@types/react@19.3.0)(react@19.3.0)':
dependencies:
react: 19.3.0
@@ -12156,17 +11785,6 @@ snapshots:
'@types/react': 19.3.0
'@types/react-dom': 19.3.0(@types/react@19.3.0)
- '@radix-ui/react-focus-scope@1.2.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
'@radix-ui/react-id@1.1.4(@types/react@19.3.0)(react@19.3.0)':
dependencies:
'@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
@@ -12174,71 +11792,6 @@ snapshots:
optionalDependencies:
'@types/react': 19.3.0
- '@radix-ui/react-navigation-menu@1.3.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/primitive': 1.1.7
- '@radix-ui/react-collection': 1.1.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-direction': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-dismissable-layer': 1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-presence': 1.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-slot': 1.4.0(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-previous': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-visually-hidden': 1.2.12(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
- '@radix-ui/react-popover@1.2.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/primitive': 1.1.7
- '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-dismissable-layer': 1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-focus-scope': 1.2.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-popper': 1.3.8(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-portal': 1.1.18(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-presence': 1.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-slot': 1.4.0(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- aria-hidden: 1.2.6
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- react-remove-scroll: 2.7.2(@types/react@19.3.0)(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
- '@radix-ui/react-popper@1.3.8(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@floating-ui/react-dom': 2.1.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-arrow': 1.1.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-rect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-size': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/rect': 1.1.3
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
'@radix-ui/react-portal@1.1.17(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
dependencies:
'@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
@@ -12249,16 +11802,6 @@ snapshots:
'@types/react': 19.3.0
'@types/react-dom': 19.3.0(@types/react@19.3.0)
- '@radix-ui/react-portal@1.1.18(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
'@radix-ui/react-presence@1.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
dependencies:
'@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
@@ -12268,15 +11811,6 @@ snapshots:
'@types/react': 19.3.0
'@types/react-dom': 19.3.0(@types/react@19.3.0)
- '@radix-ui/react-presence@1.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
'@radix-ui/react-primitive@2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
dependencies:
'@radix-ui/react-slot': 1.3.3(@types/react@19.3.0)(react@19.3.0)
@@ -12286,52 +11820,6 @@ snapshots:
'@types/react': 19.3.0
'@types/react-dom': 19.3.0(@types/react@19.3.0)
- '@radix-ui/react-primitive@2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/react-slot': 1.4.0(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
- '@radix-ui/react-roving-focus@1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/primitive': 1.1.7
- '@radix-ui/react-collection': 1.1.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-direction': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
- '@radix-ui/react-scroll-area@1.3.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/number': 1.1.3
- '@radix-ui/primitive': 1.1.7
- '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-direction': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-presence': 1.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-slot': 1.4.0(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
'@radix-ui/react-slot@1.3.3(@types/react@19.3.0)(react@19.3.0)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
@@ -12339,29 +11827,6 @@ snapshots:
optionalDependencies:
'@types/react': 19.3.0
- '@radix-ui/react-slot@1.4.0(@types/react@19.3.0)(react@19.3.0)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- optionalDependencies:
- '@types/react': 19.3.0
-
- '@radix-ui/react-tabs@1.1.22(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/primitive': 1.1.7
- '@radix-ui/react-context': 1.2.2(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-direction': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-presence': 1.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-roving-focus': 1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
'@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.3.0)(react@19.3.0)':
dependencies:
react: 19.3.0
@@ -12384,49 +11849,12 @@ snapshots:
optionalDependencies:
'@types/react': 19.3.0
- '@radix-ui/react-use-is-hydrated@0.1.3(@types/react@19.3.0)(react@19.3.0)':
- dependencies:
- react: 19.3.0
- optionalDependencies:
- '@types/react': 19.3.0
-
'@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.3.0)(react@19.3.0)':
dependencies:
react: 19.3.0
optionalDependencies:
'@types/react': 19.3.0
- '@radix-ui/react-use-previous@1.1.4(@types/react@19.3.0)(react@19.3.0)':
- dependencies:
- react: 19.3.0
- optionalDependencies:
- '@types/react': 19.3.0
-
- '@radix-ui/react-use-rect@1.1.4(@types/react@19.3.0)(react@19.3.0)':
- dependencies:
- '@radix-ui/rect': 1.1.3
- react: 19.3.0
- optionalDependencies:
- '@types/react': 19.3.0
-
- '@radix-ui/react-use-size@1.1.5(@types/react@19.3.0)(react@19.3.0)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0)
- react: 19.3.0
- optionalDependencies:
- '@types/react': 19.3.0
-
- '@radix-ui/react-visually-hidden@1.2.12(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
- '@types/react-dom': 19.3.0(@types/react@19.3.0)
-
- '@radix-ui/rect@1.1.3': {}
-
'@react-email/render@2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
dependencies:
entities: 4.5.0
@@ -14984,8 +14412,6 @@ snapshots:
entities@4.5.0: {}
- entities@6.0.1: {}
-
entities@8.1.0: {}
env-paths@2.2.1: {}
@@ -15573,15 +14999,17 @@ snapshots:
fsevents@2.3.3:
optional: true
- fumadocs-core@16.16.2(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5):
+ fumadocs-core@16.17.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5):
dependencies:
'@fumari/image-size': 0.1.1
estree-util-value-to-estree: 3.5.0
github-slugger: 2.0.0
+ hast-util-from-dom: 5.0.1
hast-util-to-estree: 3.1.3
hast-util-to-jsx-runtime: 2.3.6
mdast-util-mdx: 3.0.0
- mdast-util-to-markdown: 2.2.0
+ micromark: 4.0.3
+ micromark-extension-gfm-table: 2.1.2
npm-to-yarn: 3.2.0
remark: 15.0.1
remark-gfm: 4.0.1
@@ -15590,7 +15018,6 @@ snapshots:
shiki: 4.5.0
tinyglobby: 0.2.17
unified: 11.0.5
- unist-util-visit: 5.1.0
vfile: 6.0.3
yaml: 2.9.1
zbsearch: 4.0.1
@@ -15609,14 +15036,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- fumadocs-mdx@15.4.6(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.3.0)(fumadocs-core@16.16.2(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(rolldown@1.2.13)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)):
+ fumadocs-mdx@15.4.6(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.3.0)(fumadocs-core@16.17.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(rolldown@1.2.13)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)):
dependencies:
'@mdx-js/mdx': 3.1.1
'@standard-schema/spec': 1.1.0
chokidar: 5.0.0
esbuild: 0.28.2
estree-util-value-to-estree: 3.5.0
- fumadocs-core: 16.16.2(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5)
+ fumadocs-core: 16.17.1(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5)
github-slugger: 2.0.0
magic-string: 1.4.3
mdast-util-mdx: 3.0.0
@@ -15642,41 +15069,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- fumadocs-ui@16.16.2(@types/mdx@2.0.14)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(fumadocs-core@16.16.2(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(tailwindcss@4.3.3):
- dependencies:
- '@fuma-translate/react': 1.0.2(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@fumadocs/tailwind': 0.1.2(tailwindcss@4.3.3)
- '@radix-ui/react-accordion': 1.2.21(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-collapsible': 1.1.21(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-dialog': 1.2.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-direction': 1.1.5(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-navigation-menu': 1.3.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-popover': 1.2.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-presence': 1.1.11(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-scroll-area': 1.3.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@radix-ui/react-slot': 1.4.0(@types/react@19.3.0)(react@19.3.0)
- '@radix-ui/react-tabs': 1.1.22(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- class-variance-authority: 0.7.1
- cn: 0.4.0
- fumadocs-core: 16.16.2(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.52.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5)
- lucide-react: 1.52.0(@types/react@19.3.0)(react@19.3.0)
- motion: 14.0.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- next-themes: 0.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- react-remove-scroll: 2.7.2(@types/react@19.3.0)(react@19.3.0)
- rehype-raw: 7.0.0
- scroll-into-view-if-needed: 3.1.0
- shiki: 4.5.0
- unist-util-visit: 5.1.0
- optionalDependencies:
- '@types/mdx': 2.0.14
- '@types/react': 19.3.0
- next: 16.3.8(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.4)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- transitivePeerDependencies:
- - '@types/react-dom'
- - tailwindcss
-
function-bind@1.1.2: {}
function-timeout@1.0.2: {}
@@ -15799,37 +15191,16 @@ snapshots:
dependencies:
function-bind: 1.1.2
- hast-util-from-parse5@8.0.3:
+ hast-util-from-dom@5.0.1:
dependencies:
'@types/hast': 3.0.5
- '@types/unist': 3.0.3
- devlop: 1.1.0
hastscript: 9.0.1
- property-information: 7.2.0
- vfile: 6.0.3
- vfile-location: 5.0.3
web-namespaces: 2.0.1
hast-util-parse-selector@4.0.0:
dependencies:
'@types/hast': 3.0.5
- hast-util-raw@9.1.0:
- dependencies:
- '@types/hast': 3.0.5
- '@types/unist': 3.0.3
- '@ungap/structured-clone': 1.4.0
- hast-util-from-parse5: 8.0.3
- hast-util-to-parse5: 8.0.1
- html-void-elements: 3.0.0
- mdast-util-to-hast: 13.2.1
- parse5: 7.3.0
- unist-util-position: 5.0.0
- unist-util-visit: 5.1.0
- vfile: 6.0.3
- web-namespaces: 2.0.1
- zwitch: 2.0.4
-
hast-util-to-estree@3.1.3:
dependencies:
'@types/estree': 1.0.9
@@ -15885,16 +15256,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- hast-util-to-parse5@8.0.1:
- dependencies:
- '@types/hast': 3.0.5
- comma-separated-tokens: 2.0.3
- devlop: 1.1.0
- property-information: 7.2.0
- space-separated-tokens: 2.0.2
- web-namespaces: 2.0.1
- zwitch: 2.0.4
-
hast-util-whitespace@3.0.0:
dependencies:
'@types/hast': 3.0.5
@@ -17310,10 +16671,6 @@ snapshots:
parse-srcset@1.0.2: {}
- parse5@7.3.0:
- dependencies:
- entities: 6.0.1
-
parse5@8.0.1:
dependencies:
entities: 8.1.0
@@ -17792,12 +17149,6 @@ snapshots:
dependencies:
regex-utilities: 2.3.0
- rehype-raw@7.0.0:
- dependencies:
- '@types/hast': 3.0.5
- hast-util-raw: 9.1.0
- vfile: 6.0.3
-
rehype-recma@1.0.0:
dependencies:
'@types/estree': 1.0.9
@@ -18746,11 +18097,6 @@ snapshots:
vary@1.1.2: {}
- vfile-location@5.0.3:
- dependencies:
- '@types/unist': 3.0.3
- vfile: 6.0.3
-
vfile-message@4.0.3:
dependencies:
'@types/unist': 3.0.3
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 04331bae30..0dc2ffbd06 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -17,3 +17,7 @@ overrides:
'seroval-plugins@<1.6.3': ~1.6.8
'esbuild@>=0.27.3 <0.28.1': ^0.28.2
'http-cache-semantics@<4.2.1': ^4.3.0
+minimumReleaseAgeExclude:
+ - '@fumadocs/base-ui@16.17.1'
+ - '@fumadocs/tailwind@0.1.3'
+ - fumadocs-core@16.17.1