diff --git a/frontend/src/app/pages/Dashboard/desktop/ApplicationsWindow.tsx b/frontend/src/app/pages/Dashboard/desktop/ApplicationsWindow.tsx index 4d85f5f9..4458522e 100644 --- a/frontend/src/app/pages/Dashboard/desktop/ApplicationsWindow.tsx +++ b/frontend/src/app/pages/Dashboard/desktop/ApplicationsWindow.tsx @@ -21,18 +21,24 @@ function hueFor(name: string): number { function AppTile({ output }: { output: Output }): React.ReactElement { const tile = { - width: 64, - height: 64, - borderRadius: '15px', + width: 68, + height: 68, + borderRadius: '16px', 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)', + boxShadow: 'inset 0 0 0 1px rgba(255,255,255,0.14), 0 6px 18px rgba(0,0,0,0.32)', } as const; if (output.thumbnail) { - return ; + return ( + + + {/* A soft top gloss makes a raw screenshot read as an app ICON instead of a pasted image. */} + + + ); } const glyph = (output.icon || '').trim(); const h = hueFor(output.name || '?'); @@ -79,21 +85,28 @@ function ApplicationsWindow({ outputs, onOpenApp, onClose }: ApplicationsWindowP maxHeight: 'calc(100% - 120px)', display: 'flex', flexDirection: 'column', - borderRadius: '18px', - background: 'rgba(22,12,34,0.82)', + borderRadius: '20px', + background: 'rgba(18,16,24,0.86)', backdropFilter: 'blur(28px) saturate(160%)', WebkitBackdropFilter: 'blur(28px) saturate(160%)', - boxShadow: '0 24px 64px rgba(0,0,0,0.5)', + boxShadow: '0 24px 64px rgba(0,0,0,0.5), inset 0 0 0 1px rgba(255,255,255,0.07)', p: 2.5, + '@keyframes appwin-in': { + from: { opacity: 0, transform: 'translate(-50%, -50%) scale(0.96)' }, + to: { opacity: 1, transform: 'translate(-50%, -50%) scale(1)' }, + }, + animation: 'appwin-in 0.18s cubic-bezier(0.2, 0.8, 0.2, 1) both', }} > - - + + Applications - - {Object.keys(outputs).length > 0 ? Object.keys(outputs).length : ''} - + {Object.keys(outputs).length > 0 && ( + + {Object.keys(outputs).length} + + )} {Object.keys(outputs).length > 8 && ( @@ -135,7 +148,7 @@ function ApplicationsWindow({ outputs, onOpenApp, onClose }: ApplicationsWindowP )} {apps.length > 0 && ( - + {apps.map((output) => ( - + - + {output.name}