@@ -169,7 +176,7 @@ function ToastCard({ id, type, title, description, action, cancel, notification
diff --git a/apps/app/src/i18n/locales/ca.ts b/apps/app/src/i18n/locales/ca.ts
index efaa4de60..ae0915b94 100644
--- a/apps/app/src/i18n/locales/ca.ts
+++ b/apps/app/src/i18n/locales/ca.ts
@@ -109,13 +109,14 @@ export default {
"common.submit": "Envia",
"common.unknown": "Desconegut",
"composer.agent_label": "Agent",
- "composer.any_file_type_supported": "S'admet qualsevol tipus de fitxer.",
+ "composer.any_file_type_supported": "S'admeten documents, fulls de càlcul, presentacions, PDF, text, codi i imatges habituals.",
"composer.attach_files": "Adjuntar fitxers",
"composer.attachments_unavailable": "Els fitxers adjunts no estan disponibles.",
"composer.behavior_label": "Comportament",
"composer.configure": "Configura",
"composer.default_agent": "Agent per defecte",
- "composer.file_exceeds_limit": "{name} supera el límit de 8 MB.",
+ "composer.file_exceeds_limit": "{name} supera el límit de 25 MB.",
+ "composer.files_exceed_limit": "{count} fitxers superen el límit de 25 MB.",
"composer.file_kind": "Fitxer",
"composer.image_kind": "Imatge",
"composer.inserted_links_unsupported": "S'han inserit enllaços per a fitxers no compatibles.",
diff --git a/apps/app/src/i18n/locales/en.ts b/apps/app/src/i18n/locales/en.ts
index 2a6c08152..43da4357e 100644
--- a/apps/app/src/i18n/locales/en.ts
+++ b/apps/app/src/i18n/locales/en.ts
@@ -376,13 +376,14 @@ export default {
"composer.app_kind": "App · Computer Use",
"composer.computer_use_permissions_missing": "Computer Use needs macOS permissions before it can control {app}.",
"composer.computer_use_permissions_setup": "Set up",
- "composer.any_file_type_supported": "Any file type is supported.",
+ "composer.any_file_type_supported": "Common documents, spreadsheets, presentations, PDFs, text, code, and images are supported.",
"composer.attach_files": "Attach files",
"composer.attachments_unavailable": "Attachments are unavailable.",
"composer.behavior_label": "Behavior",
"composer.configure": "Configure",
"composer.default_agent": "Default agent",
- "composer.file_exceeds_limit": "{name} exceeds the 8MB limit.",
+ "composer.file_exceeds_limit": "{name} exceeds the 25MB limit.",
+ "composer.files_exceed_limit": "{count} files exceed the 25MB limit.",
"composer.file_kind": "File",
"composer.image_kind": "Image",
"composer.inserted_links_unsupported": "Inserted links for unsupported files.",
@@ -675,9 +676,12 @@ export default {
"den.removed_provider": "Removed {name}.",
"den.removing": "Removing...",
"den.sign_out": "Sign out",
- "den.signed_out": "Signed out",
- "den.signin_button": "Sign in",
- "den.signin_code_note": "Accepts an ipollowork://den-auth link or the raw one-time grant.",
+ "den.signed_out": "Signed out",
+ "den.signin_button": "Sign in",
+ "den.signin_coming_soon_action": "Continue locally",
+ "den.signin_coming_soon_description": "Cloud sign-in is being prepared. You can keep using iPolloWork locally today.",
+ "den.signin_coming_soon_title": "Sign-in is coming soon",
+ "den.signin_code_note": "Accepts an ipollowork://den-auth link or the raw one-time grant.",
"den.signin_link_copied": "Copied",
"den.signin_link_hint": "If your browser doesn't bounce back into iPolloWork automatically, paste the sign-in link or one-time code from iPolloWork Cloud here.",
"den.signin_link_label": "Sign-in link or one-time code",
@@ -1122,12 +1126,18 @@ export default {
"session.outputs.empty": "No files yet",
"session.outputs.empty_hint": "Files created in this conversation will appear here.",
"session.outputs.action_browse_edit": "Browse / edit",
+ "session.outputs.action_design_studio": "Edit in Design",
"session.outputs.action_video_studio": "Edit in Video Studio",
"session.outputs.action_video_preview_edit": "Preview / edit",
"session.outputs.open_video_studio": "Open Video Studio",
+ "session.outputs.open_design_studio": "Open Design",
"session.outputs.bundle_count": "{count} files",
"session.outputs.expand_bundle": "Show included files",
"session.outputs.collapse_bundle": "Hide included files",
+ "design.export_actions": "Export options",
+ "design.download_pptx": "Download PPTX",
+ "design.download_pdf": "Download PDF",
+ "design.publish_web": "Publish as webpage",
"session.side_panel.web": "Web",
"session.side_panel.code": "Code",
"session.side_panel.files": "Files",
diff --git a/apps/app/src/i18n/locales/es.ts b/apps/app/src/i18n/locales/es.ts
index 2785e2b59..1b157e340 100644
--- a/apps/app/src/i18n/locales/es.ts
+++ b/apps/app/src/i18n/locales/es.ts
@@ -109,13 +109,14 @@ export default {
"common.submit": "Enviar",
"common.unknown": "Desconocido",
"composer.agent_label": "Agente",
- "composer.any_file_type_supported": "Se admite cualquier tipo de archivo.",
+ "composer.any_file_type_supported": "Se admiten documentos, hojas de cálculo, presentaciones, PDF, texto, código e imágenes comunes.",
"composer.attach_files": "Adjuntar archivos",
"composer.attachments_unavailable": "Los archivos adjuntos no están disponibles.",
"composer.behavior_label": "Comportamiento",
"composer.configure": "Configurar",
"composer.default_agent": "Agente predeterminado",
- "composer.file_exceeds_limit": "{name} supera el límite de 8 MB.",
+ "composer.file_exceeds_limit": "{name} supera el límite de 25 MB.",
+ "composer.files_exceed_limit": "{count} archivos superan el límite de 25 MB.",
"composer.file_kind": "Archivo",
"composer.image_kind": "Imagen",
"composer.inserted_links_unsupported": "Enlaces insertados para archivos no compatibles.",
diff --git a/apps/app/src/i18n/locales/fr.ts b/apps/app/src/i18n/locales/fr.ts
index 9f4339699..f6a654e20 100644
--- a/apps/app/src/i18n/locales/fr.ts
+++ b/apps/app/src/i18n/locales/fr.ts
@@ -109,13 +109,14 @@ export default {
"common.submit": "Envoyer",
"common.unknown": "Inconnu",
"composer.agent_label": "Agent",
- "composer.any_file_type_supported": "Tous les types de fichiers sont pris en charge.",
+ "composer.any_file_type_supported": "Les documents, feuilles de calcul, présentations, PDF, textes, codes et images courants sont pris en charge.",
"composer.attach_files": "Joindre des fichiers",
"composer.attachments_unavailable": "Les pièces jointes ne sont pas disponibles.",
"composer.behavior_label": "Comportement",
"composer.configure": "Configurer",
"composer.default_agent": "Agent par défaut",
- "composer.file_exceeds_limit": "{name} dépasse la limite de 8 Mo.",
+ "composer.file_exceeds_limit": "{name} dépasse la limite de 25 Mo.",
+ "composer.files_exceed_limit": "{count} fichiers dépassent la limite de 25 Mo.",
"composer.file_kind": "Fichier",
"composer.image_kind": "Image",
"composer.inserted_links_unsupported": "Liens insérés pour des fichiers non pris en charge.",
diff --git a/apps/app/src/i18n/locales/ja.ts b/apps/app/src/i18n/locales/ja.ts
index 1d4921f8c..b43bfb0c4 100644
--- a/apps/app/src/i18n/locales/ja.ts
+++ b/apps/app/src/i18n/locales/ja.ts
@@ -108,13 +108,14 @@ export default {
"common.submit": "送信",
"common.unknown": "不明",
"composer.agent_label": "エージェント",
- "composer.any_file_type_supported": "すべてのファイル形式に対応しています。",
+ "composer.any_file_type_supported": "一般的な文書、表計算、プレゼンテーション、PDF、テキスト、コード、画像に対応しています。",
"composer.attach_files": "ファイルを添付",
"composer.attachments_unavailable": "添付ファイルは利用できません。",
"composer.behavior_label": "動作",
"composer.configure": "設定",
"composer.default_agent": "デフォルトエージェント",
- "composer.file_exceeds_limit": "{name}は8MBの制限を超えています。",
+ "composer.file_exceeds_limit": "{name}は25MBの制限を超えています。",
+ "composer.files_exceed_limit": "{count}個のファイルが25MBの制限を超えています。",
"composer.file_kind": "ファイル",
"composer.image_kind": "画像",
"composer.inserted_links_unsupported": "未対応ファイルのリンクを挿入しました。",
diff --git a/apps/app/src/i18n/locales/pt-BR.ts b/apps/app/src/i18n/locales/pt-BR.ts
index 27190d444..a478e4402 100644
--- a/apps/app/src/i18n/locales/pt-BR.ts
+++ b/apps/app/src/i18n/locales/pt-BR.ts
@@ -109,13 +109,14 @@ export default {
"common.submit": "Enviar",
"common.unknown": "Desconhecido",
"composer.agent_label": "Agente",
- "composer.any_file_type_supported": "Qualquer tipo de arquivo é aceito.",
+ "composer.any_file_type_supported": "Compatível com documentos, planilhas, apresentações, PDFs, textos, códigos e imagens comuns.",
"composer.attach_files": "Anexar arquivos",
"composer.attachments_unavailable": "Anexos não estão disponíveis.",
"composer.behavior_label": "Comportamento",
"composer.configure": "Configurar",
"composer.default_agent": "Agente padrão",
- "composer.file_exceeds_limit": "{name} excede o limite de 8MB.",
+ "composer.file_exceeds_limit": "{name} excede o limite de 25MB.",
+ "composer.files_exceed_limit": "{count} arquivos excedem o limite de 25MB.",
"composer.file_kind": "Arquivo",
"composer.image_kind": "Imagem",
"composer.inserted_links_unsupported": "Links inseridos para arquivos não suportados.",
diff --git a/apps/app/src/i18n/locales/ru.ts b/apps/app/src/i18n/locales/ru.ts
index 75746a5ff..32bc87a4f 100644
--- a/apps/app/src/i18n/locales/ru.ts
+++ b/apps/app/src/i18n/locales/ru.ts
@@ -110,13 +110,14 @@ export default {
"common.submit": "Отправить",
"common.unknown": "Неизвестно",
"composer.agent_label": "Агент",
- "composer.any_file_type_supported": "Поддерживаются файлы любого типа.",
+ "composer.any_file_type_supported": "Поддерживаются распространённые документы, таблицы, презентации, PDF, текст, код и изображения.",
"composer.attach_files": "Прикрепить файлы",
"composer.attachments_unavailable": "Вложения недоступны.",
"composer.behavior_label": "Поведение",
"composer.configure": "Настроить",
"composer.default_agent": "Агент по умолчанию",
- "composer.file_exceeds_limit": "{name} превышает лимит 8 МБ.",
+ "composer.file_exceeds_limit": "{name} превышает лимит 25 МБ.",
+ "composer.files_exceed_limit": "{count} файлов превышают лимит 25 МБ.",
"composer.file_kind": "Файл",
"composer.image_kind": "Изображение",
"composer.inserted_links_unsupported": "Вставлены ссылки для неподдерживаемых файлов.",
diff --git a/apps/app/src/i18n/locales/th.ts b/apps/app/src/i18n/locales/th.ts
index 7c3a625aa..7e98646d2 100644
--- a/apps/app/src/i18n/locales/th.ts
+++ b/apps/app/src/i18n/locales/th.ts
@@ -109,13 +109,14 @@ export default {
"common.submit": "ส่ง",
"common.unknown": "ไม่ทราบ",
"composer.agent_label": "Agent",
- "composer.any_file_type_supported": "รองรับไฟล์ทุกประเภท",
+ "composer.any_file_type_supported": "รองรับเอกสาร สเปรดชีต งานนำเสนอ PDF ข้อความ โค้ด และรูปภาพทั่วไป",
"composer.attach_files": "แนบไฟล์",
"composer.attachments_unavailable": "ไฟล์แนบไม่พร้อมใช้งาน",
"composer.behavior_label": "พฤติกรรม",
"composer.configure": "ตั้งค่า",
"composer.default_agent": "Agent เริ่มต้น",
- "composer.file_exceeds_limit": "{name} เกินขีดจำกัด 8MB",
+ "composer.file_exceeds_limit": "{name} เกินขีดจำกัด 25MB",
+ "composer.files_exceed_limit": "{count} ไฟล์เกินขีดจำกัด 25MB",
"composer.file_kind": "ไฟล์",
"composer.image_kind": "รูปภาพ",
"composer.inserted_links_unsupported": "แทรกลิงก์สำหรับไฟล์ที่ไม่รองรับ",
diff --git a/apps/app/src/i18n/locales/vi.ts b/apps/app/src/i18n/locales/vi.ts
index 8193c6c9e..a45c99456 100644
--- a/apps/app/src/i18n/locales/vi.ts
+++ b/apps/app/src/i18n/locales/vi.ts
@@ -109,13 +109,14 @@ export default {
"common.submit": "Gửi",
"common.unknown": "Không rõ",
"composer.agent_label": "Agent",
- "composer.any_file_type_supported": "Hỗ trợ mọi loại tệp.",
+ "composer.any_file_type_supported": "Hỗ trợ tài liệu, bảng tính, bản trình bày, PDF, văn bản, mã nguồn và hình ảnh phổ biến.",
"composer.attach_files": "Đính kèm tệp",
"composer.attachments_unavailable": "Đính kèm không khả dụng.",
"composer.behavior_label": "Hành vi",
"composer.configure": "Cấu hình",
"composer.default_agent": "Agent mặc định",
- "composer.file_exceeds_limit": "{name} vượt quá giới hạn 8MB.",
+ "composer.file_exceeds_limit": "{name} vượt quá giới hạn 25MB.",
+ "composer.files_exceed_limit": "{count} tệp vượt quá giới hạn 25MB.",
"composer.file_kind": "Tệp",
"composer.image_kind": "Hình ảnh",
"composer.inserted_links_unsupported": "Đã chèn liên kết cho các tệp không được hỗ trợ.",
diff --git a/apps/app/src/i18n/locales/zh.ts b/apps/app/src/i18n/locales/zh.ts
index 8ab8ce5d4..fbc40ed5a 100644
--- a/apps/app/src/i18n/locales/zh.ts
+++ b/apps/app/src/i18n/locales/zh.ts
@@ -370,13 +370,14 @@ export default {
"common.submit": "提交",
"common.unknown": "未知",
"composer.agent_label": "智能体",
- "composer.any_file_type_supported": "支持任何文件类型。",
+ "composer.any_file_type_supported": "支持常见文档、表格、演示文稿、PDF、文本、代码和图片。",
"composer.attach_files": "附加文件",
"composer.attachments_unavailable": "附件功能不可用。",
"composer.behavior_label": "行为",
"composer.configure": "配置",
"composer.default_agent": "默认智能体",
- "composer.file_exceeds_limit": "{name}超过8MB限制。",
+ "composer.file_exceeds_limit": "{name}超过25MB限制。",
+ "composer.files_exceed_limit": "{count}个文件超过25MB限制。",
"composer.file_kind": "文件",
"composer.image_kind": "图片",
"composer.inserted_links_unsupported": "已为不支持的文件插入链接。",
@@ -573,9 +574,12 @@ export default {
"den.removed_provider": "已移除{name}。",
"den.removing": "移除中…",
"den.sign_out": "退出登录",
- "den.signed_out": "已退出",
- "den.signin_button": "登录",
- "den.signin_code_note": "支持ipollowork://den-auth链接或一次性授权码。",
+ "den.signed_out": "已退出",
+ "den.signin_button": "登录",
+ "den.signin_coming_soon_action": "继续本地使用",
+ "den.signin_coming_soon_description": "Cloud 登录服务正在准备中。现在你可以继续在本地使用 iPolloWork。",
+ "den.signin_coming_soon_title": "登录即将开放",
+ "den.signin_code_note": "支持ipollowork://den-auth链接或一次性授权码。",
"den.signin_link_hint": "如果浏览器未自动跳回iPolloWork,请在此粘贴iPolloWork Cloud的登录链接或一次性登录码。",
"den.signin_link_label": "登录链接或一次性登录码",
"den.signin_link_placeholder": "ipollowork://den-auth?...或粘贴登录码",
@@ -891,12 +895,18 @@ export default {
"session.outputs.empty": "暂无文件",
"session.outputs.empty_hint": "本次对话生成的文件会显示在这里。",
"session.outputs.action_browse_edit": "可浏览 / 编辑",
+ "session.outputs.action_design_studio": "在设计工作台编辑",
"session.outputs.action_video_studio": "可在视频工作台编辑",
"session.outputs.action_video_preview_edit": "预览 / 编辑",
"session.outputs.open_video_studio": "打开视频工作台",
+ "session.outputs.open_design_studio": "打开设计工作台",
"session.outputs.bundle_count": "包含 {count} 个文件",
"session.outputs.expand_bundle": "展开包含文件",
"session.outputs.collapse_bundle": "收起包含文件",
+ "design.export_actions": "导出选项",
+ "design.download_pptx": "下载 PPT",
+ "design.download_pdf": "下载 PDF",
+ "design.publish_web": "发布为网页",
"session.new_task": "新建对话",
"session.open": "打开",
"session.palette_hint_navigate": "方向键导航",
diff --git a/apps/app/src/index.react.tsx b/apps/app/src/index.react.tsx
index 473bc0a98..73fda75fc 100644
--- a/apps/app/src/index.react.tsx
+++ b/apps/app/src/index.react.tsx
@@ -61,3 +61,10 @@ ReactDOM.createRoot(root).render(
,
);
+
+window.requestAnimationFrame(() => {
+ const splash = document.getElementById("ipollowork-startup-splash");
+ if (!splash) return;
+ splash.dataset.hiding = "true";
+ window.setTimeout(() => splash.remove(), 180);
+});
diff --git a/apps/app/src/lib/artifacts.ts b/apps/app/src/lib/artifacts.ts
index 5dbf0285c..6c5fe72ed 100644
--- a/apps/app/src/lib/artifacts.ts
+++ b/apps/app/src/lib/artifacts.ts
@@ -166,9 +166,19 @@ export function isConversationOutputArtifact(artifact: ArtifactItem) {
return true;
}
-/** HTML compositions under the video workspace open the session's Video Studio. */
+/** Design workspace outputs open the session's Design surface. */
+export function isDesignArtifact(artifact: ArtifactItem) {
+ return artifact.type !== "unknown" && /(?:^|\/)design(?:\/|$)/i.test(artifact.path);
+}
+
+/** Video workspace outputs open the session's Video Studio. */
+export function isVideoStudioArtifact(artifact: ArtifactItem) {
+ return ["html", "video"].includes(artifact.type) && /(?:^|\/)video(?:\/|$)/i.test(artifact.path);
+}
+
+/** HTML compositions under the video workspace can auto-open Video Studio. */
export function isVideoHtmlArtifact(artifact: ArtifactItem) {
- return artifact.type === "html" && /(?:^|\/)video(?:\/|$)/i.test(artifact.path);
+ return artifact.type === "html" && isVideoStudioArtifact(artifact);
}
const BUNDLE_PRIMARY_TYPES = new Set
(["website", "html", "video", "slides", "document", "pdf"]);
diff --git a/apps/app/src/react-app/domains/cloud/cloud-signin-coming-soon-dialog.tsx b/apps/app/src/react-app/domains/cloud/cloud-signin-coming-soon-dialog.tsx
new file mode 100644
index 000000000..4871a41e8
--- /dev/null
+++ b/apps/app/src/react-app/domains/cloud/cloud-signin-coming-soon-dialog.tsx
@@ -0,0 +1,56 @@
+/** @jsxImportSource react */
+import { Sparkles } from "lucide-react";
+
+import { t } from "../../../i18n";
+import { Button } from "@/components/ui/button";
+import {
+ Dialog,
+ DialogClose,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+} from "@/components/ui/dialog";
+
+type CloudSignInComingSoonDialogProps = {
+ open: boolean;
+ onOpenChange: (open: boolean) => void;
+};
+
+export function CloudSignInComingSoonDialog({ open, onOpenChange }: CloudSignInComingSoonDialogProps) {
+ return (
+
+ );
+}
diff --git a/apps/app/src/react-app/domains/onboarding/first-run-loader.tsx b/apps/app/src/react-app/domains/onboarding/first-run-loader.tsx
index c0445a665..8d5b3648c 100644
--- a/apps/app/src/react-app/domains/onboarding/first-run-loader.tsx
+++ b/apps/app/src/react-app/domains/onboarding/first-run-loader.tsx
@@ -1,6 +1,6 @@
/** @jsxImportSource react */
-import { OwDotTicker } from "../../shell/dot-ticker";
+import { WorkspaceLoadingState } from "../../shell/workspace-loading-state";
/**
* First-run full-screen loader shown while the first session is created,
@@ -15,10 +15,7 @@ export function FirstRunLoader() {
role="status"
>
-
-
- Preparing workspace
-
+
);
diff --git a/apps/app/src/react-app/domains/session/chat/session-page.tsx b/apps/app/src/react-app/domains/session/chat/session-page.tsx
index b8cc178e6..361975588 100644
--- a/apps/app/src/react-app/domains/session/chat/session-page.tsx
+++ b/apps/app/src/react-app/domains/session/chat/session-page.tsx
@@ -10,7 +10,6 @@ import { isPptxCompatibleTemplate, type TemplateCatalogItem, type TemplateManife
import { currentLocale, t } from "../../../../i18n";
import { publicAssetUrl } from "../../../../app/lib/public-asset";
import { IPOLLOWORK_EXTENSION_CATALOG } from "../../../../app/constants";
-import { buildDenAuthUrl, readDenBootstrapConfig } from "../../../../app/lib/den";
import { type iPolloWorkServerClient, type iPolloWorkServerStatus } from "../../../../app/lib/ipollowork-server";
import { getDisplaySessionTitle } from "../../../../app/lib/session-title";
import type { BootPhase } from "../../../../app/lib/startup-boot";
@@ -42,8 +41,8 @@ import {
import { Input } from "@/components/ui/input";
import { toast } from "@/components/ui/sonner";
import { ConfirmModal } from "../../../design-system/modals/confirm-modal";
-import { usePlatform } from "../../../kernel/platform";
-import { useDenAuth } from "../../cloud/den-auth-provider";
+import { useDenAuth } from "../../cloud/den-auth-provider";
+import { CloudSignInComingSoonDialog } from "../../cloud/cloud-signin-coming-soon-dialog";
import ProviderAuthModal, { type ProviderAuthModalProps } from "../../connections/provider-auth/provider-auth-modal";
import { RenameSessionModal } from "../modals/rename-session-modal";
import { AppSidebar } from "../sidebar/app-sidebar";
@@ -60,12 +59,13 @@ import {
ResizablePanel,
ResizablePanelGroup,
} from "@/components/ui/resizable";
-import { ShareWorkspaceModal } from "../../workspace/share-workspace-modal";
-import { OwDotTicker } from "../../../shell/dot-ticker";
-import { useReactRenderWatchdog } from "../../../shell/react-render-watchdog";
-import { useShellConfig } from "../../../shell/shell-config";
-import { type SidePanelItem, useUiStateStore } from "../../../shell/ui-state-store";
-import { workspaceSettingsRoute } from "../../../shell/workspace-routes";
+import { ShareWorkspaceModal } from "../../workspace/share-workspace-modal";
+import { OwDotTicker } from "../../../shell/dot-ticker";
+import { useReactRenderWatchdog } from "../../../shell/react-render-watchdog";
+import { useShellConfig } from "../../../shell/shell-config";
+import { type SidePanelItem, useUiStateStore } from "../../../shell/ui-state-store";
+import { workspaceSettingsRoute } from "../../../shell/workspace-routes";
+import { WorkspaceLoadingState } from "../../../shell/workspace-loading-state";
import { isElectronRuntime } from "../../../../app/utils";
import { isCollectibleArtifactTarget, isLocalhostBrowserTarget, isOpenableFileTarget, type OpenTarget } from "../artifacts/open-target";
@@ -89,10 +89,11 @@ const STARTUP_SKELETON_ROWS = [
{ id: "final", titleWidth: "36%", bodyWidth: "74%" },
];
const GLOBAL_VOICE_SIDE_PANEL_KEY = "__ipollowork_voice__";
-const EMPTY_TRANSCRIPT_TARGETS: OpenTarget[] = [];
-const MAIN_WORKSPACE_MIN_WIDTH = 520;
-const MAIN_WORKSPACE_FALLBACK_MIN_WIDTH = 480;
-type SessionPanelView = SidePanelItem | "launcher";
+const EMPTY_TRANSCRIPT_TARGETS: OpenTarget[] = [];
+const MAIN_WORKSPACE_MIN_WIDTH = 520;
+const MAIN_WORKSPACE_FALLBACK_MIN_WIDTH = 480;
+const AUTO_COLLAPSE_LEFT_SIDEBAR_WIDTH = 520;
+type SessionPanelView = SidePanelItem | "launcher";
export type SessionPageHistoryControls = {
canUndo: boolean;
@@ -387,11 +388,10 @@ function TemplateBriefCard({ template, onSubmit, onClose }: { template: Template
return
;
}
-export function SessionPage(props: SessionPageProps) {
- const locale = currentLocale();
- const { config: shellConfig } = useShellConfig();
- const platform = usePlatform();
- const navigate = useNavigate();
+export function SessionPage(props: SessionPageProps) {
+ const locale = currentLocale();
+ const { config: shellConfig } = useShellConfig();
+ const navigate = useNavigate();
const denAuth = useDenAuth();
const sidebarOpen = useUiStateStore((state) => state.sidebarOpen);
const setSidebarOpen = useUiStateStore((state) => state.setSidebarOpen);
@@ -427,8 +427,9 @@ export function SessionPage(props: SessionPageProps) {
const [templateCatalog, setTemplateCatalog] = useState