pi-mega-compact 0.8.12 → 0.8.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/extensions/dashboard-client/dist/assets/AchievementTiles-BH26e95w.js +2 -0
  2. package/extensions/dashboard-client/dist/assets/AchievementTiles-BH26e95w.js.map +1 -0
  3. package/extensions/dashboard-client/dist/assets/AchievementsTab-B94wvRV_.js +2 -0
  4. package/extensions/dashboard-client/dist/assets/AchievementsTab-B94wvRV_.js.map +1 -0
  5. package/extensions/dashboard-client/dist/assets/CacheTab-DPmw3NHR.js +2 -0
  6. package/extensions/dashboard-client/dist/assets/CacheTab-DPmw3NHR.js.map +1 -0
  7. package/extensions/dashboard-client/dist/assets/ConfigTab-C3g3smRL.js +2 -0
  8. package/extensions/dashboard-client/dist/assets/ConfigTab-C3g3smRL.js.map +1 -0
  9. package/extensions/dashboard-client/dist/assets/EventsTab-B5PicfFw.js +2 -0
  10. package/extensions/dashboard-client/dist/assets/EventsTab-B5PicfFw.js.map +1 -0
  11. package/extensions/dashboard-client/dist/assets/GameTab-CsVwp78a.js +2 -0
  12. package/extensions/dashboard-client/dist/assets/GameTab-CsVwp78a.js.map +1 -0
  13. package/extensions/dashboard-client/dist/assets/MetricsTab-Cf72UewX.js +2 -0
  14. package/extensions/dashboard-client/dist/assets/MetricsTab-Cf72UewX.js.map +1 -0
  15. package/extensions/dashboard-client/dist/assets/OverviewTab-Dh6aG3gy.js +2 -0
  16. package/extensions/dashboard-client/dist/assets/OverviewTab-Dh6aG3gy.js.map +1 -0
  17. package/extensions/dashboard-client/dist/assets/ReposTab-HXf2dorl.js +2 -0
  18. package/extensions/dashboard-client/dist/assets/ReposTab-HXf2dorl.js.map +1 -0
  19. package/extensions/dashboard-client/dist/assets/TimeSavedCard-kUnoospE.js +2 -0
  20. package/extensions/dashboard-client/dist/assets/TimeSavedCard-kUnoospE.js.map +1 -0
  21. package/extensions/dashboard-client/dist/assets/index-Cfxniu2R.css +1 -0
  22. package/extensions/dashboard-client/dist/assets/{index-XAIN8km6.js → index-DMntLu-8.js} +11 -10
  23. package/extensions/dashboard-client/dist/assets/index-DMntLu-8.js.map +1 -0
  24. package/extensions/dashboard-client/dist/index.html +2 -2
  25. package/extensions/dashboard-client/src/App.tsx +18 -4
  26. package/extensions/dashboard-client/src/components/AchievementTiles.tsx +105 -0
  27. package/extensions/dashboard-client/src/components/ActiveReposTable.tsx +116 -0
  28. package/extensions/dashboard-client/src/components/CacheHitsCard.tsx +73 -0
  29. package/extensions/dashboard-client/src/components/CacheStatusPerModel.tsx +78 -35
  30. package/extensions/dashboard-client/src/components/ConfigSummaryCard.tsx +101 -0
  31. package/extensions/dashboard-client/src/components/ContextGauge.tsx +11 -15
  32. package/extensions/dashboard-client/src/components/DataSafetyCard.tsx +42 -33
  33. package/extensions/dashboard-client/src/components/EventCategoryFilter.tsx +46 -9
  34. package/extensions/dashboard-client/src/components/LegendCard.tsx +49 -0
  35. package/extensions/dashboard-client/src/components/ModelBadge.tsx +42 -11
  36. package/extensions/dashboard-client/src/components/PerfCards.tsx +91 -0
  37. package/extensions/dashboard-client/src/components/RepoAllSessionsCard.tsx +102 -0
  38. package/extensions/dashboard-client/src/components/RepoDetailModal.tsx +9 -2
  39. package/extensions/dashboard-client/src/components/RepoTable.tsx +30 -22
  40. package/extensions/dashboard-client/src/components/SavingsByModelTable.tsx +226 -0
  41. package/extensions/dashboard-client/src/components/SessionInfo.tsx +25 -50
  42. package/extensions/dashboard-client/src/components/SummaryTiles.tsx +20 -11
  43. package/extensions/dashboard-client/src/components/TimeSavedCard.tsx +61 -0
  44. package/extensions/dashboard-client/src/components/TriggerStatus.tsx +31 -19
  45. package/extensions/dashboard-client/src/components/VectorStoreCard.tsx +134 -0
  46. package/extensions/dashboard-client/src/main.tsx +5 -0
  47. package/extensions/dashboard-client/src/styles/base.css +76 -9
  48. package/extensions/dashboard-client/src/styles/config.css +149 -0
  49. package/extensions/dashboard-client/src/styles/game-achievements.css +265 -0
  50. package/extensions/dashboard-client/src/styles/metrics-extra.css +69 -0
  51. package/extensions/dashboard-client/src/styles/overview-extra.css +170 -0
  52. package/extensions/dashboard-client/src/styles/repos-extra.css +99 -0
  53. package/extensions/dashboard-client/src/styles/repos-metrics.css +14 -23
  54. package/extensions/dashboard-client/src/tabs/AchievementsTab.tsx +55 -0
  55. package/extensions/dashboard-client/src/tabs/CacheTab.tsx +50 -0
  56. package/extensions/dashboard-client/src/tabs/ConfigTab.tsx +240 -5
  57. package/extensions/dashboard-client/src/tabs/EventsTab.tsx +55 -3
  58. package/extensions/dashboard-client/src/tabs/GameTab.tsx +287 -0
  59. package/extensions/dashboard-client/src/tabs/MetricsTab.tsx +7 -1
  60. package/extensions/dashboard-client/src/tabs/OverviewTab.tsx +103 -17
  61. package/extensions/dashboard-client/src/tabs/ReposTab.tsx +57 -22
  62. package/extensions/dashboard-client/src/utils/format.ts +85 -0
  63. package/extensions/dashboard-client/src/utils/types.ts +27 -0
  64. package/package.json +1 -1
  65. package/extensions/dashboard-client/dist/assets/ConfigTab-RrjXWfvr.js +0 -2
  66. package/extensions/dashboard-client/dist/assets/ConfigTab-RrjXWfvr.js.map +0 -1
  67. package/extensions/dashboard-client/dist/assets/EventsTab-BH_FxJ08.js +0 -2
  68. package/extensions/dashboard-client/dist/assets/EventsTab-BH_FxJ08.js.map +0 -1
  69. package/extensions/dashboard-client/dist/assets/MetricsTab-C-PoFV4p.js +0 -2
  70. package/extensions/dashboard-client/dist/assets/MetricsTab-C-PoFV4p.js.map +0 -1
  71. package/extensions/dashboard-client/dist/assets/OverviewTab-Db-qBqFN.js +0 -2
  72. package/extensions/dashboard-client/dist/assets/OverviewTab-Db-qBqFN.js.map +0 -1
  73. package/extensions/dashboard-client/dist/assets/ReposTab-DhCjJvuj.js +0 -2
  74. package/extensions/dashboard-client/dist/assets/ReposTab-DhCjJvuj.js.map +0 -1
  75. package/extensions/dashboard-client/dist/assets/index-Buer5yxB.css +0 -1
  76. package/extensions/dashboard-client/dist/assets/index-XAIN8km6.js.map +0 -1
@@ -2,7 +2,7 @@
2
2
  * dashboard-client/src/styles/base.css — shell + theme tokens + layout primitives.
3
3
  *
4
4
  * Shared by all tabs. Theme picker (Sprint C3) will override these tokens.
5
- * Kept under 300 lines per project doc-length guideline.
5
+ * Responsive: scales from 400px narrow to 4K ultrawide.
6
6
  */
7
7
 
8
8
  :root {
@@ -16,6 +16,7 @@
16
16
  --warn: #d29922;
17
17
  --err: #f85149;
18
18
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
19
+ font-size: clamp(13px, 0.9vw, 16px);
19
20
  }
20
21
 
21
22
  * {
@@ -26,19 +27,25 @@ body {
26
27
  margin: 0;
27
28
  background: var(--bg);
28
29
  color: var(--text);
29
- font-size: 14px;
30
30
  }
31
31
 
32
32
  .dashboard-app {
33
- max-width: 1200px;
33
+ max-width: min(1600px, 96vw);
34
34
  margin: 0 auto;
35
- padding: 16px;
35
+ padding: clamp(8px, 2vw, 24px);
36
+ }
37
+
38
+ /* Responsive container — scales fluidly from narrow to ultrawide */
39
+ .card-grid {
40
+ display: grid;
41
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
42
+ gap: clamp(8px, 1.5vw, 16px);
36
43
  }
37
44
 
38
45
  .dashboard-header h1 {
39
- font-size: 18px;
46
+ font-size: clamp(16px, 1.4vw, 22px);
40
47
  font-weight: 600;
41
- margin: 0 0 12px;
48
+ margin: 0 0 clamp(8px, 1vw, 16px);
42
49
  }
43
50
 
44
51
  .dashboard-header .tier,
@@ -46,7 +53,7 @@ body {
46
53
  display: inline-block;
47
54
  margin-left: 8px;
48
55
  padding: 2px 8px;
49
- font-size: 12px;
56
+ font-size: clamp(10px, 0.8vw, 12px);
50
57
  border-radius: 10px;
51
58
  background: var(--panel);
52
59
  border: 1px solid var(--border);
@@ -61,7 +68,9 @@ body {
61
68
  display: flex;
62
69
  gap: 4px;
63
70
  border-bottom: 1px solid var(--border);
64
- margin-bottom: 16px;
71
+ margin-bottom: clamp(8px, 1vw, 16px);
72
+ overflow-x: auto;
73
+ flex-wrap: nowrap;
65
74
  }
66
75
 
67
76
  .tab-bar button {
@@ -70,8 +79,9 @@ body {
70
79
  color: var(--muted);
71
80
  padding: 8px 14px;
72
81
  cursor: pointer;
73
- font-size: 13px;
82
+ font-size: clamp(12px, 0.85vw, 14px);
74
83
  border-bottom: 2px solid transparent;
84
+ white-space: nowrap;
75
85
  }
76
86
 
77
87
  .tab-bar button.active {
@@ -119,3 +129,60 @@ body {
119
129
  border-radius: 8px;
120
130
  text-align: center;
121
131
  }
132
+
133
+ /* Tables: horizontal scroll on narrow screens */
134
+ .repos {
135
+ width: 100%;
136
+ border-collapse: collapse;
137
+ font-size: clamp(12px, 0.8vw, 14px);
138
+ }
139
+
140
+ .repos th, .repos td {
141
+ padding: 6px 10px;
142
+ border-bottom: 1px solid var(--border-soft, var(--border));
143
+ text-align: left;
144
+ }
145
+
146
+ .repos th {
147
+ background: var(--bg);
148
+ position: sticky;
149
+ top: 0;
150
+ }
151
+
152
+ .table-wrap {
153
+ overflow-x: auto;
154
+ }
155
+
156
+ /* Narrow screens: single column */
157
+ @media (max-width: 640px) {
158
+ .card-grid {
159
+ grid-template-columns: 1fr;
160
+ }
161
+ .tab-bar button {
162
+ padding: 6px 10px;
163
+ font-size: 12px;
164
+ }
165
+ }
166
+
167
+ /* Medium screens: 2 columns */
168
+ @media (min-width: 641px) and (max-width: 1024px) {
169
+ .card-grid {
170
+ grid-template-columns: repeat(2, 1fr);
171
+ }
172
+ }
173
+
174
+ /* Wide screens: 3-4 columns */
175
+ @media (min-width: 1025px) {
176
+ .card-grid {
177
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
178
+ }
179
+ }
180
+
181
+ @media (min-width: 1601px) {
182
+ .dashboard-app {
183
+ max-width: min(1800px, 96vw);
184
+ }
185
+ .card-grid {
186
+ grid-template-columns: repeat(4, 1fr);
187
+ }
188
+ }
@@ -0,0 +1,149 @@
1
+ /**
2
+ * dashboard-client/src/styles/config.css — Config tab + category filter styles.
3
+ *
4
+ * Kept under 300 lines per project doc-length guideline.
5
+ */
6
+
7
+ /* ── Config tab layout ──────────────────────────────────────────────────── */
8
+
9
+ .config-tab {
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: 16px;
13
+ }
14
+
15
+ .config-settings,
16
+ .config-display {
17
+ padding: 14px 16px;
18
+ background: var(--panel);
19
+ border: 1px solid var(--border);
20
+ border-radius: 8px;
21
+ }
22
+
23
+ .config-settings h3,
24
+ .config-display h3 {
25
+ margin: 0 0 12px;
26
+ font-size: clamp(12px, 1vw, 14px);
27
+ color: var(--muted);
28
+ font-weight: 600;
29
+ text-transform: uppercase;
30
+ letter-spacing: 0.5px;
31
+ }
32
+
33
+ /* ── Settings strip ─────────────────────────────────────────────────────── */
34
+
35
+ .settings-row {
36
+ margin-bottom: 10px;
37
+ }
38
+
39
+ .settings-row:last-child {
40
+ margin-bottom: 0;
41
+ }
42
+
43
+ .settings-row label {
44
+ display: flex;
45
+ align-items: center;
46
+ gap: 8px;
47
+ font-size: clamp(13px, 0.9vw, 15px);
48
+ color: var(--text);
49
+ cursor: pointer;
50
+ }
51
+
52
+ .settings-row select {
53
+ padding: 4px 8px;
54
+ font-size: clamp(12px, 0.85vw, 14px);
55
+ background: var(--bg);
56
+ color: var(--text);
57
+ border: 1px solid var(--border);
58
+ border-radius: 4px;
59
+ cursor: pointer;
60
+ }
61
+
62
+ .settings-row select:disabled {
63
+ opacity: 0.5;
64
+ cursor: not-allowed;
65
+ }
66
+
67
+ .settings-row input[type="checkbox"] {
68
+ width: 16px;
69
+ height: 16px;
70
+ cursor: pointer;
71
+ }
72
+
73
+ /* ── Config display grid ────────────────────────────────────────────────── */
74
+
75
+ .config-grid {
76
+ display: grid;
77
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
78
+ gap: 10px;
79
+ }
80
+
81
+ .config-item {
82
+ display: flex;
83
+ flex-direction: column;
84
+ gap: 3px;
85
+ padding: 8px 10px;
86
+ background: var(--bg);
87
+ border: 1px solid var(--border);
88
+ border-radius: 6px;
89
+ }
90
+
91
+ .config-label {
92
+ font-size: clamp(11px, 0.75vw, 13px);
93
+ color: var(--muted);
94
+ text-transform: uppercase;
95
+ letter-spacing: 0.4px;
96
+ }
97
+
98
+ .config-value {
99
+ font-size: clamp(13px, 1vw, 16px);
100
+ font-weight: 600;
101
+ color: var(--text);
102
+ }
103
+
104
+ /* ── Event category filter ──────────────────────────────────────────────── */
105
+
106
+ .event-category-filter {
107
+ display: flex;
108
+ flex-wrap: wrap;
109
+ gap: 6px;
110
+ align-items: center;
111
+ }
112
+
113
+ .category-chip {
114
+ padding: 3px 10px;
115
+ font-size: clamp(11px, 0.75vw, 13px);
116
+ border: 1px solid var(--border);
117
+ background: var(--bg);
118
+ color: var(--muted);
119
+ border-radius: 12px;
120
+ cursor: pointer;
121
+ text-transform: capitalize;
122
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
123
+ }
124
+
125
+ .category-chip:hover {
126
+ color: var(--text);
127
+ }
128
+
129
+ .category-chip.active {
130
+ color: var(--text);
131
+ border-color: var(--accent);
132
+ background: var(--panel);
133
+ }
134
+
135
+ /* ── Responsive ─────────────────────────────────────────────────────────── */
136
+
137
+ @media (max-width: 640px) {
138
+ .config-grid {
139
+ grid-template-columns: 1fr;
140
+ }
141
+ .settings-row label {
142
+ flex-direction: column;
143
+ align-items: flex-start;
144
+ gap: 4px;
145
+ }
146
+ .settings-row select {
147
+ width: 100%;
148
+ }
149
+ }
@@ -0,0 +1,265 @@
1
+ /**
2
+ * dashboard-client/src/styles/game-achievements.css — Game + Achievements styles.
3
+ *
4
+ * Covers: MEGA CACHE banner, mega-cache toast, opie achievement-tile,
5
+ * game leaderboards (2×2 grid), lvl badge, repos badge, game empty state,
6
+ * achievement tiles grid, ach-toast, just-unlocked animation.
7
+ * All responsive via clamp()/auto-fit — no fixed px.
8
+ */
9
+
10
+ /* ── Game-specific color tokens ──────────────────────────────────────── */
11
+ :root {
12
+ --mega: #f0883e;
13
+ --mega-gold: #ffd700;
14
+ --game-blue: #1f6feb;
15
+ --game-purple: #a371f7;
16
+ }
17
+
18
+ /* ── Game tab container ──────────────────────────────────────────────── */
19
+ .game-tab {
20
+ display: flex;
21
+ flex-direction: column;
22
+ gap: 12px;
23
+ }
24
+
25
+ .game-mode-on {
26
+ /* Accent vars applied when game mode is on; themes set via data-theme */
27
+ --accent: var(--mega);
28
+ }
29
+
30
+ /* ── MEGA CACHE banner ───────────────────────────────────────────────── */
31
+ .mega-cache-banner {
32
+ display: block;
33
+ background: linear-gradient(
34
+ 135deg,
35
+ var(--mega),
36
+ var(--mega-gold)
37
+ );
38
+ color: #1a1006;
39
+ font-weight: 700;
40
+ padding: 10px 14px;
41
+ border-radius: 8px;
42
+ margin: 12px 0;
43
+ font-size: clamp(13px, 1vw, 16px);
44
+ animation: mega-banner-shimmer 3s ease-in-out infinite;
45
+ }
46
+
47
+ @keyframes mega-banner-shimmer {
48
+ 0%, 100% { filter: brightness(1); }
49
+ 50% { filter: brightness(1.15); }
50
+ }
51
+
52
+ /* ── Mega-cache toast ───────────────────────────────────────────────── */
53
+ .mega-cache-toast {
54
+ display: none;
55
+ position: fixed;
56
+ top: 16px;
57
+ left: 50%;
58
+ transform: translateX(-50%);
59
+ background: var(--mega);
60
+ color: #1a1006;
61
+ font-weight: 700;
62
+ padding: 10px 18px;
63
+ border-radius: 8px;
64
+ z-index: 1000;
65
+ box-shadow: 0 4px 20px #0008;
66
+ max-width: 92vw;
67
+ }
68
+ .mega-cache-toast.show {
69
+ display: block;
70
+ animation: mega-flash 0.6s ease-in-out 2;
71
+ }
72
+ @keyframes mega-flash {
73
+ 0% { background: transparent; }
74
+ 25% { background: var(--mega-gold); }
75
+ 100% { background: transparent; }
76
+ }
77
+
78
+ /* ── Opie achievement tile ───────────────────────────────────────────── */
79
+ .achievement-tile {
80
+ display: none;
81
+ background: linear-gradient(135deg, var(--mega), var(--mega-gold));
82
+ color: #1a1006;
83
+ font-weight: 700;
84
+ padding: 12px 16px;
85
+ border-radius: 8px;
86
+ margin: 12px 0;
87
+ box-shadow: 0 0 16px #f0883e88;
88
+ font-size: clamp(13px, 1vw, 16px);
89
+ }
90
+ .achievement-tile.unlocked {
91
+ display: block;
92
+ }
93
+ .achievement-tile .ach-detail {
94
+ display: block;
95
+ font-weight: 500;
96
+ font-size: 12px;
97
+ margin-top: 4px;
98
+ }
99
+
100
+ /* ── Game leaderboards (2×2 grid) ────────────────────────────────────── */
101
+ .game-leaderboards {
102
+ display: grid;
103
+ grid-template-columns: 1fr 1fr;
104
+ gap: 16px;
105
+ margin-top: 16px;
106
+ }
107
+ .lb-card {
108
+ background: var(--panel);
109
+ border: 1px solid var(--border);
110
+ border-radius: 8px;
111
+ padding: 14px;
112
+ }
113
+ .lb-card h3 {
114
+ font-size: 12px;
115
+ text-transform: uppercase;
116
+ letter-spacing: 0.5px;
117
+ color: var(--muted);
118
+ margin: 0 0 10px;
119
+ font-weight: 600;
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 4px;
123
+ }
124
+ .lb-card table {
125
+ width: 100%;
126
+ border-collapse: collapse;
127
+ font-size: 13px;
128
+ }
129
+ .lb-card td {
130
+ padding: 4px 8px;
131
+ border-bottom: 1px solid var(--border);
132
+ }
133
+ .lb-card td.num {
134
+ text-align: right;
135
+ font-family: monospace;
136
+ color: var(--text);
137
+ font-weight: 600;
138
+ }
139
+ .lb-card .lb-meta {
140
+ color: var(--muted);
141
+ font-size: 11px;
142
+ margin-left: 6px;
143
+ }
144
+ .lb-empty {
145
+ color: var(--muted);
146
+ font-size: 12px;
147
+ padding: 8px 0;
148
+ }
149
+
150
+ /* ── LVL badge (Turns leaderboard) ───────────────────────────────────── */
151
+ .lvl-badge {
152
+ display: inline-block;
153
+ background: var(--game-blue);
154
+ color: #fff;
155
+ font-size: 11px;
156
+ font-weight: 700;
157
+ padding: 2px 8px;
158
+ border-radius: 10px;
159
+ margin-left: 8px;
160
+ }
161
+
162
+ /* ── Repos badge ─────────────────────────────────────────────────────── */
163
+ .repos-badge-line {
164
+ margin-top: 8px;
165
+ }
166
+ .repos-badge {
167
+ display: inline-block;
168
+ background: var(--game-blue);
169
+ color: #fff;
170
+ font-size: 11px;
171
+ font-weight: 700;
172
+ padding: 2px 8px;
173
+ border-radius: 10px;
174
+ }
175
+
176
+ /* ── Game empty state ────────────────────────────────────────────────── */
177
+ .game-empty {
178
+ color: var(--muted);
179
+ font-style: italic;
180
+ padding: 12px 0;
181
+ }
182
+
183
+ /* ── Achievement tiles grid ──────────────────────────────────────────── */
184
+ .ach-section {
185
+ position: relative;
186
+ }
187
+ .ach-tiles {
188
+ display: grid;
189
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
190
+ gap: 8px;
191
+ margin: 8px 0 16px;
192
+ }
193
+ .ach-tile {
194
+ padding: 10px 12px;
195
+ border-radius: 8px;
196
+ border: 1px solid var(--border);
197
+ font-size: 12px;
198
+ background: var(--panel);
199
+ }
200
+ .ach-tile.unlocked {
201
+ background: linear-gradient(135deg, var(--mega), var(--mega-gold));
202
+ color: #1a1006;
203
+ font-weight: 700;
204
+ box-shadow: 0 0 12px #f0883e66;
205
+ }
206
+ .ach-tile.locked {
207
+ opacity: 0.55;
208
+ }
209
+ .ach-tile.just-unlocked {
210
+ animation: ach-unlock-pulse 0.6s ease-out;
211
+ }
212
+ .ach-tile .ach-detail {
213
+ display: block;
214
+ font-weight: 500;
215
+ font-size: 11px;
216
+ margin-top: 3px;
217
+ }
218
+ @keyframes ach-unlock-pulse {
219
+ 0% { transform: scale(0.9); opacity: 0.4; }
220
+ 60% { transform: scale(1.05); }
221
+ 100% { transform: scale(1); opacity: 1; }
222
+ }
223
+
224
+ /* ── Achievement toast ───────────────────────────────────────────────── */
225
+ .ach-toast {
226
+ display: none;
227
+ position: fixed;
228
+ top: 16px;
229
+ left: 50%;
230
+ transform: translateX(-50%);
231
+ background: var(--game-blue);
232
+ color: #fff;
233
+ font-weight: 700;
234
+ padding: 10px 18px;
235
+ border-radius: 8px;
236
+ z-index: 1000;
237
+ box-shadow: 0 4px 20px #0008;
238
+ max-width: 92vw;
239
+ }
240
+ .ach-toast.show {
241
+ display: block;
242
+ }
243
+
244
+ /* ── Achievements tab container ──────────────────────────────────────── */
245
+ .achievements-tab {
246
+ display: flex;
247
+ flex-direction: column;
248
+ gap: 12px;
249
+ }
250
+ .achievements-tab h2 {
251
+ font-size: clamp(16px, 1.4vw, 22px);
252
+ margin: 0;
253
+ }
254
+
255
+ /* ── Responsive breakpoints ──────────────────────────────────────────── */
256
+ @media (max-width: 640px) {
257
+ .game-leaderboards {
258
+ grid-template-columns: 1fr;
259
+ }
260
+ }
261
+ @media (min-width: 1601px) {
262
+ .game-leaderboards {
263
+ gap: 20px;
264
+ }
265
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * dashboard-client/src/styles/metrics-extra.css — Perf card grid for Metrics tab.
3
+ *
4
+ * Builds on the perf-metric classes from repos-metrics.css. Adds the
5
+ * 5-card grid layout with titled cards (model latency, throughput,
6
+ * process, snapshot cost, TUI lag proxy).
7
+ */
8
+
9
+ .perf-cards-grid {
10
+ display: grid;
11
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
12
+ gap: 12px;
13
+ margin-top: 12px;
14
+ }
15
+
16
+ .perf-card {
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: 8px;
20
+ padding: 14px;
21
+ background: var(--panel);
22
+ border: 1px solid var(--border);
23
+ border-radius: 8px;
24
+ }
25
+
26
+ .perf-card-title {
27
+ margin: 0 0 4px;
28
+ font-size: 12px;
29
+ font-weight: 600;
30
+ text-transform: uppercase;
31
+ letter-spacing: 0.5px;
32
+ color: var(--muted);
33
+ }
34
+
35
+ .perf-card-body {
36
+ display: flex;
37
+ flex-direction: column;
38
+ gap: 6px;
39
+ }
40
+
41
+ .perf-card-note {
42
+ font-size: 11px;
43
+ color: var(--muted);
44
+ font-style: italic;
45
+ margin-top: 2px;
46
+ }
47
+
48
+ /* Inherit perf-metric layout from repos-metrics.css but make them
49
+ borderless inside cards to avoid double borders. */
50
+ .perf-card-body .perf-metric {
51
+ padding: 6px 8px;
52
+ background: transparent;
53
+ border: none;
54
+ border-radius: 0;
55
+ }
56
+
57
+ .perf-footer {
58
+ font-size: 11px;
59
+ color: var(--muted);
60
+ margin-top: 10px;
61
+ padding-top: 8px;
62
+ border-top: 1px solid var(--border);
63
+ }
64
+
65
+ @media (max-width: 640px) {
66
+ .perf-cards-grid {
67
+ grid-template-columns: 1fr;
68
+ }
69
+ }