Spaces:
Sleeping
Sleeping
Add sticky control panel for mobile-friendly navigation
Browse files- Implement fixed bottom panel with Hint | Submit layout
- Ensure buttons stay visible above mobile keyboards
- Add responsive styling with larger touch targets
- Include backdrop blur and consistent theming
- Improve content filtering with enhanced dash detection
- index.html +18 -10
- src/app.js +3 -0
- src/styles.css +94 -0
index.html
CHANGED
@@ -36,16 +36,8 @@
|
|
36 |
<div class="text-sm font-semibold mb-2">ππ Hints:</div>
|
37 |
<div id="hints-list" class="text-sm space-y-1"></div>
|
38 |
</div>
|
39 |
-
<div id="controls" class="
|
40 |
-
|
41 |
-
Submit
|
42 |
-
</button>
|
43 |
-
<button type="button" id="next-btn" class="typewriter-button hidden">
|
44 |
-
Next Passage
|
45 |
-
</button>
|
46 |
-
<button type="button" id="hint-btn" class="typewriter-button">
|
47 |
-
Show Hints
|
48 |
-
</button>
|
49 |
</div>
|
50 |
<div id="result" class="mt-4 text-center result-text"></div>
|
51 |
</div>
|
@@ -53,6 +45,22 @@
|
|
53 |
</main>
|
54 |
</div>
|
55 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
<script src="./src/app.js" type="module"></script>
|
57 |
</body>
|
58 |
</html>
|
|
|
36 |
<div class="text-sm font-semibold mb-2">ππ Hints:</div>
|
37 |
<div id="hints-list" class="text-sm space-y-1"></div>
|
38 |
</div>
|
39 |
+
<div id="controls" class="hidden">
|
40 |
+
<!-- Controls moved to sticky footer -->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
</div>
|
42 |
<div id="result" class="mt-4 text-center result-text"></div>
|
43 |
</div>
|
|
|
45 |
</main>
|
46 |
</div>
|
47 |
|
48 |
+
<!-- Sticky Control Panel -->
|
49 |
+
<div id="sticky-controls" class="sticky-controls hidden">
|
50 |
+
<div class="controls-inner">
|
51 |
+
<button type="button" id="hint-btn" class="typewriter-button">
|
52 |
+
Show Hints
|
53 |
+
</button>
|
54 |
+
<div class="controls-divider"></div>
|
55 |
+
<button type="button" id="submit-btn" class="typewriter-button">
|
56 |
+
Submit
|
57 |
+
</button>
|
58 |
+
<button type="button" id="next-btn" class="typewriter-button hidden">
|
59 |
+
Next Passage
|
60 |
+
</button>
|
61 |
+
</div>
|
62 |
+
</div>
|
63 |
+
|
64 |
<script src="./src/app.js" type="module"></script>
|
65 |
</body>
|
66 |
</html>
|
src/app.js
CHANGED
@@ -11,6 +11,7 @@ class App {
|
|
11 |
this.elements = {
|
12 |
loading: document.getElementById('loading'),
|
13 |
gameArea: document.getElementById('game-area'),
|
|
|
14 |
bookInfo: document.getElementById('book-info'),
|
15 |
roundInfo: document.getElementById('round-info'),
|
16 |
contextualization: document.getElementById('contextualization'),
|
@@ -315,9 +316,11 @@ class App {
|
|
315 |
`;
|
316 |
this.elements.loading.classList.remove('hidden');
|
317 |
this.elements.gameArea.classList.add('hidden');
|
|
|
318 |
} else {
|
319 |
this.elements.loading.classList.add('hidden');
|
320 |
this.elements.gameArea.classList.remove('hidden');
|
|
|
321 |
}
|
322 |
}
|
323 |
|
|
|
11 |
this.elements = {
|
12 |
loading: document.getElementById('loading'),
|
13 |
gameArea: document.getElementById('game-area'),
|
14 |
+
stickyControls: document.getElementById('sticky-controls'),
|
15 |
bookInfo: document.getElementById('book-info'),
|
16 |
roundInfo: document.getElementById('round-info'),
|
17 |
contextualization: document.getElementById('contextualization'),
|
|
|
316 |
`;
|
317 |
this.elements.loading.classList.remove('hidden');
|
318 |
this.elements.gameArea.classList.add('hidden');
|
319 |
+
this.elements.stickyControls.classList.add('hidden');
|
320 |
} else {
|
321 |
this.elements.loading.classList.add('hidden');
|
322 |
this.elements.gameArea.classList.remove('hidden');
|
323 |
+
this.elements.stickyControls.classList.remove('hidden');
|
324 |
}
|
325 |
}
|
326 |
|
src/styles.css
CHANGED
@@ -464,6 +464,92 @@
|
|
464 |
box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1);
|
465 |
}
|
466 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
467 |
/* Print styles */
|
468 |
@media print {
|
469 |
body {
|
@@ -478,6 +564,14 @@
|
|
478 |
.typewriter-button {
|
479 |
display: none;
|
480 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
481 |
}
|
482 |
}
|
483 |
|
|
|
464 |
box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1);
|
465 |
}
|
466 |
|
467 |
+
/* Sticky Control Panel */
|
468 |
+
.sticky-controls {
|
469 |
+
position: fixed;
|
470 |
+
bottom: 0;
|
471 |
+
left: 0;
|
472 |
+
right: 0;
|
473 |
+
background: var(--aged-paper-light);
|
474 |
+
border-top: 2px solid rgba(0, 0, 0, 0.1);
|
475 |
+
box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.1);
|
476 |
+
padding: 12px 16px;
|
477 |
+
z-index: 1000;
|
478 |
+
backdrop-filter: blur(8px);
|
479 |
+
}
|
480 |
+
|
481 |
+
.sticky-controls .controls-inner {
|
482 |
+
max-width: 1024px;
|
483 |
+
margin: 0 auto;
|
484 |
+
display: flex;
|
485 |
+
gap: 1px;
|
486 |
+
justify-content: center;
|
487 |
+
align-items: center;
|
488 |
+
}
|
489 |
+
|
490 |
+
.sticky-controls .typewriter-button {
|
491 |
+
flex: 1;
|
492 |
+
max-width: 200px;
|
493 |
+
min-height: 44px;
|
494 |
+
margin: 0;
|
495 |
+
border-radius: 0;
|
496 |
+
font-size: 16px;
|
497 |
+
font-weight: 600;
|
498 |
+
position: relative;
|
499 |
+
}
|
500 |
+
|
501 |
+
.sticky-controls .typewriter-button:first-child {
|
502 |
+
border-top-left-radius: 8px;
|
503 |
+
border-bottom-left-radius: 8px;
|
504 |
+
}
|
505 |
+
|
506 |
+
.sticky-controls .typewriter-button:last-child {
|
507 |
+
border-top-right-radius: 8px;
|
508 |
+
border-bottom-right-radius: 8px;
|
509 |
+
}
|
510 |
+
|
511 |
+
.sticky-controls .typewriter-button:not(:last-child) {
|
512 |
+
border-right: 1px solid rgba(0, 0, 0, 0.2);
|
513 |
+
}
|
514 |
+
|
515 |
+
.controls-divider {
|
516 |
+
height: 24px;
|
517 |
+
width: 2px;
|
518 |
+
background: rgba(0, 0, 0, 0.3);
|
519 |
+
margin: 0 -1px;
|
520 |
+
z-index: 1;
|
521 |
+
}
|
522 |
+
|
523 |
+
/* Add bottom padding to main content to prevent overlap */
|
524 |
+
#game-container {
|
525 |
+
padding-bottom: 100px;
|
526 |
+
}
|
527 |
+
|
528 |
+
/* Mobile optimizations for sticky controls */
|
529 |
+
@media (max-width: 640px) {
|
530 |
+
.sticky-controls {
|
531 |
+
padding: 10px 12px;
|
532 |
+
}
|
533 |
+
|
534 |
+
.sticky-controls .typewriter-button {
|
535 |
+
min-height: 48px;
|
536 |
+
font-size: 16px;
|
537 |
+
padding: 12px 8px;
|
538 |
+
}
|
539 |
+
|
540 |
+
#game-container {
|
541 |
+
padding-bottom: 90px;
|
542 |
+
}
|
543 |
+
}
|
544 |
+
|
545 |
+
/* Ensure controls stay above mobile keyboards */
|
546 |
+
@media (max-width: 640px) and (max-height: 500px) {
|
547 |
+
.sticky-controls {
|
548 |
+
position: fixed;
|
549 |
+
bottom: 0;
|
550 |
+
}
|
551 |
+
}
|
552 |
+
|
553 |
/* Print styles */
|
554 |
@media print {
|
555 |
body {
|
|
|
564 |
.typewriter-button {
|
565 |
display: none;
|
566 |
}
|
567 |
+
|
568 |
+
.sticky-controls {
|
569 |
+
display: none;
|
570 |
+
}
|
571 |
+
|
572 |
+
#game-container {
|
573 |
+
padding-bottom: 0;
|
574 |
+
}
|
575 |
}
|
576 |
}
|
577 |
|