From 8d014db030826188a81ff51fc36e2230a59efdf8 Mon Sep 17 00:00:00 2001 From: ciregenz Date: Tue, 4 Aug 2026 20:31:30 -0700 Subject: [PATCH] [eric] apps: the launcher drops the octopus and orange twins for per-app hues, monograms, and Launchpad hover --- .../Dashboard/desktop/ApplicationsWindow.tsx | 56 +++++++++++++------ 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/frontend/src/app/pages/Dashboard/desktop/ApplicationsWindow.tsx b/frontend/src/app/pages/Dashboard/desktop/ApplicationsWindow.tsx index 758f29bb..4d85f5f9 100644 --- a/frontend/src/app/pages/Dashboard/desktop/ApplicationsWindow.tsx +++ b/frontend/src/app/pages/Dashboard/desktop/ApplicationsWindow.tsx @@ -12,24 +12,41 @@ interface ApplicationsWindowProps { onClose: () => void; } +// Stable per-app hue so icon-less apps are told apart at a glance; the old shared orange made every fallback tile an identical twin. +function hueFor(name: string): number { + let h = 0; + for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) >>> 0; + return h % 360; +} + function AppTile({ output }: { output: Output }): React.ReactElement { const tile = { - width: 52, - height: 52, - borderRadius: '12px', + width: 64, + height: 64, + borderRadius: '15px', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0, + // Hairline inset so screenshots and light tiles read as crafted app icons on the glass, not raw pasted images. + boxShadow: 'inset 0 0 0 1px rgba(255,255,255,0.12), 0 4px 14px rgba(0,0,0,0.28)', } as const; if (output.thumbnail) { return ; } - // The icon field holds an emoji for most apps; anything longer is not a glyph, so fall back to the app symbol. const glyph = (output.icon || '').trim(); + const h = hueFor(output.name || '?'); return ( - - {glyph && glyph.length <= 3 ? glyph : } + + {glyph && glyph.length <= 3 ? glyph : (output.name || '?').trim().charAt(0).toUpperCase()} ); } @@ -70,11 +87,13 @@ function ApplicationsWindow({ outputs, onOpenApp, onClose }: ApplicationsWindowP p: 2.5, }} > - - 🐙 - + + Applications + + {Object.keys(outputs).length > 0 ? Object.keys(outputs).length : ''} + {Object.keys(outputs).length > 8 && ( @@ -116,7 +135,7 @@ function ApplicationsWindow({ outputs, onOpenApp, onClose }: ApplicationsWindowP )} {apps.length > 0 && ( - + {apps.map((output) => ( - - + + + + {output.name}