Merge commit '59e21db42b' into dev

This commit is contained in:
DESKTOP-RTLN3BA\$punk 2026-03-24 21:20:30 -07:00
commit ccf8454db5
10 changed files with 42 additions and 30 deletions

View file

@ -1,6 +1,6 @@
import { ActionBarPrimitive, AuiIf, MessagePrimitive, useAuiState } from "@assistant-ui/react";
import { useAtomValue } from "jotai";
import { CheckIcon, CopyIcon, FileText, Pen } from "lucide-react";
import { FileText, Pen } from "lucide-react";
import Image from "next/image";
import { type FC, useState } from "react";
import { messageDocumentsMapAtom } from "@/atoms/chat/mentioned-documents.atom";
@ -30,7 +30,7 @@ const UserAvatar: FC<AuthorMetadata> = ({ displayName, avatarUrl }) => {
alt={displayName || "User"}
width={32}
height={32}
className="size-8 rounded-full object-cover select-none"
className="size-8 rounded-full object-cover"
referrerPolicy="no-referrer"
onError={() => setHasError(true)}
unoptimized

View file

@ -277,21 +277,24 @@ const CollisionMechanism = ({
}, [cycleCollisionDetected, parentRef]);
useEffect(() => {
if (collision.detected && collision.coordinates) {
setTimeout(() => {
setCollision({ detected: false, coordinates: null });
setCycleCollisionDetected(false);
// Set beam opacity to 0
if (beamRef.current) {
beamRef.current.style.opacity = "1";
}
}, 2000);
if (!collision.detected || !collision.coordinates) return;
// Reset the beam animation after a delay
setTimeout(() => {
setBeamKey((prevKey) => prevKey + 1);
}, 2000);
}
const timer1 = setTimeout(() => {
setCollision({ detected: false, coordinates: null });
setCycleCollisionDetected(false);
if (beamRef.current) {
beamRef.current.style.opacity = "1";
}
}, 2000);
const timer2 = setTimeout(() => {
setBeamKey((prevKey) => prevKey + 1);
}, 2000);
return () => {
clearTimeout(timer1);
clearTimeout(timer2);
};
}, [collision]);
return (

View file

@ -1,7 +1,6 @@
"use client";
import { ChevronsUpDown, Settings, UserPen } from "lucide-react";
import { useParams, useRouter } from "next/navigation";
import { useTranslations } from "next-intl";
import { Button } from "@/components/ui/button";
import {
@ -29,9 +28,6 @@ export function SidebarHeader({
className,
}: SidebarHeaderProps) {
const t = useTranslations("sidebar");
const router = useRouter();
const params = useParams();
const searchSpaceId = params.search_space_id as string;
return (
<div className={cn("flex min-w-0 flex-1 items-center", className)}>

View file

@ -103,7 +103,7 @@ export function Pricing({
>
{plans.map((plan, index) => (
<motion.div
key={index}
key={plan.name}
initial={{ y: 50, opacity: 1 }}
whileInView={
isDesktop
@ -193,8 +193,8 @@ export function Pricing({
</p>
<ul className="mt-5 gap-2 flex flex-col">
{plan.features.map((feature, idx) => (
<li key={idx} className="flex items-start gap-2">
{plan.features.map((feature) => (
<li key={feature} className="flex items-start gap-2">
<Check className="h-4 w-4 text-primary mt-1 flex-shrink-0" />
<span className="text-left">{feature}</span>
</li>

View file

@ -8,6 +8,7 @@ import {
useAuiState,
} from "@assistant-ui/react";
import { CheckIcon, CopyIcon } from "lucide-react";
import Image from "next/image";
import { type FC, type ReactNode, useState } from "react";
import { MarkdownText } from "@/components/assistant-ui/markdown-text";
import { ToolFallback } from "@/components/assistant-ui/tool-fallback";
@ -79,10 +80,11 @@ const UserAvatar: FC<AuthorMetadata & { hasError: boolean; onError: () => void }
if (avatarUrl && !hasError) {
return (
// biome-ignore lint/performance/noImgElement: external OAuth/profile avatar URL
<img
<Image
src={avatarUrl}
alt={displayName || "User"}
width={32}
height={32}
className="size-8 rounded-full object-cover"
referrerPolicy="no-referrer"
onError={onError}

View file

@ -143,9 +143,11 @@ function CopyButton({
const [hasCopied, setHasCopied] = React.useState(false);
React.useEffect(() => {
setTimeout(() => {
if (!hasCopied) return;
const timer = setTimeout(() => {
setHasCopied(false);
}, 2000);
return () => clearTimeout(timer);
}, [hasCopied]);
return (

View file

@ -187,6 +187,7 @@ function LinkOpenButton() {
}}
aria-label="Open link in a new tab"
target="_blank"
rel="noopener noreferrer"
>
<ExternalLink width={18} />
</a>

View file

@ -48,14 +48,17 @@ export function Spotlight({
useEffect(() => {
if (!parentElement) return;
const handleEnter = () => setIsHovered(true);
const handleLeave = () => setIsHovered(false);
parentElement.addEventListener("mousemove", handleMouseMove);
parentElement.addEventListener("mouseenter", () => setIsHovered(true));
parentElement.addEventListener("mouseleave", () => setIsHovered(false));
parentElement.addEventListener("mouseenter", handleEnter);
parentElement.addEventListener("mouseleave", handleLeave);
return () => {
parentElement.removeEventListener("mousemove", handleMouseMove);
parentElement.removeEventListener("mouseenter", () => setIsHovered(true));
parentElement.removeEventListener("mouseleave", () => setIsHovered(false));
parentElement.removeEventListener("mouseenter", handleEnter);
parentElement.removeEventListener("mouseleave", handleLeave);
};
}, [parentElement, handleMouseMove]);