diff --git a/web/src/routes/[username]/[workspace]/+page.svelte b/web/src/routes/[username]/[workspace]/+page.svelte index a0dba525..968a2b3c 100644 --- a/web/src/routes/[username]/[workspace]/+page.svelte +++ b/web/src/routes/[username]/[workspace]/+page.svelte @@ -205,6 +205,10 @@ let totalItems = $derived(dashboard?.summary.total_items ?? 0); let firstCollection = $derived(collections.filter(c => !c.is_system && c.slug !== 'tasks').sort((a, b) => a.sort_order - b.sort_order)[0]); let hasTasksCollection = $derived(collections.some(c => c.slug === 'tasks')); + // A workspace with no user-facing collections (only system ones, or none) + // has no manual path to create anything from the board. Drives the + // web-only escape hatch on the skipped-onboarding board (TASK-1856). + let hasUserCollections = $derived(collections.some(c => !c.is_system)); function statusColor(status: string): string { const s = status.toLowerCase().replace(/-/g, '_'); @@ -344,13 +348,39 @@ and ConnectBanner use. --> {#if needsOnboarding && onboardingDismissed} - -
- -
+ {#if isOwner && !hasUserCollections} + +
+ +
+

Your workspace is empty

+

+ Connect an agent and say set up my workspace to + have it set up for you — or create your first collection by hand. +

+
+ + +
+
+
+ {:else} + +
+ +
+ {/if} {/if} @@ -710,6 +740,49 @@ border-color: var(--text-muted); } + /* Web-only escape hatch (TASK-1856) — manual start for users who skip the + agent flow on an empty workspace. */ + .empty-escape { + display: flex; + align-items: flex-start; + gap: var(--space-3); + margin-bottom: var(--space-4); + padding: var(--space-4); + background: var(--bg-secondary); + border: 1px solid var(--border); + border-radius: var(--radius); + } + .empty-escape-icon { + font-size: 1.4em; + line-height: 1.2; + flex-shrink: 0; + } + .empty-escape-body { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + gap: var(--space-2); + } + .empty-escape-title { + margin: 0; + font-size: 0.95em; + font-weight: 600; + color: var(--text-primary); + } + .empty-escape-text { + margin: 0; + font-size: 0.85em; + line-height: 1.45; + color: var(--text-secondary); + } + .empty-escape-actions { + display: flex; + flex-wrap: wrap; + gap: var(--space-2); + margin-top: var(--space-1); + } + /* ── Section headers ────────────────────────────────────────────────── */ .section { margin-bottom: var(--space-8);