{userProfile.name}
diff --git a/web/app/components/header/account-dropdown/support.tsx b/web/app/components/header/account-dropdown/support.tsx
index ead4509cce..687915349f 100644
--- a/web/app/components/header/account-dropdown/support.tsx
+++ b/web/app/components/header/account-dropdown/support.tsx
@@ -1,5 +1,5 @@
import { useTranslation } from 'react-i18next'
-import { DropdownMenuGroup, DropdownMenuItem, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger } from '@/app/components/base/ui/dropdown-menu'
+import { DropdownMenuGroup, DropdownMenuItem, DropdownMenuLinkItem, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger } from '@/app/components/base/ui/dropdown-menu'
import { toggleZendeskWindow } from '@/app/components/base/zendesk/utils'
import { Plan } from '@/app/components/billing/type'
import { SUPPORT_EMAIL_ADDRESS, ZENDESK_WIDGET_KEY } from '@/config'
@@ -31,7 +31,7 @@ export default function Support({ closeAccountDropdown }: SupportProps) {
-
+
{hasDedicatedChannel && hasZendeskWidget && (
)}
{hasDedicatedChannel && !hasZendeskWidget && (
- }
+ href={mailToSupport(userProfile.email, plan.type, langGeniusVersionInfo?.current_version, SUPPORT_EMAIL_ADDRESS)}
+ rel="noopener noreferrer"
+ target="_blank"
>
}
/>
-
+
)}
- }
+ href="https://forum.dify.ai/"
+ rel="noopener noreferrer"
+ target="_blank"
>
}
/>
-
-
+ }
+ href="https://discord.gg/5AEfbxcd9k"
+ rel="noopener noreferrer"
+ target="_blank"
>
}
/>
-
+
diff --git a/web/docs/overlay-migration.md b/web/docs/overlay-migration.md
index 3e78b1bf39..3c9da4f3fb 100644
--- a/web/docs/overlay-migration.md
+++ b/web/docs/overlay-migration.md
@@ -16,6 +16,7 @@ This document tracks the migration away from legacy overlay APIs.
- Replacement primitives:
- `@/app/components/base/ui/tooltip`
- `@/app/components/base/ui/dropdown-menu`
+ - `@/app/components/base/ui/context-menu`
- `@/app/components/base/ui/popover`
- `@/app/components/base/ui/dialog`
- `@/app/components/base/ui/alert-dialog`
diff --git a/web/vitest.setup.ts b/web/vitest.setup.ts
index 13322d9ba6..4e3e4806b5 100644
--- a/web/vitest.setup.ts
+++ b/web/vitest.setup.ts
@@ -80,6 +80,16 @@ if (typeof globalThis.IntersectionObserver === 'undefined') {
if (typeof Element !== 'undefined' && !Element.prototype.scrollIntoView)
Element.prototype.scrollIntoView = function () { /* noop */ }
+// Mock DOMRect.fromRect for tests (not available in jsdom)
+if (typeof DOMRect !== 'undefined' && typeof (DOMRect as typeof DOMRect & { fromRect?: unknown }).fromRect !== 'function') {
+ (DOMRect as typeof DOMRect & { fromRect: (rect?: DOMRectInit) => DOMRect }).fromRect = (rect = {}) => new DOMRect(
+ rect.x ?? 0,
+ rect.y ?? 0,
+ rect.width ?? 0,
+ rect.height ?? 0,
+ )
+}
+
afterEach(async () => {
// Wrap cleanup in act() to flush pending React scheduler work
// This prevents "window is not defined" errors from React 19's scheduler