feat(canvas): fullscreen workspace outside the app shell

Move /projects/:id and its service detail route out of PlatformShell —
the project view now owns the entire viewport like Railway's canvas:
no sidebar, no global nav, just the slim project bar over the graph.
Service detail inherits the same chrome-free context with a breadcrumb
back to the canvas, and back/delete navigation preserves ?demo=1.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Tomas DvorakandDevin committed 2026-09-23 18:20:05 +02:00
1 parent 1425618c92
commit d9bfd8a2fd
3 files changed
+10 -6

No files matched your search

@@ -644,7 +644,7 @@ export function ProjectWorkspacePage() {
This project may have been deleted or you don't have access.
</p>
<button
onClick={() => navigate('/projects')}
onClick={() => navigate(isDemoMode ? '/projects?demo=1' : '/projects')}
className="mt-6 px-4 py-2 rounded-[var(--radius-md)] border border-[var(--border-subtle)] text-sm font-medium hover:border-[var(--border-default)] transition-colors"
>
Back to Projects
@@ -656,12 +656,14 @@ export function ProjectWorkspacePage() {
const canvasView = activeView === 'canvas';
const projectsHref = isDemoMode ? '/projects?demo=1' : '/projects';
return (
<div className="flex h-full min-h-0 flex-col">
<div className="flex h-dvh min-h-0 flex-col bg-[var(--bg-void)]">
{/* Slim workspace bar — tabs + project meta, canvas fills everything below */}
<div className="flex h-12 shrink-0 items-center gap-3 border-b border-[var(--border-subtle)] bg-[var(--bg-base)]/80 px-4 backdrop-blur-sm">
<button
onClick={() => navigate('/projects')}
onClick={() => navigate(projectsHref)}
className="flex items-center gap-1.5 text-xs text-[var(--text-tertiary)] hover:text-[var(--text-primary)] transition-colors shrink-0"
>
<ArrowLeft size={14} />