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}