Skip to content

Commit d02cbcd

Browse files
author
danil-nizamov
committed
added live statistics
1 parent ba812c4 commit d02cbcd

File tree

5 files changed

+293
-12
lines changed

5 files changed

+293
-12
lines changed

client/config.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"keyboard": true,
33
"availableKeys": [],
4-
"showStats": true
4+
"showStats": true,
5+
"realTimeStats": ["time", "chars"]
56
}

client/index.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,10 @@ <h2>Typing Statistics</h2>
104104
</svg>
105105
</button>
106106
</div>
107-
<div id="keyboard-container" class="keyboard-container"></div>
107+
<div class="keyboard-stats-wrapper">
108+
<div id="realtime-stats-container" class="realtime-stats-container"></div>
109+
<div id="keyboard-container" class="keyboard-container"></div>
110+
</div>
108111
</div>
109112
</div>
110113
</main>

client/stats.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
Typing Statistics
22
==================
33

4-
Total Errors Made: 74
5-
Errors Left (Unfixed): 74
6-
Total Time: 3.30 seconds
7-
Accuracy: 10.84%
8-
Speed: 272.56 words per minute
4+
Total Errors Made: 85
5+
Errors Left (Unfixed): 77
6+
Total Time: 6.38 seconds
7+
Accuracy: 7.61%
8+
Speed: 141.13 words per minute
99

10-
Generated: 26/11/2025, 16:19:29
10+
Generated: 27/11/2025, 00:13:42

client/typing-simulator.css

Lines changed: 131 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,64 @@
1919
min-height: 0; /* Allow flexbox to shrink */
2020
}
2121

22+
/* Keyboard and Stats Wrapper */
23+
.bespoke .keyboard-stats-wrapper {
24+
position: relative;
25+
width: 100%;
26+
max-width: 900px;
27+
margin: var(--UI-Spacing-spacing-xl) auto 0;
28+
flex: 0 0 auto; /* Don't grow, don't shrink */
29+
min-height: 0; /* Allow flexbox to shrink */
30+
}
31+
32+
/* Real-time Stats Container */
33+
.bespoke .realtime-stats-container {
34+
display: none;
35+
position: absolute;
36+
left: 0;
37+
bottom: 0;
38+
flex-direction: column;
39+
gap: var(--UI-Spacing-spacing-xs);
40+
padding: var(--UI-Spacing-spacing-md);
41+
background: var(--Colors-Box-Background-Secondary);
42+
border: none;
43+
border-radius: var(--UI-Radius-radius-m);
44+
width: 140px;
45+
margin-right: var(--UI-Spacing-spacing-xl);
46+
z-index: 1;
47+
}
48+
49+
.bespoke .realtime-stat-item {
50+
display: flex;
51+
flex-direction: row;
52+
align-items: center;
53+
justify-content: space-between;
54+
gap: var(--UI-Spacing-spacing-xs);
55+
padding: var(--UI-Spacing-spacing-xs) 0;
56+
min-width: 0;
57+
}
58+
59+
.bespoke .realtime-stat-label {
60+
font-size: var(--Fonts-Body-Default-xs);
61+
color: var(--Colors-Text-Body-Medium);
62+
text-transform: uppercase;
63+
letter-spacing: 0.5px;
64+
font-weight: 500;
65+
white-space: nowrap;
66+
flex-shrink: 0;
67+
}
68+
69+
.bespoke .realtime-stat-value {
70+
font-size: var(--Fonts-Headlines-sm);
71+
font-weight: 600;
72+
color: var(--Colors-Primary-Default);
73+
font-family: var(--heading-family);
74+
text-align: right;
75+
flex-shrink: 0;
76+
min-width: 60px;
77+
font-variant-numeric: tabular-nums;
78+
}
79+
2280
.bespoke .typing-text-container {
2381
flex: 1 1 auto;
2482
position: relative;
@@ -269,18 +327,23 @@
269327
.bespoke .keyboard-container {
270328
display: none;
271329
width: 100%;
272-
max-width: 900px;
273-
margin: var(--UI-Spacing-spacing-xl) auto 0;
274330
padding: var(--UI-Spacing-spacing-lg);
275331
background: transparent;
276-
flex: 0 0 auto; /* Don't grow, don't shrink */
277332
overflow: hidden; /* Prevent keyboard from causing scroll */
278333
}
279334

280335
.bespoke .keyboard-container.visible {
281336
display: block;
282337
}
283338

339+
.bespoke .keyboard-container .keyboard {
340+
margin: 0 auto; /* Center the keyboard */
341+
}
342+
343+
.bespoke .keyboard-container.visible {
344+
display: block;
345+
}
346+
284347
.bespoke .keyboard {
285348
display: flex;
286349
flex-direction: column;
@@ -358,6 +421,29 @@
358421

359422
/* Responsive Design */
360423
@media (max-width: 1024px) {
424+
.bespoke .keyboard-stats-wrapper {
425+
margin: var(--UI-Spacing-spacing-lg) auto 0;
426+
}
427+
428+
.bespoke .realtime-stats-container {
429+
gap: var(--UI-Spacing-spacing-xs);
430+
padding: var(--UI-Spacing-spacing-sm);
431+
min-width: 130px;
432+
}
433+
434+
.bespoke .realtime-stat-item {
435+
padding: var(--UI-Spacing-spacing-xs);
436+
gap: var(--UI-Spacing-spacing-sm);
437+
}
438+
439+
.bespoke .realtime-stat-label {
440+
font-size: var(--Fonts-Body-Default-xxs);
441+
}
442+
443+
.bespoke .realtime-stat-value {
444+
font-size: var(--Fonts-Headlines-xs);
445+
}
446+
361447
.bespoke .typing-text-container {
362448
font-size: var(--Fonts-Body-Default-xxl);
363449
padding: var(--UI-Spacing-spacing-xl);
@@ -404,6 +490,29 @@
404490
}
405491

406492
@media (max-width: 768px) {
493+
.bespoke .keyboard-stats-wrapper {
494+
margin: var(--UI-Spacing-spacing-md) auto 0;
495+
}
496+
497+
.bespoke .realtime-stats-container {
498+
position: static;
499+
width: 100%;
500+
max-width: 100%;
501+
min-width: auto;
502+
gap: var(--UI-Spacing-spacing-xs);
503+
padding: var(--UI-Spacing-spacing-sm);
504+
margin-bottom: var(--UI-Spacing-spacing-md);
505+
}
506+
507+
.bespoke .realtime-stat-item {
508+
padding: var(--UI-Spacing-spacing-xs);
509+
gap: var(--UI-Spacing-spacing-sm);
510+
}
511+
512+
.bespoke .keyboard-container {
513+
width: 100%;
514+
}
515+
407516
.bespoke .typing-container {
408517
padding: var(--UI-Spacing-spacing-md);
409518
}
@@ -523,6 +632,25 @@
523632
}
524633

525634
@media (max-width: 480px) {
635+
.bespoke .keyboard-stats-wrapper {
636+
margin: var(--UI-Spacing-spacing-sm) auto 0;
637+
}
638+
639+
.bespoke .realtime-stats-container {
640+
position: static;
641+
width: 100%;
642+
max-width: 100%;
643+
min-width: auto;
644+
gap: var(--UI-Spacing-spacing-xs);
645+
padding: var(--UI-Spacing-spacing-xs);
646+
margin-bottom: var(--UI-Spacing-spacing-sm);
647+
}
648+
649+
.bespoke .realtime-stat-item {
650+
padding: 2px var(--UI-Spacing-spacing-xs);
651+
gap: var(--UI-Spacing-spacing-xs);
652+
}
653+
526654
.bespoke .typing-container {
527655
padding: var(--UI-Spacing-spacing-sm);
528656
}

0 commit comments

Comments
 (0)