pi-mega-compact 0.8.12 → 0.8.15

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 (127) hide show
  1. package/README.md +44 -21
  2. package/dist/extensions/mega-cache-replay.test.js +4 -2
  3. package/dist/extensions/mega-compact-s38.test.js +317 -0
  4. package/dist/extensions/mega-compact.js +14 -0
  5. package/dist/extensions/mega-compact.test.js +37 -8
  6. package/dist/extensions/mega-config.js +5 -0
  7. package/dist/extensions/mega-events/agent-handlers.js +184 -4
  8. package/dist/extensions/mega-events/context-handler.js +35 -2
  9. package/dist/extensions/mega-events/error-classifier.js +118 -0
  10. package/dist/extensions/mega-events.js +1 -0
  11. package/dist/extensions/mega-runtime/state.js +16 -0
  12. package/dist/extensions/mega-teamrun.test.js +14 -1
  13. package/extensions/dashboard-client/dist/assets/AchievementTiles-BH26e95w.js +2 -0
  14. package/extensions/dashboard-client/dist/assets/AchievementTiles-BH26e95w.js.map +1 -0
  15. package/extensions/dashboard-client/dist/assets/AchievementsTab-B94wvRV_.js +2 -0
  16. package/extensions/dashboard-client/dist/assets/AchievementsTab-B94wvRV_.js.map +1 -0
  17. package/extensions/dashboard-client/dist/assets/CacheTab-DPmw3NHR.js +2 -0
  18. package/extensions/dashboard-client/dist/assets/CacheTab-DPmw3NHR.js.map +1 -0
  19. package/extensions/dashboard-client/dist/assets/ConfigTab-C3g3smRL.js +2 -0
  20. package/extensions/dashboard-client/dist/assets/ConfigTab-C3g3smRL.js.map +1 -0
  21. package/extensions/dashboard-client/dist/assets/EventsTab-B5PicfFw.js +2 -0
  22. package/extensions/dashboard-client/dist/assets/EventsTab-B5PicfFw.js.map +1 -0
  23. package/extensions/dashboard-client/dist/assets/GameTab-CsVwp78a.js +2 -0
  24. package/extensions/dashboard-client/dist/assets/GameTab-CsVwp78a.js.map +1 -0
  25. package/extensions/dashboard-client/dist/assets/MetricsTab-Cf72UewX.js +2 -0
  26. package/extensions/dashboard-client/dist/assets/MetricsTab-Cf72UewX.js.map +1 -0
  27. package/extensions/dashboard-client/dist/assets/OverviewTab-Dh6aG3gy.js +2 -0
  28. package/extensions/dashboard-client/dist/assets/OverviewTab-Dh6aG3gy.js.map +1 -0
  29. package/extensions/dashboard-client/dist/assets/ReposTab-HXf2dorl.js +2 -0
  30. package/extensions/dashboard-client/dist/assets/ReposTab-HXf2dorl.js.map +1 -0
  31. package/extensions/dashboard-client/dist/assets/TimeSavedCard-kUnoospE.js +2 -0
  32. package/extensions/dashboard-client/dist/assets/TimeSavedCard-kUnoospE.js.map +1 -0
  33. package/extensions/dashboard-client/dist/assets/index-Cfxniu2R.css +1 -0
  34. package/extensions/dashboard-client/dist/assets/{index-XAIN8km6.js → index-DMntLu-8.js} +11 -10
  35. package/extensions/dashboard-client/dist/assets/index-DMntLu-8.js.map +1 -0
  36. package/extensions/dashboard-client/dist/index.html +2 -2
  37. package/extensions/dashboard-client/src/App.tsx +18 -4
  38. package/extensions/dashboard-client/src/components/AchievementTiles.tsx +105 -0
  39. package/extensions/dashboard-client/src/components/ActiveReposTable.tsx +116 -0
  40. package/extensions/dashboard-client/src/components/CacheHitsCard.tsx +73 -0
  41. package/extensions/dashboard-client/src/components/CacheStatusPerModel.tsx +78 -35
  42. package/extensions/dashboard-client/src/components/ConfigSummaryCard.tsx +101 -0
  43. package/extensions/dashboard-client/src/components/ContextGauge.tsx +11 -15
  44. package/extensions/dashboard-client/src/components/DataSafetyCard.tsx +42 -33
  45. package/extensions/dashboard-client/src/components/EventCategoryFilter.tsx +46 -9
  46. package/extensions/dashboard-client/src/components/LegendCard.tsx +49 -0
  47. package/extensions/dashboard-client/src/components/ModelBadge.tsx +42 -11
  48. package/extensions/dashboard-client/src/components/PerfCards.tsx +91 -0
  49. package/extensions/dashboard-client/src/components/RepoAllSessionsCard.tsx +102 -0
  50. package/extensions/dashboard-client/src/components/RepoDetailModal.tsx +9 -2
  51. package/extensions/dashboard-client/src/components/RepoTable.tsx +30 -22
  52. package/extensions/dashboard-client/src/components/SavingsByModelTable.tsx +226 -0
  53. package/extensions/dashboard-client/src/components/SessionInfo.tsx +25 -50
  54. package/extensions/dashboard-client/src/components/SummaryTiles.tsx +20 -11
  55. package/extensions/dashboard-client/src/components/TimeSavedCard.tsx +61 -0
  56. package/extensions/dashboard-client/src/components/TriggerStatus.tsx +31 -19
  57. package/extensions/dashboard-client/src/components/VectorStoreCard.tsx +134 -0
  58. package/extensions/dashboard-client/src/main.tsx +5 -0
  59. package/extensions/dashboard-client/src/styles/base.css +77 -9
  60. package/extensions/dashboard-client/src/styles/config.css +149 -0
  61. package/extensions/dashboard-client/src/styles/game-achievements.css +265 -0
  62. package/extensions/dashboard-client/src/styles/metrics-extra.css +69 -0
  63. package/extensions/dashboard-client/src/styles/overview-extra.css +170 -0
  64. package/extensions/dashboard-client/src/styles/repos-extra.css +99 -0
  65. package/extensions/dashboard-client/src/styles/repos-metrics.css +14 -23
  66. package/extensions/dashboard-client/src/tabs/AchievementsTab.tsx +55 -0
  67. package/extensions/dashboard-client/src/tabs/CacheTab.tsx +50 -0
  68. package/extensions/dashboard-client/src/tabs/ConfigTab.tsx +240 -5
  69. package/extensions/dashboard-client/src/tabs/EventsTab.tsx +55 -3
  70. package/extensions/dashboard-client/src/tabs/GameTab.tsx +287 -0
  71. package/extensions/dashboard-client/src/tabs/MetricsTab.tsx +7 -1
  72. package/extensions/dashboard-client/src/tabs/OverviewTab.tsx +103 -17
  73. package/extensions/dashboard-client/src/tabs/ReposTab.tsx +57 -22
  74. package/extensions/dashboard-client/src/utils/format.ts +85 -0
  75. package/extensions/dashboard-client/src/utils/types.ts +27 -0
  76. package/extensions/mega-cache-replay.test.ts +3 -3
  77. package/extensions/mega-compact-s38.test.ts +330 -0
  78. package/extensions/mega-compact.test.ts +41 -13
  79. package/extensions/mega-compact.ts +14 -0
  80. package/extensions/mega-config.ts +24 -0
  81. package/extensions/mega-dashboard.ts +7 -0
  82. package/extensions/mega-events/agent-handlers.ts +179 -5
  83. package/extensions/mega-events/context-handler.ts +31 -2
  84. package/extensions/mega-events/error-classifier.ts +109 -0
  85. package/extensions/mega-events.ts +1 -0
  86. package/extensions/mega-runtime/helpers.ts +5 -0
  87. package/extensions/mega-runtime/state.ts +17 -1
  88. package/extensions/mega-teamrun.test.ts +13 -1
  89. package/package.json +4 -1
  90. package/dist/extensions/dashboard-server/helpers.js +0 -37
  91. package/dist/extensions/dashboard-server/html/all-repos-tab.js +0 -26
  92. package/dist/extensions/dashboard-server/html/body-open.js +0 -23
  93. package/dist/extensions/dashboard-server/html/current-repo-tab.js +0 -130
  94. package/dist/extensions/dashboard-server/html/head-open.js +0 -16
  95. package/dist/extensions/dashboard-server/html/high-score-tab.js +0 -25
  96. package/dist/extensions/dashboard-server/html/repo-detail-modal.js +0 -26
  97. package/dist/extensions/dashboard-server/html/script.js +0 -259
  98. package/dist/extensions/dashboard-server/html/styles.js +0 -103
  99. package/dist/extensions/dashboard-server/html/summary-tab.js +0 -19
  100. package/dist/extensions/dashboard-server/html-template.js +0 -41
  101. package/dist/src/store/sqlite/connection.js +0 -35
  102. package/dist/src/store/sqlite/index-store.js +0 -167
  103. package/dist/src/store/sqlite/memory.js +0 -54
  104. package/dist/src/store/sqlite/minhash-lsh.js +0 -47
  105. package/dist/src/store/sqlite/sessions.js +0 -39
  106. package/dist/src/store/sqlite/transaction.js +0 -19
  107. package/dist/src/vectorStore/add.js +0 -260
  108. package/dist/src/vectorStore/dedup.js +0 -52
  109. package/dist/src/vectorStore/index.js +0 -10
  110. package/dist/src/vectorStore/queries.js +0 -83
  111. package/dist/src/vectorStore/search.js +0 -95
  112. package/dist/src/vectorStore/session.js +0 -19
  113. package/dist/src/vectorStore/store.js +0 -105
  114. package/dist/src/vectorStore/types.js +0 -6
  115. package/dist/src/vectorStore/utils.js +0 -23
  116. package/extensions/dashboard-client/dist/assets/ConfigTab-RrjXWfvr.js +0 -2
  117. package/extensions/dashboard-client/dist/assets/ConfigTab-RrjXWfvr.js.map +0 -1
  118. package/extensions/dashboard-client/dist/assets/EventsTab-BH_FxJ08.js +0 -2
  119. package/extensions/dashboard-client/dist/assets/EventsTab-BH_FxJ08.js.map +0 -1
  120. package/extensions/dashboard-client/dist/assets/MetricsTab-C-PoFV4p.js +0 -2
  121. package/extensions/dashboard-client/dist/assets/MetricsTab-C-PoFV4p.js.map +0 -1
  122. package/extensions/dashboard-client/dist/assets/OverviewTab-Db-qBqFN.js +0 -2
  123. package/extensions/dashboard-client/dist/assets/OverviewTab-Db-qBqFN.js.map +0 -1
  124. package/extensions/dashboard-client/dist/assets/ReposTab-DhCjJvuj.js +0 -2
  125. package/extensions/dashboard-client/dist/assets/ReposTab-DhCjJvuj.js.map +0 -1
  126. package/extensions/dashboard-client/dist/assets/index-Buer5yxB.css +0 -1
  127. 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,61 @@ 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,
141
+ .repos td {
142
+ padding: 6px 10px;
143
+ border-bottom: 1px solid var(--border-soft, var(--border));
144
+ text-align: left;
145
+ }
146
+
147
+ .repos th {
148
+ background: var(--bg);
149
+ position: sticky;
150
+ top: 0;
151
+ }
152
+
153
+ .table-wrap {
154
+ overflow-x: auto;
155
+ }
156
+
157
+ /* Narrow screens: single column */
158
+ @media (max-width: 640px) {
159
+ .card-grid {
160
+ grid-template-columns: 1fr;
161
+ }
162
+ .tab-bar button {
163
+ padding: 6px 10px;
164
+ font-size: 12px;
165
+ }
166
+ }
167
+
168
+ /* Medium screens: 2 columns */
169
+ @media (min-width: 641px) and (max-width: 1024px) {
170
+ .card-grid {
171
+ grid-template-columns: repeat(2, 1fr);
172
+ }
173
+ }
174
+
175
+ /* Wide screens: 3-4 columns */
176
+ @media (min-width: 1025px) {
177
+ .card-grid {
178
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
179
+ }
180
+ }
181
+
182
+ @media (min-width: 1601px) {
183
+ .dashboard-app {
184
+ max-width: min(1800px, 96vw);
185
+ }
186
+ .card-grid {
187
+ grid-template-columns: repeat(4, 1fr);
188
+ }
189
+ }
@@ -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
+ }