From 3172791049c4653e2619b6e81193827bd72f256f Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Wed, 25 Jun 2025 18:48:58 +0000 Subject: [PATCH 1/3] feat: make task panels resizable --- site/package.json | 1 + site/pnpm-lock.yaml | 14 ++++++++++++++ site/src/pages/TaskPage/TaskApps.tsx | 2 +- site/src/pages/TaskPage/TaskPage.tsx | 15 ++++++++++----- site/src/pages/TaskPage/TaskSidebar.tsx | 11 +---------- 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/site/package.json b/site/package.json index a3d06d1d44842..1512a803b0a96 100644 --- a/site/package.json +++ b/site/package.json @@ -102,6 +102,7 @@ "react-helmet-async": "2.0.5", "react-markdown": "9.0.3", "react-query": "npm:@tanstack/react-query@5.77.0", + "react-resizable-panels": "3.0.3", "react-router-dom": "6.26.2", "react-syntax-highlighter": "15.6.1", "react-textarea-autosize": "8.5.9", diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml index 7a6f81b402621..62cdc6176092a 100644 --- a/site/pnpm-lock.yaml +++ b/site/pnpm-lock.yaml @@ -220,6 +220,9 @@ importers: react-query: specifier: npm:@tanstack/react-query@5.77.0 version: '@tanstack/react-query@5.77.0(react@18.3.1)' + react-resizable-panels: + specifier: 3.0.3 + version: 3.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-router-dom: specifier: 6.26.2 version: 6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -5428,6 +5431,12 @@ packages: '@types/react': optional: true + react-resizable-panels@3.0.3: + resolution: {integrity: sha512-7HA8THVBHTzhDK4ON0tvlGXyMAJN1zBeRpuyyremSikgYh2ku6ltD7tsGQOcXx4NKPrZtYCm/5CBr+dkruTGQw==, tarball: https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-3.0.3.tgz} + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-router-dom@6.26.2: resolution: {integrity: sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==, tarball: https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz} engines: {node: '>=14.0.0'} @@ -12284,6 +12293,11 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 + react-resizable-panels@3.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.19.2 diff --git a/site/src/pages/TaskPage/TaskApps.tsx b/site/src/pages/TaskPage/TaskApps.tsx index cad76e1262778..3e03774f43347 100644 --- a/site/src/pages/TaskPage/TaskApps.tsx +++ b/site/src/pages/TaskPage/TaskApps.tsx @@ -57,7 +57,7 @@ export const TaskApps: FC = ({ task }) => { } return ( -
+
{embeddedApps.map((app) => ( diff --git a/site/src/pages/TaskPage/TaskPage.tsx b/site/src/pages/TaskPage/TaskPage.tsx index c340a96cfef11..298b5b3f015aa 100644 --- a/site/src/pages/TaskPage/TaskPage.tsx +++ b/site/src/pages/TaskPage/TaskPage.tsx @@ -12,6 +12,7 @@ import { AI_PROMPT_PARAMETER_NAME, type Task } from "modules/tasks/tasks"; import type { ReactNode } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; +import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels"; import { useParams } from "react-router-dom"; import { Link as RouterLink } from "react-router-dom"; import { ellipsizeText } from "utils/ellipsizeText"; @@ -193,11 +194,15 @@ const TaskPage = () => { {pageTitle(ellipsizeText(task.prompt, 64) ?? "Task")} - -
- - {content} -
+ + + + + +
+ + {content} + ); }; diff --git a/site/src/pages/TaskPage/TaskSidebar.tsx b/site/src/pages/TaskPage/TaskSidebar.tsx index f3ac6de61a185..9360cf5e222ff 100644 --- a/site/src/pages/TaskPage/TaskSidebar.tsx +++ b/site/src/pages/TaskPage/TaskSidebar.tsx @@ -24,7 +24,6 @@ import { import type { Task } from "modules/tasks/tasks"; import type { FC } from "react"; import { Link as RouterLink } from "react-router-dom"; -import { cn } from "utils/cn"; import { truncateURI } from "utils/uri"; import { TaskAppIFrame } from "./TaskAppIframe"; @@ -89,15 +88,7 @@ export const TaskSidebar: FC = ({ task }) => { const [sidebarApp, sidebarAppStatus] = getSidebarApp(task); return ( -