From 05d331efe20d028f821a49c5cb14f2237924df4c Mon Sep 17 00:00:00 2001 From: MayaTheShy Date: Thu, 19 Feb 2026 22:51:13 -0500 Subject: [PATCH] feat: Add StatsPanel component with responsive design and styling --- client/src/components/StatsPanel.css | 374 +++++++++++++++++++++++++++ 1 file changed, 374 insertions(+) create mode 100644 client/src/components/StatsPanel.css diff --git a/client/src/components/StatsPanel.css b/client/src/components/StatsPanel.css new file mode 100644 index 0000000..0d7fe61 --- /dev/null +++ b/client/src/components/StatsPanel.css @@ -0,0 +1,374 @@ +.stats-panel { + padding: 1.5rem; + background: #0f172a; + border-radius: 0.5rem; + height: 100%; + overflow-y: auto; +} + +.stats-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1.5rem; + flex-wrap: wrap; + gap: 1rem; +} + +.stats-header h2 { + font-size: 1.5rem; + font-weight: 700; + color: #f9fafb; + margin: 0; +} + +.time-filter { + display: flex; + gap: 0.5rem; + background: #1e293b; + padding: 0.25rem; + border-radius: 0.5rem; +} + +.time-filter button { + padding: 0.5rem 1rem; + background: transparent; + border: none; + border-radius: 0.375rem; + color: #94a3b8; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} + +.time-filter button:hover { + color: #e5e7eb; + background: #334155; +} + +.time-filter button.active { + background: #3b82f6; + color: white; +} + +.loading { + text-align: center; + padding: 2rem; + color: #94a3b8; + font-size: 0.875rem; +} + +/* Turtle Stats */ +.turtle-stats { + margin-bottom: 2rem; +} + +.turtle-stats h3 { + font-size: 1.125rem; + font-weight: 600; + color: #f9fafb; + margin-bottom: 1rem; +} + +.stat-section { + background: #1e293b; + border-radius: 0.5rem; + padding: 1.5rem; +} + +.total-mined { + text-align: center; + margin-bottom: 1.5rem; + padding-bottom: 1.5rem; + border-bottom: 1px solid #334155; +} + +.stat-value { + font-size: 3rem; + font-weight: 700; + color: #3b82f6; + line-height: 1; +} + +.stat-label { + font-size: 0.875rem; + color: #94a3b8; + margin-top: 0.5rem; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.blocks-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 1rem; +} + +.block-stat { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.75rem; + background: #0f172a; + border-radius: 0.375rem; + transition: all 0.2s; +} + +.block-stat:hover { + background: #1e293b; + transform: translateY(-2px); +} + +.block-emoji { + font-size: 2rem; + line-height: 1; +} + +.block-info { + flex: 1; +} + +.block-name { + font-size: 0.875rem; + font-weight: 600; + color: #e5e7eb; + margin-bottom: 0.25rem; +} + +.block-count { + font-size: 0.75rem; + color: #10b981; + font-weight: 600; +} + +/* Leaderboard */ +.leaderboard { + margin-bottom: 2rem; +} + +.leaderboard h3 { + font-size: 1.125rem; + font-weight: 600; + color: #f9fafb; + margin-bottom: 1rem; +} + +.leaderboard-list { + background: #1e293b; + border-radius: 0.5rem; + padding: 1rem; +} + +.leaderboard-item { + display: flex; + align-items: center; + gap: 1rem; + padding: 0.75rem; + margin-bottom: 0.5rem; + background: #0f172a; + border-radius: 0.375rem; + transition: all 0.2s; +} + +.leaderboard-item:last-child { + margin-bottom: 0; +} + +.leaderboard-item:hover { + background: #1e293b; + transform: translateX(4px); +} + +.leaderboard-item.rank-1 { + border-left: 3px solid #fbbf24; +} + +.leaderboard-item.rank-2 { + border-left: 3px solid #9ca3af; +} + +.leaderboard-item.rank-3 { + border-left: 3px solid #cd7f32; +} + +.rank { + font-size: 1.5rem; + font-weight: 700; + min-width: 3rem; + text-align: center; +} + +.miner-info { + flex: 1; +} + +.miner-name { + font-size: 0.875rem; + font-weight: 600; + color: #e5e7eb; + margin-bottom: 0.25rem; +} + +.miner-stats { + font-size: 0.75rem; + color: #94a3b8; +} + +.miner-score { + font-size: 1.25rem; + font-weight: 700; + color: #3b82f6; +} + +/* All Turtles Overview */ +.all-turtles-stats h3 { + font-size: 1.125rem; + font-weight: 600; + color: #f9fafb; + margin-bottom: 1rem; +} + +.turtles-summary-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + gap: 1rem; +} + +.turtle-summary-card { + background: #1e293b; + border-radius: 0.5rem; + padding: 1rem; + transition: all 0.2s; +} + +.turtle-summary-card:hover { + background: #334155; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.turtle-summary-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.75rem; + padding-bottom: 0.75rem; + border-bottom: 1px solid #334155; +} + +.turtle-id { + font-size: 0.875rem; + font-weight: 600; + color: #e5e7eb; +} + +.turtle-total { + font-size: 1.25rem; + font-weight: 700; + color: #3b82f6; +} + +.turtle-top-blocks { + display: flex; + gap: 0.5rem; +} + +.mini-block-stat { + display: flex; + align-items: center; + gap: 0.25rem; + padding: 0.375rem 0.5rem; + background: #0f172a; + border-radius: 0.25rem; + flex: 1; +} + +.mini-emoji { + font-size: 1rem; +} + +.mini-count { + font-size: 0.75rem; + font-weight: 600; + color: #10b981; +} + +/* Empty State */ +.empty-state { + text-align: center; + padding: 4rem 2rem; +} + +.empty-icon { + font-size: 4rem; + margin-bottom: 1rem; + opacity: 0.5; +} + +.empty-title { + font-size: 1.25rem; + font-weight: 600; + color: #e5e7eb; + margin-bottom: 0.5rem; +} + +.empty-text { + font-size: 0.875rem; + color: #94a3b8; +} + +.no-data { + text-align: center; + padding: 2rem; + color: #94a3b8; + font-size: 0.875rem; +} + +/* Mobile Responsive */ +@media (max-width: 768px) { + .stats-panel { + padding: 1rem; + } + + .stats-header { + flex-direction: column; + align-items: flex-start; + } + + .time-filter { + width: 100%; + } + + .time-filter button { + flex: 1; + padding: 0.625rem; + } + + .blocks-grid { + grid-template-columns: 1fr; + } + + .turtles-summary-grid { + grid-template-columns: 1fr; + } + + .stat-value { + font-size: 2.5rem; + } +} + +@media (max-width: 480px) { + .stats-header h2 { + font-size: 1.25rem; + } + + .leaderboard-item { + padding: 0.5rem; + gap: 0.5rem; + } + + .rank { + font-size: 1.25rem; + min-width: 2.5rem; + } +}