diff --git a/assets/css/custom.css b/assets/css/custom.css index cc1b6fa..474c5f6 100644 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -67,3 +67,24 @@ body { padding: 1rem 0; font-size: 0.9rem; } + +.stats-card { + background-color: #18181B; + border: 1px solid #2A2A2E; + border-radius: 0.5rem; + transition: transform 0.2s ease-in-out, border-color 0.2s ease-in-out; +} + +.stats-card:hover { + transform: scale(1.03); + border-color: #9146FF; +} + +.stats-card .card-title { + color: #ADADB8; +} + +.stats-card .card-text { + color: #FFFFFF; + font-weight: bold; +} diff --git a/assets/js/main.js b/assets/js/main.js index d8af86b..c7f3cd5 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -1,5 +1,37 @@ -// Future JavaScript for interactivity - document.addEventListener('DOMContentLoaded', function() { console.log('Twitch Dashboard Ready'); -}); + + const searchBar = document.getElementById('search-bar'); + if (searchBar) { + searchBar.addEventListener('keyup', function(e) { + const term = e.target.value.toLowerCase(); + + // Filter Top Games + const gameCards = document.querySelectorAll('.game-card'); + gameCards.forEach(card => { + const title = card.querySelector('.card-title').textContent.toLowerCase(); + const tags = Array.from(card.querySelectorAll('.badge-genre')).map(tag => tag.textContent.toLowerCase()); + if (title.includes(term) || tags.some(tag => tag.includes(term))) { + card.parentElement.style.display = ''; + } else { + card.parentElement.style.display = 'none'; + } + }); + + // Filter Live Channels + const channelCards = document.querySelectorAll('.channel-card'); + channelCards.forEach(card => { + const name = card.querySelector('.card-title').textContent.toLowerCase(); + const game = card.querySelector('.card-text.small').textContent.toLowerCase(); + const title = card.querySelector('.card-text.text-white-50').textContent.toLowerCase(); + const tags = Array.from(card.querySelectorAll('.badge-genre')).map(tag => tag.textContent.toLowerCase()); + + if (name.includes(term) || game.includes(term) || title.includes(term) || tags.some(tag => tag.includes(term))) { + card.parentElement.style.display = ''; + } else { + card.parentElement.style.display = 'none'; + } + }); + }); + } +}); \ No newline at end of file diff --git a/index.php b/index.php index e732998..0f978af 100644 --- a/index.php +++ b/index.php @@ -3,57 +3,119 @@ $top_games = [ [ 'title' => 'Just Chatting', - 'viewers' => '350K', - 'tags' => ['IRL'], + 'viewers' => '480K', + 'tags' => ['IRL', 'Casual'], 'img' => 'https://static-cdn.jtvnw.net/ttv-boxart/509658-285x380.jpg' ], [ 'title' => 'League of Legends', - 'viewers' => '125K', - 'tags' => ['MOBA', 'Action'], + 'viewers' => '210K', + 'tags' => ['MOBA', 'Action', 'Strategy'], 'img' => 'https://static-cdn.jtvnw.net/ttv-boxart/21779-285x380.jpg' ], [ 'title' => 'VALORANT', - 'viewers' => '98K', - 'tags' => ['FPS', 'Shooter'], + 'viewers' => '150K', + 'tags' => ['FPS', 'Shooter', 'Tactical'], 'img' => 'https://static-cdn.jtvnw.net/ttv-boxart/516575-285x380.jpg' ], [ 'title' => 'Grand Theft Auto V', - 'viewers' => '88K', - 'tags' => ['Adventure'], + 'viewers' => '120K', + 'tags' => ['Adventure', 'Open World'], 'img' => 'https://static-cdn.jtvnw.net/ttv-boxart/32982_IGDB-285x380.jpg' ], + [ + 'title' => 'Fortnite', + 'viewers' => '110K', + 'tags' => ['Battle Royale', 'Shooter'], + 'img' => 'https://static-cdn.jtvnw.net/ttv-boxart/33214-285x380.jpg' + ], + [ + 'title' => 'Counter-Strike 2', + 'viewers' => '95K', + 'tags' => ['FPS', 'Tactical', 'Shooter'], + 'img' => 'https://static-cdn.jtvnw.net/ttv-boxart/1812225397_IGDB-285x380.jpg' + ], + [ + 'title' => 'World of Warcraft', + 'viewers' => '80K', + 'tags' => ['MMORPG', 'RPG'], + 'img' => 'https://static-cdn.jtvnw.net/ttv-boxart/18122-285x380.jpg' + ], + [ + 'title' => 'Dota 2', + 'viewers' => '75K', + 'tags' => ['MOBA', 'Strategy'], + 'img' => 'https://static-cdn.jtvnw.net/ttv-boxart/29595-285x380.jpg' + ], ]; $live_channels = [ [ 'name' => 'xQc', 'game' => 'Just Chatting', - 'viewers' => '78K', + 'title' => 'RANKED GRIND! | !socials', + 'viewers' => '98K', + 'tags' => ['Competitive', 'English'], 'img' => 'https://static-cdn.jtvnw.net/jtv_user_pictures/xqc-profile_image-9298d2877057642a-70x70.png' ], [ 'name' => 'Tarik', 'game' => 'VALORANT', - 'viewers' => '45K', + 'title' => 'Vibing and Winning | #1 Radiant', + 'viewers' => '65K', + 'tags' => ['FPS', 'Pro Player'], 'img' => 'https://static-cdn.jtvnw.net/jtv_user_pictures/tarik-profile_image-d6f82a69354da623-70x70.png' ], [ 'name' => 'summit1g', 'game' => 'Old School RuneScape', - 'viewers' => '21K', + 'title' => 'Maxing my account! | !drops', + 'viewers' => '31K', + 'tags' => ['MMORPG', 'Grinding'], 'img' => 'https://static-cdn.jtvnw.net/jtv_user_pictures/summit1g-profile_image-d29b89b15533818c-70x70.png' ], [ 'name' => 'LIRIK', 'game' => 'DayZ', - 'viewers' => '15K', + 'title' => 'SURVIVAL RP | !newvideo', + 'viewers' => '25K', + 'tags' => ['Survival', 'Funny Moments'], 'img' => 'https://static-cdn.jtvnw.net/jtv_user_pictures/lirik-profile_image-4ac8c3250307d433-70x70.png' ], + [ + 'name' => 'Shroud', + 'game' => 'Counter-Strike 2', + 'title' => 'Aim training and pro plays', + 'viewers' => '40K', + 'tags' => ['FPS', 'Pro'], + 'img' => 'https://static-cdn.jtvnw.net/jtv_user_pictures/shroud-profile_image-8839d8f9052f83ca-70x70.png' + ], + [ + 'name' => 'Pokimane', + 'game' => 'Just Chatting', + 'title' => 'Chill stream and Q&A', + 'viewers' => '35K', + 'tags' => ['IRL', 'Community'], + 'img' => 'https://static-cdn.jtvnw.net/jtv_user_pictures/pokimane-profile_image-9332cf5d27f13321-70x70.png' + ], ]; +// Calculate statistics +$total_viewers = 0; +foreach ($live_channels as $channel) { + $viewers = str_replace('K', '000', $channel['viewers']); + $total_viewers += (int)$viewers; +} + +$total_live_channels = count($live_channels); + +$top_category = '-'; +if (!empty($top_games)) { + $top_category = $top_games[0]['title']; +} + // Read project preview data from environment $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Twitch.TV Statistics Dashboard'; $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? ''; @@ -105,11 +167,44 @@ $projectName = $_SERVER['PROJECT_NAME'] ?? 'Twitch Stats';
+
+
+ +
+
+

Dashboard Analytics

+
+
+
+
+
Total Viewers
+

+
+
+
+
+
+
+
Total Live Channels
+

+
+
+
+
+
+
+
Top Category
+

+
+
+
+
+

Top Categories

-
+
<?= htmlspecialchars($game['title']) ?>
@@ -126,18 +221,26 @@ $projectName = $_SERVER['PROJECT_NAME'] ?? 'Twitch Stats';

Recommended Live Channels

-
+
-
-
+
+
<?= htmlspecialchars($channel['name']) ?>
-
-

-
-
- +
+
+
+ +
+
+

+

+
+ + + +
@@ -159,4 +262,4 @@ $projectName = $_SERVER['PROJECT_NAME'] ?? 'Twitch Stats'; - \ No newline at end of file +