From 9f9f3354390cf2f680a62bc17ccefa213ee95b5f Mon Sep 17 00:00:00 2001 From: josedario87 Date: Sun, 15 Feb 2026 02:54:27 -0600 Subject: [PATCH] feat: Auto-save components, soft delete, tags, compact WCO header - Auto-save rendered Vue components to DB on render_vue_component - Soft delete (archive) instead of hard delete for components - Tags support for component categorization - Gallery limited to 10 most recent items per section - Upsert with ON CONFLICT for component saves - PUT endpoint for partial component updates - Collapsible toolbar with animated toggle button - Window Controls Overlay support for PWA titlebar - Compact header mode (32px) with hidden dot toggle - Dynamic theme-color meta sync for Windows titlebar --- frontend/index.html | 2 +- frontend/src/App.vue | 237 +++++++++++++++--- frontend/src/components/CanvasGallery.vue | 38 ++- frontend/src/components/Toolbar.vue | 25 +- frontend/src/services/dynamicComponents.ts | 43 +++- .../services/tools/handlers/canvasHandlers.ts | 10 +- .../tools/handlers/componentHandlers.ts | 33 ++- frontend/vite.config.ts | 3 +- server/db/migrations.ts | 4 +- server/routes/components.ts | 90 +++++-- 10 files changed, 401 insertions(+), 84 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index a3702d1..3bc3b81 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -5,7 +5,7 @@ - + diff --git a/frontend/src/App.vue b/frontend/src/App.vue index cff4239..6dedb8d 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -6,6 +6,7 @@ import TorchButton from './components/TorchButton.vue' import FloatingTerminal from './components/FloatingTerminal.vue' import FloatingResponse from './components/FloatingResponse.vue' import FloatingVoice from './components/FloatingVoice.vue' +import AgentBar from './components/AgentBar.vue' import PwaInstallBanner from './components/PwaInstallBanner.vue' import { initWebMCP, getWebMCP } from './services/webmcp' import { initTorch, destroyTorch } from './services/torch' @@ -21,6 +22,8 @@ const router = useRouter() const showTerminal = ref(false) const showVoice = ref(false) const showDebugConsole = ref(false) +const toolbarVisible = ref(true) +const forceWco = ref(false) const debugLogs = ref>([]) // Intercept console.log for debug panel @@ -242,7 +245,17 @@ function triggerToolFlash() { type PageName = 'home' | 'canvas' | 'components' | 'themes' | 'project-canvas' | 'database' | 'source' | 'terminal' | 'tools' | 'agents' +function syncThemeColor() { + const bg = getComputedStyle(document.documentElement).getPropertyValue('--bg-primary').trim() + if (bg) { + document.querySelector('meta[name="theme-color"]')?.setAttribute('content', bg) + } +} + onMounted(async () => { + // Sync Windows titlebar color with CSS variable + syncThemeColor() + // Connect to WebSocket for Claude status updates connectStatusWs() @@ -348,10 +361,20 @@ watch(() => route.name, (newPage) => {