- {t.welcome.createYourOwnSkillDescription.includes("\n") ? (
-
- {t.welcome.createYourOwnSkillDescription}
-
- ) : (
-
{t.welcome.createYourOwnSkillDescription}
- )}
+
+
+ {t.welcome.createYourOwnSkillDescription}
+
) : (
-
- {t.welcome.description.includes("\n") ? (
-
- {t.welcome.description}
-
- ) : (
-
{t.welcome.description}
- )}
+
+ {t.welcome.description}
)}
diff --git a/frontend/src/components/workspace/workspace-container.tsx b/frontend/src/components/workspace/workspace-container.tsx
index 9dd547d74..e1e9c3b7d 100644
--- a/frontend/src/components/workspace/workspace-container.tsx
+++ b/frontend/src/components/workspace/workspace-container.tsx
@@ -12,6 +12,7 @@ import {
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/components/ui/breadcrumb";
+import { SidebarTrigger } from "@/components/ui/sidebar";
import { useI18n } from "@/core/i18n/hooks";
import { cn } from "@/lib/utils";
@@ -51,7 +52,8 @@ export function WorkspaceHeader({
)}
{...props}
>
-
+
+
{segments?.[0] && (
diff --git a/frontend/tests/e2e/sidebar.spec.ts b/frontend/tests/e2e/sidebar.spec.ts
index 4aac9fa58..6bccf8f73 100644
--- a/frontend/tests/e2e/sidebar.spec.ts
+++ b/frontend/tests/e2e/sidebar.spec.ts
@@ -29,4 +29,45 @@ test.describe("Sidebar navigation", () => {
await page.waitForURL("**/workspace/agents");
await expect(page).toHaveURL(/\/workspace\/agents/);
});
+
+ test("mobile welcome layout stays within viewport and opens sidebar", async ({
+ page,
+ }) => {
+ await page.setViewportSize({ width: 390, height: 844 });
+ mockLangGraphAPI(page);
+
+ await page.goto("/workspace/chats/new");
+
+ const viewportWidth = page.viewportSize()?.width ?? 390;
+ const expectInsideViewport = async (
+ locator: ReturnType,
+ ) => {
+ await expect(locator).toBeVisible({ timeout: 15_000 });
+ const box = await locator.boundingBox();
+ expect(box).not.toBeNull();
+ expect(box!.x).toBeGreaterThanOrEqual(-1);
+ expect(box!.x + box!.width).toBeLessThanOrEqual(viewportWidth + 1);
+ };
+
+ await expectInsideViewport(page.getByText(/Welcome to|欢迎使用/).first());
+ await expectInsideViewport(page.getByRole("textbox").first());
+ await expectInsideViewport(page.locator("[data-slot='suggestions-list']"));
+
+ const mobileSidebarTrigger = page
+ .locator("[data-sidebar='trigger']:visible")
+ .first();
+ await expect(mobileSidebarTrigger).toBeVisible();
+ await mobileSidebarTrigger.click();
+
+ const mobileSidebar = page.locator(
+ "[data-mobile='true'][data-sidebar='sidebar']",
+ );
+ await expect(mobileSidebar).toBeVisible();
+ await expect(
+ mobileSidebar.locator("a[href='/workspace/chats']"),
+ ).toBeVisible();
+ await expect(
+ mobileSidebar.locator("a[href='/workspace/agents']"),
+ ).toBeVisible();
+ });
});