-
-
PLAYABLE
-
ID: ROM-{detailsQuery.data.id}
+
+
+ {detailsQuery.data ? (
+
+
+ {/* Poster */}
+
+
+
-
{detailsQuery.data.title}
-
-
-
-
developer_board
-
{detailsQuery.data.developer || 'Unknown Dev'}
+ {/* Info Pane */}
+
+
+ PLAYABLE
+ ID: ROM-{detailsQuery.data.id}
-
- calendar_today
- {detailsQuery.data.releaseDate || 'N/A'}
-
-
- sports_esports
- {detailsQuery.data.system}
-
-
-
- {}}
- onEnterPress={() => console.log("Play Game", detailsQuery.data?.id)}
- className="shrink-0"
- >
- {(focused) => (
-
- play_arrow
- Start Game
-
- )}
-
+
{detailsQuery.data.title}
- {}}
- onEnterPress={() => console.log("Download", detailsQuery.data?.id)}
- className="shrink-0"
- >
- {(focused) => (
-
- download
- Download
-
- )}
-
-
+
+
+ developer_board
+ {detailsQuery.data.developer || 'Unknown Dev'}
+
+
+ calendar_today
+ {detailsQuery.data.releaseDate || 'N/A'}
+
+
+ sports_esports
+ {detailsQuery.data.system}
+
+
-
-
- Brief Summary
-
- {detailsQuery.data.summary || "This title does not have a comprehensive analysis in our local database yet. Our researchers are working to archive more metadata for this specific entry."}
-
-
+
+ setActiveZone('details')}
+ onEnterPress={() => console.log("Play Game", detailsQuery.data?.id)}
+ className="shrink-0"
+ focusKey="DETAILS_PLAY"
+ >
+ {(focused) => (
+
+ play_arrow
+ Start Game
+
+ )}
+
+
+ setActiveZone('details')}
+ onEnterPress={() => console.log("Download", detailsQuery.data?.id)}
+ className="shrink-0"
+ focusKey="DETAILS_DOWNLOAD"
+ >
+ {(focused) => (
+
+ download
+ Download
+
+ )}
+
+
- {detailsQuery.data.genres && detailsQuery.data.genres.length > 0 && (
+
- Classifications
-
- {detailsQuery.data.genres.map(g => (
- {g}
- ))}
-
+ Brief Summary
+
+ {detailsQuery.data.summary || "This title does not have a comprehensive analysis in our local database yet. Our researchers are working to archive more metadata for this specific entry."}
+
- )}
+
+ {detailsQuery.data.genres && detailsQuery.data.genres.length > 0 && (
+
+ Classifications
+
+ {detailsQuery.data.genres.map(g => (
+ {g}
+ ))}
+
+
+ )}
+
-
- ) : selectedGameId ? (
-
-
-
progress_activity
-
Hydrating Metadata...
-
-
- ) : (
-
-
-
videogame_asset
-
Target selection required
+ ) : selectedGameId ? (
+
+
+
progress_activity
+
Hydrating Metadata...
+
-
- )}
-
+ ) : (
+
+
+
videogame_asset
+
Target selection required
+
+
+ )}
+
+
-
);
};
diff --git a/src/index.css b/src/index.css
index b94f90d..79bfd82 100644
--- a/src/index.css
+++ b/src/index.css
@@ -5,9 +5,10 @@
@layer base {
:root {
color-scheme: dark;
+ --color-accent: #2563eb;
}
- /* Premium Global Scrollbars */
+ /* Premium Global Scrollbars — thumb color driven by CSS variable */
::-webkit-scrollbar {
width: 6px;
height: 6px;
@@ -16,33 +17,52 @@
background: transparent;
}
::-webkit-scrollbar-thumb {
- background: rgba(255, 255, 255, 0.1);
+ background: var(--scrollbar-thumb-color, rgba(255, 255, 255, 0.1));
border-radius: 20px;
border: 1px solid transparent;
background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover {
- background: rgba(255, 255, 255, 0.2);
+ background: var(--scrollbar-thumb-hover-color, rgba(255, 255, 255, 0.2));
background-clip: content-box;
}
/* Firefox Support */
* {
scrollbar-width: thin;
- scrollbar-color: rgba(255, 255, 255, 0.1) transparent;
+ scrollbar-color: var(--scrollbar-thumb-color, rgba(255, 255, 255, 0.1)) transparent;
}
}
body {
margin: 0;
min-height: 100vh;
- background-color: #10131f; /* Adjusted to Stitch's deep charcoal */
- overflow: hidden; /* Prevent body scroll per Stitch design */
+ background-color: #10131f;
+ overflow: hidden;
}
@layer utilities {
.no-scrollbar::-webkit-scrollbar { display: none; }
.no-scrollbar { -ms-overflow-style: none; scrollbar-width: none; }
+
+ /* Setting the CSS variable on the scrollable container causes the pseudo-element
+ to inherit it, which is the correct way to drive scrollbar color via state. */
+ .scrollbar-active {
+ --scrollbar-thumb-color: var(--color-accent);
+ --scrollbar-thumb-hover-color: var(--color-accent);
+ }
+
+ /* Auto-scroll animation for long game titles when focused */
+ @keyframes scroll-title {
+ 0%, 15% { transform: translateX(0%); }
+ 85%, 100% { transform: translateX(-60%); }
+ }
+
+ .marquee-active {
+ display: inline-block;
+ animation: scroll-title 4s ease-in-out infinite alternate;
+ animation-delay: 0.4s;
+ }
body.gamepad-active {
cursor: none !important;