From e8769cee19543a8358b83f3d624dccf0650ed61e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 26 Feb 2026 13:56:22 +0000 Subject: [PATCH] Migrate website components to shadcn UI primitives Co-authored-by: Aiden Bai --- packages/website/app/blog/agent/page.tsx | 9 +- packages/website/app/open-file/page.tsx | 124 +++-- .../website/components/benchmark-tooltip.tsx | 102 ++-- .../benchmarks/benchmark-charts.tsx | 52 ++- .../benchmarks/benchmark-detailed-table.tsx | 232 ++++++---- .../website/components/blocks/code-block.tsx | 8 +- .../blocks/read-tool-call-block.tsx | 9 +- packages/website/components/demo-footer.tsx | 24 +- packages/website/components/github-button.tsx | 7 +- .../components/grab-element-button.tsx | 15 +- packages/website/components/install-tabs.tsx | 141 +++--- packages/website/components/ui/button.tsx | 65 +++ packages/website/components/ui/card.tsx | 91 ++++ .../website/components/ui/collapsible.tsx | 59 +-- packages/website/components/ui/input.tsx | 24 + .../website/components/ui/scroll-area.tsx | 53 +++ packages/website/components/ui/scrollable.tsx | 106 +---- packages/website/components/ui/select.tsx | 172 +++++++ packages/website/components/ui/table.tsx | 131 ++++++ packages/website/components/ui/tabs.tsx | 71 +++ packages/website/components/ui/tooltip.tsx | 59 +++ .../website/components/view-docs-button.tsx | 7 +- packages/website/package.json | 6 + pnpm-lock.yaml | 436 +++++++++++++++++- 24 files changed, 1511 insertions(+), 492 deletions(-) create mode 100644 packages/website/components/ui/button.tsx create mode 100644 packages/website/components/ui/card.tsx create mode 100644 packages/website/components/ui/input.tsx create mode 100644 packages/website/components/ui/scroll-area.tsx create mode 100644 packages/website/components/ui/select.tsx create mode 100644 packages/website/components/ui/table.tsx create mode 100644 packages/website/components/ui/tabs.tsx create mode 100644 packages/website/components/ui/tooltip.tsx diff --git a/packages/website/app/blog/agent/page.tsx b/packages/website/app/blog/agent/page.tsx index 1c5e6f004..d50a56c3f 100644 --- a/packages/website/app/blog/agent/page.tsx +++ b/packages/website/app/blog/agent/page.tsx @@ -12,6 +12,7 @@ import { GithubButton } from "@/components/github-button"; import { ViewDocsButton } from "@/components/view-docs-button"; import { BlogArticleLayout } from "@/components/blog-article-layout"; import { COPY_FEEDBACK_DURATION_MS } from "@/constants"; +import { Button } from "@/components/ui/button"; interface HighlightedCodeBlockProps { code: string; @@ -43,13 +44,15 @@ const HighlightedCodeBlock = ({ code, lang }: HighlightedCodeBlockProps) => { return (
- + {highlightedHtml ? (
{ + const matchingEditor = EDITOR_OPTIONS.find( + (innerEditorValue) => innerEditorValue === value, + ); + return matchingEditor ?? "cursor"; +}; + const getEditorUrl = ( editor: Editor, filePath: string, @@ -73,24 +89,9 @@ const OpenFileContent = () => { return getInitialEditor().editor; }); const [didAttemptOpen, setDidAttemptOpen] = useState(false); - const [isDropdownOpen, setIsDropdownOpen] = useState(false); + const [isEditorSelectOpen, setIsEditorSelectOpen] = useState(false); const [hasSavedPreference] = useState(() => getInitialEditor().hasSaved); const [isInfoOpen, setIsInfoOpen] = useState(false); - const dropdownRef = useRef(null); - - useEffect(() => { - const handleClickOutside = (event: MouseEvent) => { - if ( - dropdownRef.current && - !dropdownRef.current.contains(event.target as Node) - ) { - setIsDropdownOpen(false); - } - }; - - document.addEventListener("mousedown", handleClickOutside); - return () => document.removeEventListener("mousedown", handleClickOutside); - }, []); const handleOpen = useCallback(() => { if (!resolvedFilePath) return; @@ -115,14 +116,14 @@ const OpenFileContent = () => { useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { - if (event.key === "Enter" && !isDropdownOpen) { + if (event.key === "Enter" && !isEditorSelectOpen) { handleOpen(); } }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); - }, [handleOpen, isDropdownOpen]); + }, [handleOpen, isEditorSelectOpen]); const handleEditorChange = (editor: Editor) => { setPreferredEditor(editor); @@ -130,16 +131,15 @@ const OpenFileContent = () => { localStorage.setItem(STORAGE_KEY, editor); } setEditorParam(editor); - setIsDropdownOpen(false); }; const fileName = resolvedFilePath.split("/").pop() ?? "file"; - const selectedEditor = EDITORS.find((e) => e.id === preferredEditor); + const selectedEditor = EDITORS.find((innerEditor) => innerEditor.id === preferredEditor); if (!resolvedFilePath) { return (
-
+
@@ -150,7 +150,7 @@ const OpenFileContent = () => { {" "} to the URL.
-
+
); } @@ -167,7 +167,7 @@ const OpenFileContent = () => {
-
+
Opening @@ -187,75 +187,63 @@ const OpenFileContent = () => { {resolvedFilePath}
-
-
- +

Your preference will be saved for future use.

Only open files from trusted sources.

-
+
- + {isInfoOpen && (

diff --git a/packages/website/components/benchmark-tooltip.tsx b/packages/website/components/benchmark-tooltip.tsx index 4f0cd11a8..9b09dd3f5 100644 --- a/packages/website/components/benchmark-tooltip.tsx +++ b/packages/website/components/benchmark-tooltip.tsx @@ -1,7 +1,7 @@ "use client"; -import { useState, useRef, useEffect, type ReactElement } from "react"; -import { motion, AnimatePresence, useReducedMotion } from "motion/react"; +import { useState, type ReactElement } from "react"; +import { motion, useReducedMotion } from "motion/react"; import Link from "next/link"; import { BENCHMARK_CONTROL_COLOR, @@ -10,8 +10,12 @@ import { BENCHMARK_TOOLTIP_TREATMENT_SECONDS, BENCHMARK_TOOLTIP_MAX_SECONDS, BENCHMARK_TOOLTIP_SPEEDUP_FACTOR, - TOOLTIP_HOVER_DELAY_MS, } from "@/constants"; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from "@/components/ui/tooltip"; interface BenchmarkTooltipProps { href: string; @@ -190,71 +194,37 @@ export const BenchmarkTooltip = ({ className, }: BenchmarkTooltipProps): ReactElement => { const shouldReduceMotion = Boolean(useReducedMotion()); - const [isHovered, setIsHovered] = useState(false); - const [isVisible, setIsVisible] = useState(false); - const timeoutRef = useRef(null); - - const handleMouseEnter = () => { - timeoutRef.current = setTimeout(() => { - setIsHovered(true); - setIsVisible(true); - }, TOOLTIP_HOVER_DELAY_MS); - }; - - const handleMouseLeave = () => { - if (timeoutRef.current) { - clearTimeout(timeoutRef.current); - } - setIsHovered(false); - setIsVisible(false); - }; - - useEffect(() => { - return () => { - if (timeoutRef.current) { - clearTimeout(timeoutRef.current); - } - }; - }, []); + const [isTooltipOpen, setIsTooltipOpen] = useState(false); return ( - - - {children} - - - {isHovered && ( - -

-
- -
- - )} - - + + + + {children} + + + + + + + + ); }; diff --git a/packages/website/components/benchmarks/benchmark-charts.tsx b/packages/website/components/benchmarks/benchmark-charts.tsx index bebfdc836..c647a392a 100644 --- a/packages/website/components/benchmarks/benchmark-charts.tsx +++ b/packages/website/components/benchmarks/benchmark-charts.tsx @@ -25,6 +25,14 @@ import { BENCHMARK_TREATMENT_COLOR, BENCHMARK_LIVE_COUNTER_INTERVAL_MS, } from "@/constants"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; const formatMetricValue = ( value: number, @@ -566,16 +574,16 @@ export const BenchmarkCharts = ({ results }: BenchmarkChartsProps) => {
- - - -
+ + + + Metric - - - - - - + + + + {metrics.map((metric) => ( - - - - - + + ))} - -
+ + Control - + +
{ React Grab
-
+ {metric.name} - + + {metric.control} - + + {metric.treatment} {metric.isImprovement ? "↓" : "↑"} {metric.change} -
+ +
diff --git a/packages/website/components/benchmarks/benchmark-detailed-table.tsx b/packages/website/components/benchmarks/benchmark-detailed-table.tsx index c08dcbaaa..301ec875d 100644 --- a/packages/website/components/benchmarks/benchmark-detailed-table.tsx +++ b/packages/website/components/benchmarks/benchmark-detailed-table.tsx @@ -5,6 +5,16 @@ import { useState, useMemo } from "react"; import { ChevronDown, ChevronUp, Search, ArrowUpDown } from "lucide-react"; import Image from "next/image"; import { BENCHMARK_TREATMENT_COLOR } from "@/constants"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; interface BenchmarkDetailedTableProps { results: BenchmarkResult[]; @@ -143,109 +153,139 @@ export const BenchmarkDetailedTable = ({ size={14} className="absolute left-3 top-1/2 -translate-y-1/2 text-neutral-500" /> - setSearchQuery(e.target.value)} - className="bg-[#1a1a1a] border border-[#2a2a2a] rounded-md py-1.5 pl-9 pr-3 text-xs text-neutral-200 placeholder:text-neutral-600 focus:outline-none focus:border-[#404040] w-full sm:w-[200px]" + className="h-8 w-full border-[#2a2a2a] bg-[#1a1a1a] py-1.5 pl-9 pr-3 text-xs text-neutral-200 placeholder:text-neutral-600 focus-visible:border-[#404040] sm:w-[200px]" />
- - - - - - - - - - - - - - - - - - - - - - - - + + + + {filteredAndSortedResults.length === 0 ? ( - - - + + ) : ( filteredAndSortedResults.map(([testName, results]) => { const control = results.control || ({} as BenchmarkResult); @@ -365,22 +405,22 @@ export const BenchmarkDetailedTable = ({ const prompt = testCaseMap[testName] || ""; return ( - - - - - - - - - - - - - + + ); }) )} - -
+ + + handleSort("testName")} + className="py-2 px-3 text-xs font-medium text-neutral-400 uppercase tracking-wider" > -
+
-
+ + handleSort("inputTokens")} + className="py-2 px-3 text-xs font-medium text-neutral-400 uppercase tracking-wider" > -
+
-
+ + handleSort("outputTokens")} + className="py-2 px-3 text-xs font-medium text-neutral-400 uppercase tracking-wider" > -
+
-
+ + handleSort("cost")} + className="py-2 px-3 text-xs font-medium text-neutral-400 uppercase tracking-wider" > -
+
-
+ + handleSort("duration")} + className="py-2 px-3 text-xs font-medium text-neutral-400 uppercase tracking-wider" > -
+
-
+ + handleSort("toolCalls")} + className="py-2 px-3 text-xs font-medium text-neutral-400 uppercase tracking-wider" > -
+
-
+ + + + + Control - + +
-
+ + Control - + +
-
+ + Control - + +
-
+ + Control - + +
-
+ + Control - + +
-
+ + No results found matching "{searchQuery}" -
{testName} - + + {control.inputTokens ? control.inputTokens.toLocaleString() : "-"} - + )} - + + {control.outputTokens ? control.outputTokens.toLocaleString() : "-"} - + )} - + + {control.costUsd !== undefined ? "$" + control.costUsd.toFixed(2) : "-"} - + )} - + + {control.durationMs ? prettyMs(control.durationMs) : "-"} - + )} - + + {control.toolCalls !== undefined ? control.toolCalls : "-"} - + )} -
+ +
); diff --git a/packages/website/components/blocks/code-block.tsx b/packages/website/components/blocks/code-block.tsx index 546851591..c29ef418b 100644 --- a/packages/website/components/blocks/code-block.tsx +++ b/packages/website/components/blocks/code-block.tsx @@ -6,6 +6,7 @@ import { CODE_BLOCK_COLLAPSE_LINE_THRESHOLD, CODE_BLOCK_MAX_HEIGHT_PX, } from "@/constants"; +import { Button } from "@/components/ui/button"; import { type StreamRenderedBlock } from "@/hooks/use-stream"; import { highlightCode } from "@/lib/shiki"; import { StreamingText } from "./streaming-text"; @@ -75,9 +76,10 @@ export const CodeBlock = ({ block }: CodeBlockProps): ReactElement => { )} {shouldShowExpandButton && ( - + )} ); diff --git a/packages/website/components/blocks/read-tool-call-block.tsx b/packages/website/components/blocks/read-tool-call-block.tsx index 3498f4699..8f064e60e 100644 --- a/packages/website/components/blocks/read-tool-call-block.tsx +++ b/packages/website/components/blocks/read-tool-call-block.tsx @@ -2,6 +2,7 @@ import { useState, useRef, useEffect, type ReactElement } from "react"; import { CLICK_FEEDBACK_DURATION_MS } from "@/constants"; +import { Button } from "@/components/ui/button"; interface ReadToolCallBlockProps { parameter: string; @@ -38,15 +39,17 @@ export const ReadToolCallBlock = ({ return (
{displayName} - +
); }; diff --git a/packages/website/components/demo-footer.tsx b/packages/website/components/demo-footer.tsx index bdcd2736c..9983e2538 100644 --- a/packages/website/components/demo-footer.tsx +++ b/packages/website/components/demo-footer.tsx @@ -1,7 +1,9 @@ "use client"; import { type ReactElement } from "react"; +import Link from "next/link"; import { RotateCcw } from "lucide-react"; +import { Button } from "@/components/ui/button"; export const DemoFooter = (): ReactElement => { const handleRestartClick = () => { @@ -17,28 +19,24 @@ export const DemoFooter = (): ReactElement => { return (
- + · - + blog - {" "} + {" "} ·{" "} - + changelog - +
); }; diff --git a/packages/website/components/github-button.tsx b/packages/website/components/github-button.tsx index 9238e44ad..f61c13ecc 100644 --- a/packages/website/components/github-button.tsx +++ b/packages/website/components/github-button.tsx @@ -1,4 +1,6 @@ import { type ReactElement } from "react"; +import { buttonVariants } from "@/components/ui/button"; +import { cn } from "@/utils/cn"; import { IconGithub } from "./icons/icon-github"; export const GithubButton = (): ReactElement => { @@ -7,7 +9,10 @@ export const GithubButton = (): ReactElement => { href="https://github.com/aidenybai/react-grab" target="_blank" rel="noreferrer" - className="inline-flex items-center gap-2 rounded-md border border-white/20 bg-white px-3 py-1.5 text-sm text-black transition-all hover:bg-white/90 active:scale-[0.98] sm:text-base" + className={cn( + buttonVariants({ variant: "secondary", size: "sm" }), + "border border-white/20 bg-white px-3 py-1.5 text-sm text-black transition-all hover:bg-white/90 hover:text-black active:scale-[0.98] sm:text-base", + )} > Star on GitHub diff --git a/packages/website/components/grab-element-button.tsx b/packages/website/components/grab-element-button.tsx index 921c5a0d9..ec83e8b2a 100644 --- a/packages/website/components/grab-element-button.tsx +++ b/packages/website/components/grab-element-button.tsx @@ -11,6 +11,7 @@ import { } from "react"; import { motion, useReducedMotion } from "motion/react"; import { HOTKEY_KEYUP_DELAY_MS } from "@/constants"; +import { Button } from "@/components/ui/button"; import { cn } from "@/utils/cn"; import { detectMobile } from "@/utils/detect-mobile"; import { getKeyFromCode } from "@/utils/get-key-from-code"; @@ -398,10 +399,11 @@ export const GrabElementButton = ({ } /> )} - + {!hasAdvanced && !isActivated && ( {!hideSkip && showSkip && ( - + )} ); diff --git a/packages/website/components/install-tabs.tsx b/packages/website/components/install-tabs.tsx index 64269e92c..7624afe91 100644 --- a/packages/website/components/install-tabs.tsx +++ b/packages/website/components/install-tabs.tsx @@ -1,8 +1,11 @@ "use client"; import { useEffect, useState, useCallback, type ReactElement } from "react"; +import Link from "next/link"; import { Copy, Check } from "lucide-react"; import { COPY_FEEDBACK_DURATION_MS } from "@/constants"; +import { Button } from "@/components/ui/button"; +import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { cn } from "@/utils/cn"; import { detectMobile } from "@/utils/detect-mobile"; import { hotkeyToString } from "@/utils/hotkey-to-string"; @@ -366,84 +369,86 @@ export const InstallTabs = ({ {headingText} {activeTabId === "cli" && ( - + )} )} -
-
- {installTabsData.map((tab) => { - const isActive = tab.id === activeTab.id; - - return ( - - ); - })} -
-
-
- {activeTabId === "cli" ? ( - - ) : ( -
- - {highlightedCode ? ( -
- ) : ( -
-                    {activeCode}
-                  
- )} -
- )} + {highlightedCode ? ( +
+ ) : ( +
+                      {activeCode}
+                    
+ )} + + {didCopy ? : } + + + ) : ( +
+ + {highlightedCode ? ( +
+ ) : ( +
+                      {activeCode}
+                    
+ )} +
+ )} +
-
+ {activeTabId !== "cli" && ( {activeTab.description} @@ -452,9 +457,9 @@ export const InstallTabs = ({ {showAgentNote && activeTabId !== "cli" && ( Want to connect directly to your coding agent?{" "} - + See our agent connection guide - + )}
diff --git a/packages/website/components/ui/button.tsx b/packages/website/components/ui/button.tsx new file mode 100644 index 000000000..314195904 --- /dev/null +++ b/packages/website/components/ui/button.tsx @@ -0,0 +1,65 @@ +"use client"; + +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; +import type { ButtonHTMLAttributes, ReactElement } from "react"; +import { cn } from "@/utils/cn"; + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,background-color,border-color,box-shadow,transform,opacity] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-background aria-invalid:border-destructive", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground hover:bg-primary/90 focus-visible:ring-ring", + destructive: + "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/50", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80 focus-visible:ring-ring", + ghost: + "hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring", + link: "text-primary underline-offset-4 hover:underline focus-visible:ring-ring", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3", + lg: "h-10 rounded-md px-6", + icon: "size-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +interface ButtonProps + extends ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +export const Button = ({ + className, + variant, + size, + asChild = false, + ...props +}: ButtonProps): ReactElement => { + const Component = asChild ? Slot : "button"; + + return ( + + ); +}; + +Button.displayName = "Button"; + +export { buttonVariants }; diff --git a/packages/website/components/ui/card.tsx b/packages/website/components/ui/card.tsx new file mode 100644 index 000000000..b06ff93de --- /dev/null +++ b/packages/website/components/ui/card.tsx @@ -0,0 +1,91 @@ +"use client"; + +import type { HTMLAttributes, ReactElement } from "react"; +import { cn } from "@/utils/cn"; + +export const Card = ({ + className, + ...props +}: HTMLAttributes): ReactElement => { + return ( +
+ ); +}; + +export const CardHeader = ({ + className, + ...props +}: HTMLAttributes): ReactElement => { + return ( +
+ ); +}; + +export const CardTitle = ({ + className, + children, + ...props +}: HTMLAttributes): ReactElement => { + return ( +

+ {children} +

+ ); +}; + +export const CardDescription = ({ + className, + ...props +}: HTMLAttributes): ReactElement => { + return ( +

+ ); +}; + +export const CardContent = ({ + className, + ...props +}: HTMLAttributes): ReactElement => { + return ( +

+ ); +}; + +export const CardFooter = ({ + className, + ...props +}: HTMLAttributes): ReactElement => { + return ( +
+ ); +}; + +Card.displayName = "Card"; +CardHeader.displayName = "CardHeader"; +CardTitle.displayName = "CardTitle"; +CardDescription.displayName = "CardDescription"; +CardContent.displayName = "CardContent"; +CardFooter.displayName = "CardFooter"; diff --git a/packages/website/components/ui/collapsible.tsx b/packages/website/components/ui/collapsible.tsx index 3fc42b216..64b5f6d90 100644 --- a/packages/website/components/ui/collapsible.tsx +++ b/packages/website/components/ui/collapsible.tsx @@ -1,8 +1,10 @@ "use client"; -import { useState, useMemo, type ReactElement, type ReactNode } from "react"; +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible"; import { motion, AnimatePresence } from "motion/react"; import { ChevronDown, ChevronRight } from "lucide-react"; +import { useMemo, useState, type ReactElement, type ReactNode } from "react"; +import { Button } from "@/components/ui/button"; interface CollapsibleProps { header: ReactNode; @@ -31,44 +33,47 @@ export const Collapsible = ({ return defaultExpanded; }, [manualExpanded, isStreaming, defaultExpanded, autoExpandOnStreaming]); - const handleToggle = () => { - setManualExpanded(!isExpanded); - }; - return ( -
-
- - + + {isExpanded && ( - - {children} - + + + {children} + + )} -
+ ); }; diff --git a/packages/website/components/ui/input.tsx b/packages/website/components/ui/input.tsx new file mode 100644 index 000000000..90d46120c --- /dev/null +++ b/packages/website/components/ui/input.tsx @@ -0,0 +1,24 @@ +"use client"; + +import type { InputHTMLAttributes, ReactElement } from "react"; +import { cn } from "@/utils/cn"; + +export const Input = ({ + className, + type = "text", + ...props +}: InputHTMLAttributes): ReactElement => { + return ( + + ); +}; + +Input.displayName = "Input"; diff --git a/packages/website/components/ui/scroll-area.tsx b/packages/website/components/ui/scroll-area.tsx new file mode 100644 index 000000000..48e514dfc --- /dev/null +++ b/packages/website/components/ui/scroll-area.tsx @@ -0,0 +1,53 @@ +"use client"; + +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"; +import type { ComponentPropsWithoutRef, ReactElement } from "react"; +import { cn } from "@/utils/cn"; + +export const ScrollArea = ({ + className, + children, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + + {children} + + + + + ); +}; + +export const ScrollBar = ({ + className, + orientation = "vertical", + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + + + ); +}; + +ScrollArea.displayName = "ScrollArea"; +ScrollBar.displayName = "ScrollBar"; diff --git a/packages/website/components/ui/scrollable.tsx b/packages/website/components/ui/scrollable.tsx index 0a3546d60..31e0b4b75 100644 --- a/packages/website/components/ui/scrollable.tsx +++ b/packages/website/components/ui/scrollable.tsx @@ -1,9 +1,11 @@ "use client"; -import { useRef, useState, useEffect, type ReactElement } from "react"; +import type { ReactElement, ReactNode } from "react"; +import { cn } from "@/utils/cn"; +import { ScrollArea } from "@/components/ui/scroll-area"; interface ScrollableProps { - children: React.ReactNode; + children: ReactNode; className?: string; maxHeight?: string; } @@ -13,104 +15,18 @@ export const Scrollable = ({ className = "", maxHeight = "200px", }: ScrollableProps): ReactElement => { - const contentRef = useRef(null); - const scrollbarRef = useRef(null); - const [isHovered, setIsHovered] = useState(false); - const [showScrollbar, setShowScrollbar] = useState(false); - const [scrollbarHeight, setScrollbarHeight] = useState(0); - const [scrollbarTop, setScrollbarTop] = useState(0); - - useEffect(() => { - const updateScrollbar = () => { - if (!contentRef.current) return; - - const element = contentRef.current; - const hasScroll = element.scrollHeight > element.clientHeight; - setShowScrollbar(hasScroll); - - if (hasScroll) { - const scrollRatio = element.clientHeight / element.scrollHeight; - const newScrollbarHeight = Math.max( - element.clientHeight * scrollRatio, - 20, - ); - setScrollbarHeight(newScrollbarHeight); - - const scrollPercentage = - element.scrollTop / (element.scrollHeight - element.clientHeight); - const maxScrollbarTop = element.clientHeight - newScrollbarHeight; - setScrollbarTop(scrollPercentage * maxScrollbarTop); - } - }; - - const element = contentRef.current; - if (!element) return; - - updateScrollbar(); - element.addEventListener("scroll", updateScrollbar); - window.addEventListener("resize", updateScrollbar); - - return () => { - element.removeEventListener("scroll", updateScrollbar); - window.removeEventListener("resize", updateScrollbar); - }; - }, [children]); - - const handleScrollbarMouseDown = (event: React.MouseEvent) => { - event.preventDefault(); - const startY = event.clientY; - const startScrollTop = contentRef.current?.scrollTop || 0; - - const handleMouseMove = (moveEvent: MouseEvent) => { - if (!contentRef.current) return; - - const deltaY = moveEvent.clientY - startY; - const scrollRatio = - contentRef.current.scrollHeight / contentRef.current.clientHeight; - contentRef.current.scrollTop = startScrollTop + deltaY * scrollRatio; - }; - - const handleMouseUp = () => { - document.removeEventListener("mousemove", handleMouseMove); - document.removeEventListener("mouseup", handleMouseUp); - }; - - document.addEventListener("mousemove", handleMouseMove); - document.addEventListener("mouseup", handleMouseUp); - }; - return ( -
setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} - > -
+ {children} -
+
- {showScrollbar && ( -
-
-
- )}
); }; diff --git a/packages/website/components/ui/select.tsx b/packages/website/components/ui/select.tsx new file mode 100644 index 000000000..c3ca13f95 --- /dev/null +++ b/packages/website/components/ui/select.tsx @@ -0,0 +1,172 @@ +"use client"; + +import * as SelectPrimitive from "@radix-ui/react-select"; +import { Check, ChevronDown, ChevronUp } from "lucide-react"; +import type { ComponentPropsWithoutRef, ReactElement } from "react"; +import { cn } from "@/utils/cn"; + +export const Select = ({ + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ; +}; + +export const SelectGroup = ({ + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ; +}; + +export const SelectValue = ({ + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ; +}; + +export const SelectTrigger = ({ + className, + children, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + {children} + + + + + ); +}; + +export const SelectContent = ({ + className, + children, + position = "popper", + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + + + + {children} + + + + + ); +}; + +export const SelectLabel = ({ + className, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + ); +}; + +export const SelectItem = ({ + className, + children, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + + + + + + {children} + + ); +}; + +export const SelectSeparator = ({ + className, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + ); +}; + +export const SelectScrollUpButton = ({ + className, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + + + ); +}; + +export const SelectScrollDownButton = ({ + className, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + + + ); +}; + +Select.displayName = "Select"; +SelectGroup.displayName = "SelectGroup"; +SelectValue.displayName = "SelectValue"; +SelectTrigger.displayName = "SelectTrigger"; +SelectContent.displayName = "SelectContent"; +SelectLabel.displayName = "SelectLabel"; +SelectItem.displayName = "SelectItem"; +SelectSeparator.displayName = "SelectSeparator"; +SelectScrollUpButton.displayName = "SelectScrollUpButton"; +SelectScrollDownButton.displayName = "SelectScrollDownButton"; diff --git a/packages/website/components/ui/table.tsx b/packages/website/components/ui/table.tsx new file mode 100644 index 000000000..1a3aace3f --- /dev/null +++ b/packages/website/components/ui/table.tsx @@ -0,0 +1,131 @@ +"use client"; + +import type { + HTMLAttributes, + ReactElement, + TableHTMLAttributes, + TdHTMLAttributes, + ThHTMLAttributes, +} from "react"; +import { cn } from "@/utils/cn"; + +export const Table = ({ + className, + ...props +}: TableHTMLAttributes): ReactElement => { + return ( +
+ + + ); +}; + +export const TableHeader = ({ + className, + ...props +}: HTMLAttributes): ReactElement => { + return ( + + ); +}; + +export const TableBody = ({ + className, + ...props +}: HTMLAttributes): ReactElement => { + return ( + + ); +}; + +export const TableFooter = ({ + className, + ...props +}: HTMLAttributes): ReactElement => { + return ( + tr]:last:border-b-0", className)} + {...props} + /> + ); +}; + +export const TableRow = ({ + className, + ...props +}: HTMLAttributes): ReactElement => { + return ( + + ); +}; + +export const TableHead = ({ + className, + ...props +}: ThHTMLAttributes): ReactElement => { + return ( +
+ ); +}; + +export const TableCell = ({ + className, + ...props +}: TdHTMLAttributes): ReactElement => { + return ( + + ); +}; + +export const TableCaption = ({ + className, + ...props +}: HTMLAttributes): ReactElement => { + return ( +
+ ); +}; + +Table.displayName = "Table"; +TableHeader.displayName = "TableHeader"; +TableBody.displayName = "TableBody"; +TableFooter.displayName = "TableFooter"; +TableRow.displayName = "TableRow"; +TableHead.displayName = "TableHead"; +TableCell.displayName = "TableCell"; +TableCaption.displayName = "TableCaption"; diff --git a/packages/website/components/ui/tabs.tsx b/packages/website/components/ui/tabs.tsx new file mode 100644 index 000000000..60971383b --- /dev/null +++ b/packages/website/components/ui/tabs.tsx @@ -0,0 +1,71 @@ +"use client"; + +import * as TabsPrimitive from "@radix-ui/react-tabs"; +import type { ComponentPropsWithoutRef, ReactElement } from "react"; +import { cn } from "@/utils/cn"; + +export const Tabs = ({ + className, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + ); +}; + +export const TabsList = ({ + className, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + ); +}; + +export const TabsTrigger = ({ + className, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + ); +}; + +export const TabsContent = ({ + className, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + ); +}; + +Tabs.displayName = "Tabs"; +TabsList.displayName = "TabsList"; +TabsTrigger.displayName = "TabsTrigger"; +TabsContent.displayName = "TabsContent"; diff --git a/packages/website/components/ui/tooltip.tsx b/packages/website/components/ui/tooltip.tsx new file mode 100644 index 000000000..9ac5d668f --- /dev/null +++ b/packages/website/components/ui/tooltip.tsx @@ -0,0 +1,59 @@ +"use client"; + +import * as TooltipPrimitive from "@radix-ui/react-tooltip"; +import type { ComponentPropsWithoutRef, ReactElement } from "react"; +import { cn } from "@/utils/cn"; + +export const TooltipProvider = ({ + delayDuration = 0, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + ); +}; + +export const Tooltip = ({ + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + + + ); +}; + +export const TooltipTrigger = ({ + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ; +}; + +export const TooltipContent = ({ + className, + sideOffset = 4, + ...props +}: ComponentPropsWithoutRef): ReactElement => { + return ( + + + + ); +}; + +TooltipProvider.displayName = "TooltipProvider"; +Tooltip.displayName = "Tooltip"; +TooltipTrigger.displayName = "TooltipTrigger"; +TooltipContent.displayName = "TooltipContent"; diff --git a/packages/website/components/view-docs-button.tsx b/packages/website/components/view-docs-button.tsx index 121e22184..de3b7fe28 100644 --- a/packages/website/components/view-docs-button.tsx +++ b/packages/website/components/view-docs-button.tsx @@ -1,12 +1,17 @@ import { type ReactElement } from "react"; import { BookOpen } from "lucide-react"; +import { buttonVariants } from "@/components/ui/button"; +import { cn } from "@/utils/cn"; export const ViewDocsButton = (): ReactElement => ( View docs diff --git a/packages/website/package.json b/packages/website/package.json index 0ba9e9084..3fb252e9d 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -9,6 +9,12 @@ "lint": "oxlint" }, "dependencies": { + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-tooltip": "^1.2.8", "@react-grab/design-system": "workspace:*", "@vercel/analytics": "^1.5.0", "@vercel/firewall": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 130462c85..9d7dbab2b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -752,12 +752,30 @@ importers: packages/website: dependencies: + '@radix-ui/react-collapsible': + specifier: ^1.1.12 + version: 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-scroll-area': + specifier: ^1.2.10 + version: 1.2.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-select': + specifier: ^2.2.6 + version: 2.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': + specifier: ^1.2.4 + version: 1.2.4(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-tabs': + specifier: ^1.1.13 + version: 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-tooltip': + specifier: ^1.2.8 + version: 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-grab/design-system': specifier: workspace:* version: link:../design-system '@vercel/analytics': specifier: ^1.5.0 - version: 1.5.0(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + version: 1.5.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) '@vercel/firewall': specifier: ^1.1.1 version: 1.1.1 @@ -766,7 +784,7 @@ importers: version: 5.0.108(zod@4.3.5) botid: specifier: ^1.5.10 - version: 1.5.10(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + version: 1.5.10(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -781,10 +799,10 @@ importers: version: 12.23.24(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next: specifier: 16.0.10 - version: 16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) nuqs: specifier: ^2.8.1 - version: 2.8.1(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) + version: 2.8.1(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1) pretty-ms: specifier: ^9.3.0 version: 9.3.0 @@ -2954,6 +2972,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-scroll-area@1.2.10': + resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} + 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-select@2.2.6': resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} peerDependencies: @@ -3420,8 +3451,8 @@ packages: engines: {node: '>=20'} hasBin: true - '@sourcegraph/amp@0.0.1771838262-g353b96': - resolution: {integrity: sha512-uFAaUMheC6iSXII1rP9r16DPpkrFhklrXjNj0Wq3poUrAwjjJRE6BtnMcMC8RVfLGfwyc933fQh6QMumMoYkGw==} + '@sourcegraph/amp@0.0.1772107648-gbe4328': + resolution: {integrity: sha512-ekkK4vs/AWgEYVRanF6bZ7T0XrlF2jTEyIzDQaJVU/mugZ6dZsQ/d+8GX6si9DuvPXnelOh6cku74WcN198zmg==} engines: {node: '>=20'} hasBin: true @@ -9132,6 +9163,12 @@ snapshots: react: 19.0.1 react-dom: 19.0.1(react@19.0.1) + '@floating-ui/react-dom@2.1.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + '@floating-ui/utils@0.2.10': {} '@hono/node-server@1.19.9(hono@4.11.7)': @@ -9632,6 +9669,15 @@ snapshots: '@radix-ui/primitive@1.1.3': {} + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) @@ -9670,6 +9716,22 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -9686,6 +9748,18 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.0.1) @@ -9698,12 +9772,24 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.2)(react@19.2.1)': + dependencies: + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.7)(react@19.0.1)': dependencies: react: 19.0.1 optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-context@1.1.2(@types/react@19.2.2)(react@19.2.1)': + dependencies: + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-context@1.1.2(@types/react@19.2.7)(react@19.0.1)': dependencies: react: 19.0.1 @@ -9738,12 +9824,31 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-direction@1.1.1(@types/react@19.2.2)(react@19.2.1)': + dependencies: + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-direction@1.1.1(@types/react@19.2.7)(react@19.0.1)': dependencies: react: 19.0.1 optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -9772,12 +9877,29 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.2)(react@19.2.1)': + dependencies: + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.7)(react@19.0.1)': dependencies: react: 19.0.1 optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.0.1) @@ -9789,6 +9911,13 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-id@1.1.1(@types/react@19.2.2)(react@19.2.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-id@1.1.1(@types/react@19.2.7)(react@19.0.1)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.0.1) @@ -9831,6 +9960,24 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/rect': 1.1.1 + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@floating-ui/react-dom': 2.1.6(react-dom@19.0.1(react@19.0.1))(react@19.0.1) @@ -9849,6 +9996,16 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) @@ -9859,6 +10016,16 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.0.1) @@ -9869,6 +10036,15 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.0.1) @@ -9887,6 +10063,23 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -9904,6 +10097,52 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + aria-hidden: 1.2.6 + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-remove-scroll: 2.7.2(@types/react@19.2.2)(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/number': 1.1.1 @@ -9942,6 +10181,13 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-slot@1.2.3(@types/react@19.2.2)(react@19.2.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-slot@1.2.3(@types/react@19.2.7)(react@19.0.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.0.1) @@ -9949,6 +10195,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-slot@1.2.4(@types/react@19.2.2)(react@19.2.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-slot@1.2.4(@types/react@19.2.7)(react@19.0.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.0.1) @@ -9956,6 +10209,22 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -9998,6 +10267,26 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -10018,12 +10307,26 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.2(@types/react@19.2.7) + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.2)(react@19.2.1)': + dependencies: + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.7)(react@19.0.1)': dependencies: react: 19.0.1 optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.2)(react@19.2.1)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.7)(react@19.0.1)': dependencies: '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.7)(react@19.0.1) @@ -10032,6 +10335,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.2)(react@19.2.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.7)(react@19.0.1)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.0.1) @@ -10039,6 +10349,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.2)(react@19.2.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.7)(react@19.0.1)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.0.1) @@ -10053,18 +10370,37 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.2)(react@19.2.1)': + dependencies: + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.7)(react@19.0.1)': dependencies: react: 19.0.1 optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.2)(react@19.2.1)': + dependencies: + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.7)(react@19.0.1)': dependencies: react: 19.0.1 optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.2)(react@19.2.1)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.7)(react@19.0.1)': dependencies: '@radix-ui/rect': 1.1.1 @@ -10072,6 +10408,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.2)(react@19.2.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.1) + react: 19.2.1 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.7)(react@19.0.1)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.0.1) @@ -10079,6 +10422,15 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.0.1(react@19.0.1))(react@19.0.1) @@ -10405,14 +10757,14 @@ snapshots: '@sourcegraph/amp-sdk@0.1.0-20251210081226-g90e3892': dependencies: - '@sourcegraph/amp': 0.0.1771838262-g353b96 + '@sourcegraph/amp': 0.0.1772107648-gbe4328 zod: 3.25.76 '@sourcegraph/amp@0.0.1767830505-ga62310': dependencies: '@napi-rs/keyring': 1.1.9 - '@sourcegraph/amp@0.0.1771838262-g353b96': + '@sourcegraph/amp@0.0.1772107648-gbe4328': dependencies: '@napi-rs/keyring': 1.1.9 @@ -11040,9 +11392,9 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vercel/analytics@1.5.0(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': + '@vercel/analytics@1.5.0(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)': optionalDependencies: - next: 16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 '@vercel/firewall@1.1.1': {} @@ -11459,9 +11811,9 @@ snapshots: boolbase@1.0.0: {} - botid@1.5.10(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1): + botid@1.5.10(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1): optionalDependencies: - next: 16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 boxen@8.0.1: @@ -13667,7 +14019,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@next/env': 16.0.10 '@swc/helpers': 0.5.15 @@ -13675,7 +14027,7 @@ snapshots: postcss: 8.4.31 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - styled-jsx: 5.1.6(react@19.2.1) + styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.1) optionalDependencies: '@next/swc-darwin-arm64': 16.0.10 '@next/swc-darwin-x64': 16.0.10 @@ -13740,12 +14092,12 @@ snapshots: dependencies: boolbase: 1.0.0 - nuqs@2.8.1(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1): + nuqs@2.8.1(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1): dependencies: '@standard-schema/spec': 1.0.0 react: 19.2.1 optionalDependencies: - next: 16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) object-assign@4.1.1: {} @@ -14198,6 +14550,14 @@ snapshots: react-refresh@0.9.0: {} + react-remove-scroll-bar@2.3.8(@types/react@19.2.2)(react@19.2.1): + dependencies: + react: 19.2.1 + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + react-remove-scroll-bar@2.3.8(@types/react@19.2.7)(react@19.0.1): dependencies: react: 19.0.1 @@ -14206,6 +14566,17 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 + react-remove-scroll@2.7.2(@types/react@19.2.2)(react@19.2.1): + dependencies: + react: 19.2.1 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.2)(react@19.2.1) + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.2)(react@19.2.1) + use-sidecar: 1.1.3(@types/react@19.2.2)(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.2 + react-remove-scroll@2.7.2(@types/react@19.2.7)(react@19.0.1): dependencies: react: 19.0.1 @@ -14225,6 +14596,14 @@ snapshots: react-dom: 19.0.1(react@19.0.1) react-transition-group: 4.4.5(react-dom@19.0.1(react@19.0.1))(react@19.0.1) + react-style-singleton@2.2.3(@types/react@19.2.2)(react@19.2.1): + dependencies: + get-nonce: 1.0.1 + react: 19.2.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + react-style-singleton@2.2.3(@types/react@19.2.7)(react@19.0.1): dependencies: get-nonce: 1.0.1 @@ -14846,15 +15225,17 @@ snapshots: dependencies: webpack: 5.105.0(esbuild@0.25.0) - styled-jsx@5.1.6(react@19.0.1): + styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.1): dependencies: client-only: 0.0.1 - react: 19.0.1 + react: 19.2.1 + optionalDependencies: + '@babel/core': 7.28.5 - styled-jsx@5.1.6(react@19.2.1): + styled-jsx@5.1.6(react@19.0.1): dependencies: client-only: 0.0.1 - react: 19.2.1 + react: 19.0.1 sucrase@3.35.0: dependencies: @@ -15250,6 +15631,13 @@ snapshots: dependencies: punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@19.2.2)(react@19.2.1): + dependencies: + react: 19.2.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + use-callback-ref@1.3.3(@types/react@19.2.7)(react@19.0.1): dependencies: react: 19.0.1 @@ -15257,6 +15645,14 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 + use-sidecar@1.1.3(@types/react@19.2.2)(react@19.2.1): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + use-sidecar@1.1.3(@types/react@19.2.7)(react@19.0.1): dependencies: detect-node-es: 1.1.0