Upload 16 files
Browse files- .gitattributes +1 -0
- css/main.css +2158 -0
- css/tailwind.css +205 -0
- index.html +60 -0
- package-lock.json +0 -0
- package.json +27 -0
- pages/active_quiz_interface.html +544 -0
- pages/fact_game_challenge.html +936 -0
- pages/flashcards_learning_interface.html +735 -0
- pages/quiz_dashboard.html +409 -0
- pages/quiz_results_statistics.html +543 -0
- pages/settings_preferences.html +1015 -0
- pages/topic_selection_browse.html +702 -0
- public/favicon.ico +3 -0
- public/manifest.json +15 -0
- streamlit_web_interface.html +1431 -0
- tailwind.config.js +184 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
public/favicon.ico filter=lfs diff=lfs merge=lfs -text
|
css/main.css
ADDED
|
@@ -0,0 +1,2158 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
|
| 2 |
+
|
| 3 |
+
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&display=swap');
|
| 4 |
+
|
| 5 |
+
*, ::before, ::after{
|
| 6 |
+
--tw-border-spacing-x: 0;
|
| 7 |
+
--tw-border-spacing-y: 0;
|
| 8 |
+
--tw-translate-x: 0;
|
| 9 |
+
--tw-translate-y: 0;
|
| 10 |
+
--tw-rotate: 0;
|
| 11 |
+
--tw-skew-x: 0;
|
| 12 |
+
--tw-skew-y: 0;
|
| 13 |
+
--tw-scale-x: 1;
|
| 14 |
+
--tw-scale-y: 1;
|
| 15 |
+
--tw-pan-x: ;
|
| 16 |
+
--tw-pan-y: ;
|
| 17 |
+
--tw-pinch-zoom: ;
|
| 18 |
+
--tw-scroll-snap-strictness: proximity;
|
| 19 |
+
--tw-gradient-from-position: ;
|
| 20 |
+
--tw-gradient-via-position: ;
|
| 21 |
+
--tw-gradient-to-position: ;
|
| 22 |
+
--tw-ordinal: ;
|
| 23 |
+
--tw-slashed-zero: ;
|
| 24 |
+
--tw-numeric-figure: ;
|
| 25 |
+
--tw-numeric-spacing: ;
|
| 26 |
+
--tw-numeric-fraction: ;
|
| 27 |
+
--tw-ring-inset: ;
|
| 28 |
+
--tw-ring-offset-width: 0px;
|
| 29 |
+
--tw-ring-offset-color: #fff;
|
| 30 |
+
--tw-ring-color: rgb(59 130 246 / 0.5);
|
| 31 |
+
--tw-ring-offset-shadow: 0 0 #0000;
|
| 32 |
+
--tw-ring-shadow: 0 0 #0000;
|
| 33 |
+
--tw-shadow: 0 0 #0000;
|
| 34 |
+
--tw-shadow-colored: 0 0 #0000;
|
| 35 |
+
--tw-blur: ;
|
| 36 |
+
--tw-brightness: ;
|
| 37 |
+
--tw-contrast: ;
|
| 38 |
+
--tw-grayscale: ;
|
| 39 |
+
--tw-hue-rotate: ;
|
| 40 |
+
--tw-invert: ;
|
| 41 |
+
--tw-saturate: ;
|
| 42 |
+
--tw-sepia: ;
|
| 43 |
+
--tw-drop-shadow: ;
|
| 44 |
+
--tw-backdrop-blur: ;
|
| 45 |
+
--tw-backdrop-brightness: ;
|
| 46 |
+
--tw-backdrop-contrast: ;
|
| 47 |
+
--tw-backdrop-grayscale: ;
|
| 48 |
+
--tw-backdrop-hue-rotate: ;
|
| 49 |
+
--tw-backdrop-invert: ;
|
| 50 |
+
--tw-backdrop-opacity: ;
|
| 51 |
+
--tw-backdrop-saturate: ;
|
| 52 |
+
--tw-backdrop-sepia: ;
|
| 53 |
+
--tw-contain-size: ;
|
| 54 |
+
--tw-contain-layout: ;
|
| 55 |
+
--tw-contain-paint: ;
|
| 56 |
+
--tw-contain-style: ;
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
::backdrop{
|
| 60 |
+
--tw-border-spacing-x: 0;
|
| 61 |
+
--tw-border-spacing-y: 0;
|
| 62 |
+
--tw-translate-x: 0;
|
| 63 |
+
--tw-translate-y: 0;
|
| 64 |
+
--tw-rotate: 0;
|
| 65 |
+
--tw-skew-x: 0;
|
| 66 |
+
--tw-skew-y: 0;
|
| 67 |
+
--tw-scale-x: 1;
|
| 68 |
+
--tw-scale-y: 1;
|
| 69 |
+
--tw-pan-x: ;
|
| 70 |
+
--tw-pan-y: ;
|
| 71 |
+
--tw-pinch-zoom: ;
|
| 72 |
+
--tw-scroll-snap-strictness: proximity;
|
| 73 |
+
--tw-gradient-from-position: ;
|
| 74 |
+
--tw-gradient-via-position: ;
|
| 75 |
+
--tw-gradient-to-position: ;
|
| 76 |
+
--tw-ordinal: ;
|
| 77 |
+
--tw-slashed-zero: ;
|
| 78 |
+
--tw-numeric-figure: ;
|
| 79 |
+
--tw-numeric-spacing: ;
|
| 80 |
+
--tw-numeric-fraction: ;
|
| 81 |
+
--tw-ring-inset: ;
|
| 82 |
+
--tw-ring-offset-width: 0px;
|
| 83 |
+
--tw-ring-offset-color: #fff;
|
| 84 |
+
--tw-ring-color: rgb(59 130 246 / 0.5);
|
| 85 |
+
--tw-ring-offset-shadow: 0 0 #0000;
|
| 86 |
+
--tw-ring-shadow: 0 0 #0000;
|
| 87 |
+
--tw-shadow: 0 0 #0000;
|
| 88 |
+
--tw-shadow-colored: 0 0 #0000;
|
| 89 |
+
--tw-blur: ;
|
| 90 |
+
--tw-brightness: ;
|
| 91 |
+
--tw-contrast: ;
|
| 92 |
+
--tw-grayscale: ;
|
| 93 |
+
--tw-hue-rotate: ;
|
| 94 |
+
--tw-invert: ;
|
| 95 |
+
--tw-saturate: ;
|
| 96 |
+
--tw-sepia: ;
|
| 97 |
+
--tw-drop-shadow: ;
|
| 98 |
+
--tw-backdrop-blur: ;
|
| 99 |
+
--tw-backdrop-brightness: ;
|
| 100 |
+
--tw-backdrop-contrast: ;
|
| 101 |
+
--tw-backdrop-grayscale: ;
|
| 102 |
+
--tw-backdrop-hue-rotate: ;
|
| 103 |
+
--tw-backdrop-invert: ;
|
| 104 |
+
--tw-backdrop-opacity: ;
|
| 105 |
+
--tw-backdrop-saturate: ;
|
| 106 |
+
--tw-backdrop-sepia: ;
|
| 107 |
+
--tw-contain-size: ;
|
| 108 |
+
--tw-contain-layout: ;
|
| 109 |
+
--tw-contain-paint: ;
|
| 110 |
+
--tw-contain-style: ;
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
/*
|
| 114 |
+
! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com
|
| 115 |
+
*/
|
| 116 |
+
|
| 117 |
+
/*
|
| 118 |
+
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
|
| 119 |
+
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
|
| 120 |
+
*/
|
| 121 |
+
|
| 122 |
+
*,
|
| 123 |
+
::before,
|
| 124 |
+
::after {
|
| 125 |
+
box-sizing: border-box;
|
| 126 |
+
/* 1 */
|
| 127 |
+
border-width: 0;
|
| 128 |
+
/* 2 */
|
| 129 |
+
border-style: solid;
|
| 130 |
+
/* 2 */
|
| 131 |
+
border-color: #e5e7eb;
|
| 132 |
+
/* 2 */
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
::before,
|
| 136 |
+
::after {
|
| 137 |
+
--tw-content: '';
|
| 138 |
+
}
|
| 139 |
+
|
| 140 |
+
/*
|
| 141 |
+
1. Use a consistent sensible line-height in all browsers.
|
| 142 |
+
2. Prevent adjustments of font size after orientation changes in iOS.
|
| 143 |
+
3. Use a more readable tab size.
|
| 144 |
+
4. Use the user's configured `sans` font-family by default.
|
| 145 |
+
5. Use the user's configured `sans` font-feature-settings by default.
|
| 146 |
+
6. Use the user's configured `sans` font-variation-settings by default.
|
| 147 |
+
7. Disable tap highlights on iOS
|
| 148 |
+
*/
|
| 149 |
+
|
| 150 |
+
html,
|
| 151 |
+
:host {
|
| 152 |
+
line-height: 1.5;
|
| 153 |
+
/* 1 */
|
| 154 |
+
-webkit-text-size-adjust: 100%;
|
| 155 |
+
/* 2 */
|
| 156 |
+
-moz-tab-size: 4;
|
| 157 |
+
/* 3 */
|
| 158 |
+
-o-tab-size: 4;
|
| 159 |
+
tab-size: 4;
|
| 160 |
+
/* 3 */
|
| 161 |
+
font-family: Inter, sans-serif;
|
| 162 |
+
/* 4 */
|
| 163 |
+
font-feature-settings: normal;
|
| 164 |
+
/* 5 */
|
| 165 |
+
font-variation-settings: normal;
|
| 166 |
+
/* 6 */
|
| 167 |
+
-webkit-tap-highlight-color: transparent;
|
| 168 |
+
/* 7 */
|
| 169 |
+
}
|
| 170 |
+
|
| 171 |
+
/*
|
| 172 |
+
1. Remove the margin in all browsers.
|
| 173 |
+
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
|
| 174 |
+
*/
|
| 175 |
+
|
| 176 |
+
body {
|
| 177 |
+
margin: 0;
|
| 178 |
+
/* 1 */
|
| 179 |
+
line-height: inherit;
|
| 180 |
+
/* 2 */
|
| 181 |
+
}
|
| 182 |
+
|
| 183 |
+
/*
|
| 184 |
+
1. Add the correct height in Firefox.
|
| 185 |
+
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
|
| 186 |
+
3. Ensure horizontal rules are visible by default.
|
| 187 |
+
*/
|
| 188 |
+
|
| 189 |
+
hr {
|
| 190 |
+
height: 0;
|
| 191 |
+
/* 1 */
|
| 192 |
+
color: inherit;
|
| 193 |
+
/* 2 */
|
| 194 |
+
border-top-width: 1px;
|
| 195 |
+
/* 3 */
|
| 196 |
+
}
|
| 197 |
+
|
| 198 |
+
/*
|
| 199 |
+
Add the correct text decoration in Chrome, Edge, and Safari.
|
| 200 |
+
*/
|
| 201 |
+
|
| 202 |
+
abbr:where([title]) {
|
| 203 |
+
-webkit-text-decoration: underline dotted;
|
| 204 |
+
text-decoration: underline dotted;
|
| 205 |
+
}
|
| 206 |
+
|
| 207 |
+
/*
|
| 208 |
+
Remove the default font size and weight for headings.
|
| 209 |
+
*/
|
| 210 |
+
|
| 211 |
+
h1,
|
| 212 |
+
h2,
|
| 213 |
+
h3,
|
| 214 |
+
h4,
|
| 215 |
+
h5,
|
| 216 |
+
h6 {
|
| 217 |
+
font-size: inherit;
|
| 218 |
+
font-weight: inherit;
|
| 219 |
+
}
|
| 220 |
+
|
| 221 |
+
/*
|
| 222 |
+
Reset links to optimize for opt-in styling instead of opt-out.
|
| 223 |
+
*/
|
| 224 |
+
|
| 225 |
+
a {
|
| 226 |
+
color: inherit;
|
| 227 |
+
text-decoration: inherit;
|
| 228 |
+
}
|
| 229 |
+
|
| 230 |
+
/*
|
| 231 |
+
Add the correct font weight in Edge and Safari.
|
| 232 |
+
*/
|
| 233 |
+
|
| 234 |
+
b,
|
| 235 |
+
strong {
|
| 236 |
+
font-weight: bolder;
|
| 237 |
+
}
|
| 238 |
+
|
| 239 |
+
/*
|
| 240 |
+
1. Use the user's configured `mono` font-family by default.
|
| 241 |
+
2. Use the user's configured `mono` font-feature-settings by default.
|
| 242 |
+
3. Use the user's configured `mono` font-variation-settings by default.
|
| 243 |
+
4. Correct the odd `em` font sizing in all browsers.
|
| 244 |
+
*/
|
| 245 |
+
|
| 246 |
+
code,
|
| 247 |
+
kbd,
|
| 248 |
+
samp,
|
| 249 |
+
pre {
|
| 250 |
+
font-family: JetBrains Mono, monospace;
|
| 251 |
+
/* 1 */
|
| 252 |
+
font-feature-settings: normal;
|
| 253 |
+
/* 2 */
|
| 254 |
+
font-variation-settings: normal;
|
| 255 |
+
/* 3 */
|
| 256 |
+
font-size: 1em;
|
| 257 |
+
/* 4 */
|
| 258 |
+
}
|
| 259 |
+
|
| 260 |
+
/*
|
| 261 |
+
Add the correct font size in all browsers.
|
| 262 |
+
*/
|
| 263 |
+
|
| 264 |
+
small {
|
| 265 |
+
font-size: 80%;
|
| 266 |
+
}
|
| 267 |
+
|
| 268 |
+
/*
|
| 269 |
+
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
|
| 270 |
+
*/
|
| 271 |
+
|
| 272 |
+
sub,
|
| 273 |
+
sup {
|
| 274 |
+
font-size: 75%;
|
| 275 |
+
line-height: 0;
|
| 276 |
+
position: relative;
|
| 277 |
+
vertical-align: baseline;
|
| 278 |
+
}
|
| 279 |
+
|
| 280 |
+
sub {
|
| 281 |
+
bottom: -0.25em;
|
| 282 |
+
}
|
| 283 |
+
|
| 284 |
+
sup {
|
| 285 |
+
top: -0.5em;
|
| 286 |
+
}
|
| 287 |
+
|
| 288 |
+
/*
|
| 289 |
+
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
|
| 290 |
+
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
|
| 291 |
+
3. Remove gaps between table borders by default.
|
| 292 |
+
*/
|
| 293 |
+
|
| 294 |
+
table {
|
| 295 |
+
text-indent: 0;
|
| 296 |
+
/* 1 */
|
| 297 |
+
border-color: inherit;
|
| 298 |
+
/* 2 */
|
| 299 |
+
border-collapse: collapse;
|
| 300 |
+
/* 3 */
|
| 301 |
+
}
|
| 302 |
+
|
| 303 |
+
/*
|
| 304 |
+
1. Change the font styles in all browsers.
|
| 305 |
+
2. Remove the margin in Firefox and Safari.
|
| 306 |
+
3. Remove default padding in all browsers.
|
| 307 |
+
*/
|
| 308 |
+
|
| 309 |
+
button,
|
| 310 |
+
input,
|
| 311 |
+
optgroup,
|
| 312 |
+
select,
|
| 313 |
+
textarea {
|
| 314 |
+
font-family: inherit;
|
| 315 |
+
/* 1 */
|
| 316 |
+
font-feature-settings: inherit;
|
| 317 |
+
/* 1 */
|
| 318 |
+
font-variation-settings: inherit;
|
| 319 |
+
/* 1 */
|
| 320 |
+
font-size: 100%;
|
| 321 |
+
/* 1 */
|
| 322 |
+
font-weight: inherit;
|
| 323 |
+
/* 1 */
|
| 324 |
+
line-height: inherit;
|
| 325 |
+
/* 1 */
|
| 326 |
+
letter-spacing: inherit;
|
| 327 |
+
/* 1 */
|
| 328 |
+
color: inherit;
|
| 329 |
+
/* 1 */
|
| 330 |
+
margin: 0;
|
| 331 |
+
/* 2 */
|
| 332 |
+
padding: 0;
|
| 333 |
+
/* 3 */
|
| 334 |
+
}
|
| 335 |
+
|
| 336 |
+
/*
|
| 337 |
+
Remove the inheritance of text transform in Edge and Firefox.
|
| 338 |
+
*/
|
| 339 |
+
|
| 340 |
+
button,
|
| 341 |
+
select {
|
| 342 |
+
text-transform: none;
|
| 343 |
+
}
|
| 344 |
+
|
| 345 |
+
/*
|
| 346 |
+
1. Correct the inability to style clickable types in iOS and Safari.
|
| 347 |
+
2. Remove default button styles.
|
| 348 |
+
*/
|
| 349 |
+
|
| 350 |
+
button,
|
| 351 |
+
input:where([type='button']),
|
| 352 |
+
input:where([type='reset']),
|
| 353 |
+
input:where([type='submit']) {
|
| 354 |
+
-webkit-appearance: button;
|
| 355 |
+
/* 1 */
|
| 356 |
+
background-color: transparent;
|
| 357 |
+
/* 2 */
|
| 358 |
+
background-image: none;
|
| 359 |
+
/* 2 */
|
| 360 |
+
}
|
| 361 |
+
|
| 362 |
+
/*
|
| 363 |
+
Use the modern Firefox focus style for all focusable elements.
|
| 364 |
+
*/
|
| 365 |
+
|
| 366 |
+
:-moz-focusring {
|
| 367 |
+
outline: auto;
|
| 368 |
+
}
|
| 369 |
+
|
| 370 |
+
/*
|
| 371 |
+
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
|
| 372 |
+
*/
|
| 373 |
+
|
| 374 |
+
:-moz-ui-invalid {
|
| 375 |
+
box-shadow: none;
|
| 376 |
+
}
|
| 377 |
+
|
| 378 |
+
/*
|
| 379 |
+
Add the correct vertical alignment in Chrome and Firefox.
|
| 380 |
+
*/
|
| 381 |
+
|
| 382 |
+
progress {
|
| 383 |
+
vertical-align: baseline;
|
| 384 |
+
}
|
| 385 |
+
|
| 386 |
+
/*
|
| 387 |
+
Correct the cursor style of increment and decrement buttons in Safari.
|
| 388 |
+
*/
|
| 389 |
+
|
| 390 |
+
::-webkit-inner-spin-button,
|
| 391 |
+
::-webkit-outer-spin-button {
|
| 392 |
+
height: auto;
|
| 393 |
+
}
|
| 394 |
+
|
| 395 |
+
/*
|
| 396 |
+
1. Correct the odd appearance in Chrome and Safari.
|
| 397 |
+
2. Correct the outline style in Safari.
|
| 398 |
+
*/
|
| 399 |
+
|
| 400 |
+
[type='search'] {
|
| 401 |
+
-webkit-appearance: textfield;
|
| 402 |
+
/* 1 */
|
| 403 |
+
outline-offset: -2px;
|
| 404 |
+
/* 2 */
|
| 405 |
+
}
|
| 406 |
+
|
| 407 |
+
/*
|
| 408 |
+
Remove the inner padding in Chrome and Safari on macOS.
|
| 409 |
+
*/
|
| 410 |
+
|
| 411 |
+
::-webkit-search-decoration {
|
| 412 |
+
-webkit-appearance: none;
|
| 413 |
+
}
|
| 414 |
+
|
| 415 |
+
/*
|
| 416 |
+
1. Correct the inability to style clickable types in iOS and Safari.
|
| 417 |
+
2. Change font properties to `inherit` in Safari.
|
| 418 |
+
*/
|
| 419 |
+
|
| 420 |
+
::-webkit-file-upload-button {
|
| 421 |
+
-webkit-appearance: button;
|
| 422 |
+
/* 1 */
|
| 423 |
+
font: inherit;
|
| 424 |
+
/* 2 */
|
| 425 |
+
}
|
| 426 |
+
|
| 427 |
+
/*
|
| 428 |
+
Add the correct display in Chrome and Safari.
|
| 429 |
+
*/
|
| 430 |
+
|
| 431 |
+
summary {
|
| 432 |
+
display: list-item;
|
| 433 |
+
}
|
| 434 |
+
|
| 435 |
+
/*
|
| 436 |
+
Removes the default spacing and border for appropriate elements.
|
| 437 |
+
*/
|
| 438 |
+
|
| 439 |
+
blockquote,
|
| 440 |
+
dl,
|
| 441 |
+
dd,
|
| 442 |
+
h1,
|
| 443 |
+
h2,
|
| 444 |
+
h3,
|
| 445 |
+
h4,
|
| 446 |
+
h5,
|
| 447 |
+
h6,
|
| 448 |
+
hr,
|
| 449 |
+
figure,
|
| 450 |
+
p,
|
| 451 |
+
pre {
|
| 452 |
+
margin: 0;
|
| 453 |
+
}
|
| 454 |
+
|
| 455 |
+
fieldset {
|
| 456 |
+
margin: 0;
|
| 457 |
+
padding: 0;
|
| 458 |
+
}
|
| 459 |
+
|
| 460 |
+
legend {
|
| 461 |
+
padding: 0;
|
| 462 |
+
}
|
| 463 |
+
|
| 464 |
+
ol,
|
| 465 |
+
ul,
|
| 466 |
+
menu {
|
| 467 |
+
list-style: none;
|
| 468 |
+
margin: 0;
|
| 469 |
+
padding: 0;
|
| 470 |
+
}
|
| 471 |
+
|
| 472 |
+
/*
|
| 473 |
+
Reset default styling for dialogs.
|
| 474 |
+
*/
|
| 475 |
+
|
| 476 |
+
dialog {
|
| 477 |
+
padding: 0;
|
| 478 |
+
}
|
| 479 |
+
|
| 480 |
+
/*
|
| 481 |
+
Prevent resizing textareas horizontally by default.
|
| 482 |
+
*/
|
| 483 |
+
|
| 484 |
+
textarea {
|
| 485 |
+
resize: vertical;
|
| 486 |
+
}
|
| 487 |
+
|
| 488 |
+
/*
|
| 489 |
+
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
|
| 490 |
+
2. Set the default placeholder color to the user's configured gray 400 color.
|
| 491 |
+
*/
|
| 492 |
+
|
| 493 |
+
input::-moz-placeholder, textarea::-moz-placeholder {
|
| 494 |
+
opacity: 1;
|
| 495 |
+
/* 1 */
|
| 496 |
+
color: #9ca3af;
|
| 497 |
+
/* 2 */
|
| 498 |
+
}
|
| 499 |
+
|
| 500 |
+
input::placeholder,
|
| 501 |
+
textarea::placeholder {
|
| 502 |
+
opacity: 1;
|
| 503 |
+
/* 1 */
|
| 504 |
+
color: #9ca3af;
|
| 505 |
+
/* 2 */
|
| 506 |
+
}
|
| 507 |
+
|
| 508 |
+
/*
|
| 509 |
+
Set the default cursor for buttons.
|
| 510 |
+
*/
|
| 511 |
+
|
| 512 |
+
button,
|
| 513 |
+
[role="button"] {
|
| 514 |
+
cursor: pointer;
|
| 515 |
+
}
|
| 516 |
+
|
| 517 |
+
/*
|
| 518 |
+
Make sure disabled buttons don't get the pointer cursor.
|
| 519 |
+
*/
|
| 520 |
+
|
| 521 |
+
:disabled {
|
| 522 |
+
cursor: default;
|
| 523 |
+
}
|
| 524 |
+
|
| 525 |
+
/*
|
| 526 |
+
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
|
| 527 |
+
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
|
| 528 |
+
This can trigger a poorly considered lint error in some tools but is included by design.
|
| 529 |
+
*/
|
| 530 |
+
|
| 531 |
+
img,
|
| 532 |
+
svg,
|
| 533 |
+
video,
|
| 534 |
+
canvas,
|
| 535 |
+
audio,
|
| 536 |
+
iframe,
|
| 537 |
+
embed,
|
| 538 |
+
object {
|
| 539 |
+
display: block;
|
| 540 |
+
/* 1 */
|
| 541 |
+
vertical-align: middle;
|
| 542 |
+
/* 2 */
|
| 543 |
+
}
|
| 544 |
+
|
| 545 |
+
/*
|
| 546 |
+
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
|
| 547 |
+
*/
|
| 548 |
+
|
| 549 |
+
img,
|
| 550 |
+
video {
|
| 551 |
+
max-width: 100%;
|
| 552 |
+
height: auto;
|
| 553 |
+
}
|
| 554 |
+
|
| 555 |
+
/* Make elements with the HTML hidden attribute stay hidden by default */
|
| 556 |
+
|
| 557 |
+
[hidden]:where(:not([hidden="until-found"])) {
|
| 558 |
+
display: none;
|
| 559 |
+
}
|
| 560 |
+
|
| 561 |
+
*{
|
| 562 |
+
border-color: rgba(148, 163, 184, 0.2);
|
| 563 |
+
}
|
| 564 |
+
|
| 565 |
+
body{
|
| 566 |
+
--tw-bg-opacity: 1;
|
| 567 |
+
background-color: rgb(15 23 42 / var(--tw-bg-opacity, 1));
|
| 568 |
+
font-family: Inter, sans-serif;
|
| 569 |
+
--tw-text-opacity: 1;
|
| 570 |
+
color: rgb(248 250 252 / var(--tw-text-opacity, 1));
|
| 571 |
+
transition: background-color 300ms cubic-bezier(0.4, 0, 0.2, 1), color 300ms cubic-bezier(0.4, 0, 0.2, 1);
|
| 572 |
+
}
|
| 573 |
+
|
| 574 |
+
h1, h2, h3, h4, h5, h6{
|
| 575 |
+
font-family: Inter, sans-serif;
|
| 576 |
+
font-weight: 600;
|
| 577 |
+
}
|
| 578 |
+
|
| 579 |
+
p, span, div{
|
| 580 |
+
font-family: Inter, sans-serif;
|
| 581 |
+
}
|
| 582 |
+
|
| 583 |
+
/* Reduced motion preferences */
|
| 584 |
+
|
| 585 |
+
@media (prefers-reduced-motion: reduce) {
|
| 586 |
+
* {
|
| 587 |
+
animation-duration: 0.01ms !important;
|
| 588 |
+
animation-iteration-count: 1 !important;
|
| 589 |
+
transition-duration: 0.01ms !important;
|
| 590 |
+
}
|
| 591 |
+
}
|
| 592 |
+
|
| 593 |
+
.card{
|
| 594 |
+
border-radius: 12px;
|
| 595 |
+
border-width: 1px;
|
| 596 |
+
border-color: rgba(148, 163, 184, 0.2);
|
| 597 |
+
--tw-bg-opacity: 1;
|
| 598 |
+
background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1));
|
| 599 |
+
--tw-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
| 600 |
+
--tw-shadow-colored: 0 1px 3px var(--tw-shadow-color);
|
| 601 |
+
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
| 602 |
+
transition: all 150ms ease-out;
|
| 603 |
+
}
|
| 604 |
+
|
| 605 |
+
.card:hover{
|
| 606 |
+
--tw-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
| 607 |
+
--tw-shadow-colored: 0 4px 6px var(--tw-shadow-color);
|
| 608 |
+
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
| 609 |
+
transform: translateY(-1px);
|
| 610 |
+
}
|
| 611 |
+
|
| 612 |
+
.btn{
|
| 613 |
+
border-radius: 8px;
|
| 614 |
+
padding-left: 1rem;
|
| 615 |
+
padding-right: 1rem;
|
| 616 |
+
padding-top: 0.5rem;
|
| 617 |
+
padding-bottom: 0.5rem;
|
| 618 |
+
font-weight: 500;
|
| 619 |
+
transition-property: all;
|
| 620 |
+
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
| 621 |
+
transition-duration: 150ms;
|
| 622 |
+
transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
|
| 623 |
+
min-height: 44px;
|
| 624 |
+
min-width: 44px;
|
| 625 |
+
}
|
| 626 |
+
|
| 627 |
+
.btn:hover {
|
| 628 |
+
transform: scale(0.98);
|
| 629 |
+
}
|
| 630 |
+
|
| 631 |
+
.btn-primary{
|
| 632 |
+
--tw-bg-opacity: 1;
|
| 633 |
+
background-color: rgb(79 70 229 / var(--tw-bg-opacity, 1));
|
| 634 |
+
--tw-text-opacity: 1;
|
| 635 |
+
color: rgb(255 255 255 / var(--tw-text-opacity, 1));
|
| 636 |
+
}
|
| 637 |
+
|
| 638 |
+
.btn-primary:hover{
|
| 639 |
+
--tw-bg-opacity: 1;
|
| 640 |
+
background-color: rgb(67 56 202 / var(--tw-bg-opacity, 1));
|
| 641 |
+
}
|
| 642 |
+
|
| 643 |
+
.btn-secondary{
|
| 644 |
+
--tw-bg-opacity: 1;
|
| 645 |
+
background-color: rgb(6 182 212 / var(--tw-bg-opacity, 1));
|
| 646 |
+
--tw-text-opacity: 1;
|
| 647 |
+
color: rgb(255 255 255 / var(--tw-text-opacity, 1));
|
| 648 |
+
}
|
| 649 |
+
|
| 650 |
+
.btn-secondary:hover{
|
| 651 |
+
--tw-bg-opacity: 1;
|
| 652 |
+
background-color: rgb(8 145 178 / var(--tw-bg-opacity, 1));
|
| 653 |
+
}
|
| 654 |
+
|
| 655 |
+
.btn-accent{
|
| 656 |
+
--tw-bg-opacity: 1;
|
| 657 |
+
background-color: rgb(245 158 11 / var(--tw-bg-opacity, 1));
|
| 658 |
+
--tw-text-opacity: 1;
|
| 659 |
+
color: rgb(255 255 255 / var(--tw-text-opacity, 1));
|
| 660 |
+
}
|
| 661 |
+
|
| 662 |
+
.btn-accent:hover{
|
| 663 |
+
--tw-bg-opacity: 1;
|
| 664 |
+
background-color: rgb(217 119 6 / var(--tw-bg-opacity, 1));
|
| 665 |
+
}
|
| 666 |
+
|
| 667 |
+
@keyframes slideIn {
|
| 668 |
+
from {
|
| 669 |
+
transform: translateY(-10px);
|
| 670 |
+
opacity: 0;
|
| 671 |
+
}
|
| 672 |
+
|
| 673 |
+
to {
|
| 674 |
+
transform: translateY(0);
|
| 675 |
+
opacity: 1;
|
| 676 |
+
}
|
| 677 |
+
}
|
| 678 |
+
|
| 679 |
+
.progress-bar{
|
| 680 |
+
overflow: hidden;
|
| 681 |
+
border-radius: 9999px;
|
| 682 |
+
--tw-bg-opacity: 1;
|
| 683 |
+
background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1));
|
| 684 |
+
}
|
| 685 |
+
|
| 686 |
+
.progress-fill{
|
| 687 |
+
height: 100%;
|
| 688 |
+
--tw-bg-opacity: 1;
|
| 689 |
+
background-color: rgb(79 70 229 / var(--tw-bg-opacity, 1));
|
| 690 |
+
transition-property: all;
|
| 691 |
+
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
| 692 |
+
transition-duration: 300ms;
|
| 693 |
+
transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
|
| 694 |
+
}
|
| 695 |
+
|
| 696 |
+
.pointer-events-none{
|
| 697 |
+
pointer-events: none;
|
| 698 |
+
}
|
| 699 |
+
|
| 700 |
+
.visible{
|
| 701 |
+
visibility: visible;
|
| 702 |
+
}
|
| 703 |
+
|
| 704 |
+
.static{
|
| 705 |
+
position: static;
|
| 706 |
+
}
|
| 707 |
+
|
| 708 |
+
.fixed{
|
| 709 |
+
position: fixed;
|
| 710 |
+
}
|
| 711 |
+
|
| 712 |
+
.absolute{
|
| 713 |
+
position: absolute;
|
| 714 |
+
}
|
| 715 |
+
|
| 716 |
+
.relative{
|
| 717 |
+
position: relative;
|
| 718 |
+
}
|
| 719 |
+
|
| 720 |
+
.sticky{
|
| 721 |
+
position: sticky;
|
| 722 |
+
}
|
| 723 |
+
|
| 724 |
+
.inset-0{
|
| 725 |
+
inset: 0px;
|
| 726 |
+
}
|
| 727 |
+
|
| 728 |
+
.inset-y-0{
|
| 729 |
+
top: 0px;
|
| 730 |
+
bottom: 0px;
|
| 731 |
+
}
|
| 732 |
+
|
| 733 |
+
.left-0{
|
| 734 |
+
left: 0px;
|
| 735 |
+
}
|
| 736 |
+
|
| 737 |
+
.right-0{
|
| 738 |
+
right: 0px;
|
| 739 |
+
}
|
| 740 |
+
|
| 741 |
+
.right-4{
|
| 742 |
+
right: 1rem;
|
| 743 |
+
}
|
| 744 |
+
|
| 745 |
+
.top-0{
|
| 746 |
+
top: 0px;
|
| 747 |
+
}
|
| 748 |
+
|
| 749 |
+
.top-4{
|
| 750 |
+
top: 1rem;
|
| 751 |
+
}
|
| 752 |
+
|
| 753 |
+
.top-6{
|
| 754 |
+
top: 1.5rem;
|
| 755 |
+
}
|
| 756 |
+
|
| 757 |
+
.z-30{
|
| 758 |
+
z-index: 30;
|
| 759 |
+
}
|
| 760 |
+
|
| 761 |
+
.z-40{
|
| 762 |
+
z-index: 40;
|
| 763 |
+
}
|
| 764 |
+
|
| 765 |
+
.z-50{
|
| 766 |
+
z-index: 50;
|
| 767 |
+
}
|
| 768 |
+
|
| 769 |
+
.mx-auto{
|
| 770 |
+
margin-left: auto;
|
| 771 |
+
margin-right: auto;
|
| 772 |
+
}
|
| 773 |
+
|
| 774 |
+
.mb-1{
|
| 775 |
+
margin-bottom: 0.25rem;
|
| 776 |
+
}
|
| 777 |
+
|
| 778 |
+
.mb-2{
|
| 779 |
+
margin-bottom: 0.5rem;
|
| 780 |
+
}
|
| 781 |
+
|
| 782 |
+
.mb-3{
|
| 783 |
+
margin-bottom: 0.75rem;
|
| 784 |
+
}
|
| 785 |
+
|
| 786 |
+
.mb-4{
|
| 787 |
+
margin-bottom: 1rem;
|
| 788 |
+
}
|
| 789 |
+
|
| 790 |
+
.mb-6{
|
| 791 |
+
margin-bottom: 1.5rem;
|
| 792 |
+
}
|
| 793 |
+
|
| 794 |
+
.ml-1{
|
| 795 |
+
margin-left: 0.25rem;
|
| 796 |
+
}
|
| 797 |
+
|
| 798 |
+
.ml-2{
|
| 799 |
+
margin-left: 0.5rem;
|
| 800 |
+
}
|
| 801 |
+
|
| 802 |
+
.mr-1{
|
| 803 |
+
margin-right: 0.25rem;
|
| 804 |
+
}
|
| 805 |
+
|
| 806 |
+
.mr-2{
|
| 807 |
+
margin-right: 0.5rem;
|
| 808 |
+
}
|
| 809 |
+
|
| 810 |
+
.mr-3{
|
| 811 |
+
margin-right: 0.75rem;
|
| 812 |
+
}
|
| 813 |
+
|
| 814 |
+
.mr-4{
|
| 815 |
+
margin-right: 1rem;
|
| 816 |
+
}
|
| 817 |
+
|
| 818 |
+
.mt-1{
|
| 819 |
+
margin-top: 0.25rem;
|
| 820 |
+
}
|
| 821 |
+
|
| 822 |
+
.mt-2{
|
| 823 |
+
margin-top: 0.5rem;
|
| 824 |
+
}
|
| 825 |
+
|
| 826 |
+
.mt-4{
|
| 827 |
+
margin-top: 1rem;
|
| 828 |
+
}
|
| 829 |
+
|
| 830 |
+
.mt-6{
|
| 831 |
+
margin-top: 1.5rem;
|
| 832 |
+
}
|
| 833 |
+
|
| 834 |
+
.mt-8{
|
| 835 |
+
margin-top: 2rem;
|
| 836 |
+
}
|
| 837 |
+
|
| 838 |
+
.block{
|
| 839 |
+
display: block;
|
| 840 |
+
}
|
| 841 |
+
|
| 842 |
+
.inline-block{
|
| 843 |
+
display: inline-block;
|
| 844 |
+
}
|
| 845 |
+
|
| 846 |
+
.flex{
|
| 847 |
+
display: flex;
|
| 848 |
+
}
|
| 849 |
+
|
| 850 |
+
.inline-flex{
|
| 851 |
+
display: inline-flex;
|
| 852 |
+
}
|
| 853 |
+
|
| 854 |
+
.grid{
|
| 855 |
+
display: grid;
|
| 856 |
+
}
|
| 857 |
+
|
| 858 |
+
.hidden{
|
| 859 |
+
display: none;
|
| 860 |
+
}
|
| 861 |
+
|
| 862 |
+
.h-10{
|
| 863 |
+
height: 2.5rem;
|
| 864 |
+
}
|
| 865 |
+
|
| 866 |
+
.h-12{
|
| 867 |
+
height: 3rem;
|
| 868 |
+
}
|
| 869 |
+
|
| 870 |
+
.h-16{
|
| 871 |
+
height: 4rem;
|
| 872 |
+
}
|
| 873 |
+
|
| 874 |
+
.h-18{
|
| 875 |
+
height: 4.5rem;
|
| 876 |
+
}
|
| 877 |
+
|
| 878 |
+
.h-2{
|
| 879 |
+
height: 0.5rem;
|
| 880 |
+
}
|
| 881 |
+
|
| 882 |
+
.h-20{
|
| 883 |
+
height: 5rem;
|
| 884 |
+
}
|
| 885 |
+
|
| 886 |
+
.h-24{
|
| 887 |
+
height: 6rem;
|
| 888 |
+
}
|
| 889 |
+
|
| 890 |
+
.h-28{
|
| 891 |
+
height: 7rem;
|
| 892 |
+
}
|
| 893 |
+
|
| 894 |
+
.h-3{
|
| 895 |
+
height: 0.75rem;
|
| 896 |
+
}
|
| 897 |
+
|
| 898 |
+
.h-32{
|
| 899 |
+
height: 8rem;
|
| 900 |
+
}
|
| 901 |
+
|
| 902 |
+
.h-4{
|
| 903 |
+
height: 1rem;
|
| 904 |
+
}
|
| 905 |
+
|
| 906 |
+
.h-6{
|
| 907 |
+
height: 1.5rem;
|
| 908 |
+
}
|
| 909 |
+
|
| 910 |
+
.h-8{
|
| 911 |
+
height: 2rem;
|
| 912 |
+
}
|
| 913 |
+
|
| 914 |
+
.h-full{
|
| 915 |
+
height: 100%;
|
| 916 |
+
}
|
| 917 |
+
|
| 918 |
+
.max-h-60{
|
| 919 |
+
max-height: 15rem;
|
| 920 |
+
}
|
| 921 |
+
|
| 922 |
+
.max-h-96{
|
| 923 |
+
max-height: 24rem;
|
| 924 |
+
}
|
| 925 |
+
|
| 926 |
+
.min-h-screen{
|
| 927 |
+
min-height: 100vh;
|
| 928 |
+
}
|
| 929 |
+
|
| 930 |
+
.w-1\/3{
|
| 931 |
+
width: 33.333333%;
|
| 932 |
+
}
|
| 933 |
+
|
| 934 |
+
.w-10{
|
| 935 |
+
width: 2.5rem;
|
| 936 |
+
}
|
| 937 |
+
|
| 938 |
+
.w-11{
|
| 939 |
+
width: 2.75rem;
|
| 940 |
+
}
|
| 941 |
+
|
| 942 |
+
.w-12{
|
| 943 |
+
width: 3rem;
|
| 944 |
+
}
|
| 945 |
+
|
| 946 |
+
.w-16{
|
| 947 |
+
width: 4rem;
|
| 948 |
+
}
|
| 949 |
+
|
| 950 |
+
.w-20{
|
| 951 |
+
width: 5rem;
|
| 952 |
+
}
|
| 953 |
+
|
| 954 |
+
.w-32{
|
| 955 |
+
width: 8rem;
|
| 956 |
+
}
|
| 957 |
+
|
| 958 |
+
.w-4{
|
| 959 |
+
width: 1rem;
|
| 960 |
+
}
|
| 961 |
+
|
| 962 |
+
.w-6{
|
| 963 |
+
width: 1.5rem;
|
| 964 |
+
}
|
| 965 |
+
|
| 966 |
+
.w-72{
|
| 967 |
+
width: 18rem;
|
| 968 |
+
}
|
| 969 |
+
|
| 970 |
+
.w-8{
|
| 971 |
+
width: 2rem;
|
| 972 |
+
}
|
| 973 |
+
|
| 974 |
+
.w-80{
|
| 975 |
+
width: 20rem;
|
| 976 |
+
}
|
| 977 |
+
|
| 978 |
+
.w-full{
|
| 979 |
+
width: 100%;
|
| 980 |
+
}
|
| 981 |
+
|
| 982 |
+
.max-w-2xl{
|
| 983 |
+
max-width: 42rem;
|
| 984 |
+
}
|
| 985 |
+
|
| 986 |
+
.max-w-3xl{
|
| 987 |
+
max-width: 48rem;
|
| 988 |
+
}
|
| 989 |
+
|
| 990 |
+
.max-w-4xl{
|
| 991 |
+
max-width: 56rem;
|
| 992 |
+
}
|
| 993 |
+
|
| 994 |
+
.max-w-md{
|
| 995 |
+
max-width: 28rem;
|
| 996 |
+
}
|
| 997 |
+
|
| 998 |
+
.flex-1{
|
| 999 |
+
flex: 1 1 0%;
|
| 1000 |
+
}
|
| 1001 |
+
|
| 1002 |
+
.flex-shrink-0{
|
| 1003 |
+
flex-shrink: 0;
|
| 1004 |
+
}
|
| 1005 |
+
|
| 1006 |
+
.-translate-x-full{
|
| 1007 |
+
--tw-translate-x: -100%;
|
| 1008 |
+
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
| 1009 |
+
}
|
| 1010 |
+
|
| 1011 |
+
.translate-x-1{
|
| 1012 |
+
--tw-translate-x: 0.25rem;
|
| 1013 |
+
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
| 1014 |
+
}
|
| 1015 |
+
|
| 1016 |
+
.translate-x-6{
|
| 1017 |
+
--tw-translate-x: 1.5rem;
|
| 1018 |
+
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
| 1019 |
+
}
|
| 1020 |
+
|
| 1021 |
+
.-rotate-90{
|
| 1022 |
+
--tw-rotate: -90deg;
|
| 1023 |
+
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
| 1024 |
+
}
|
| 1025 |
+
|
| 1026 |
+
.rotate-180{
|
| 1027 |
+
--tw-rotate: 180deg;
|
| 1028 |
+
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
| 1029 |
+
}
|
| 1030 |
+
|
| 1031 |
+
.transform{
|
| 1032 |
+
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
| 1033 |
+
}
|
| 1034 |
+
|
| 1035 |
+
@keyframes scaleIn{
|
| 1036 |
+
0%{
|
| 1037 |
+
transform: scale(0.95);
|
| 1038 |
+
opacity: 0;
|
| 1039 |
+
}
|
| 1040 |
+
|
| 1041 |
+
100%{
|
| 1042 |
+
transform: scale(1);
|
| 1043 |
+
opacity: 1;
|
| 1044 |
+
}
|
| 1045 |
+
}
|
| 1046 |
+
|
| 1047 |
+
.animate-scale-in{
|
| 1048 |
+
animation: scaleIn 150ms ease-out;
|
| 1049 |
+
}
|
| 1050 |
+
|
| 1051 |
+
.cursor-not-allowed{
|
| 1052 |
+
cursor: not-allowed;
|
| 1053 |
+
}
|
| 1054 |
+
|
| 1055 |
+
.cursor-pointer{
|
| 1056 |
+
cursor: pointer;
|
| 1057 |
+
}
|
| 1058 |
+
|
| 1059 |
+
.appearance-none{
|
| 1060 |
+
-webkit-appearance: none;
|
| 1061 |
+
-moz-appearance: none;
|
| 1062 |
+
appearance: none;
|
| 1063 |
+
}
|
| 1064 |
+
|
| 1065 |
+
.grid-cols-1{
|
| 1066 |
+
grid-template-columns: repeat(1, minmax(0, 1fr));
|
| 1067 |
+
}
|
| 1068 |
+
|
| 1069 |
+
.grid-cols-2{
|
| 1070 |
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
| 1071 |
+
}
|
| 1072 |
+
|
| 1073 |
+
.grid-cols-3{
|
| 1074 |
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
| 1075 |
+
}
|
| 1076 |
+
|
| 1077 |
+
.flex-col{
|
| 1078 |
+
flex-direction: column;
|
| 1079 |
+
}
|
| 1080 |
+
|
| 1081 |
+
.items-start{
|
| 1082 |
+
align-items: flex-start;
|
| 1083 |
+
}
|
| 1084 |
+
|
| 1085 |
+
.items-end{
|
| 1086 |
+
align-items: flex-end;
|
| 1087 |
+
}
|
| 1088 |
+
|
| 1089 |
+
.items-center{
|
| 1090 |
+
align-items: center;
|
| 1091 |
+
}
|
| 1092 |
+
|
| 1093 |
+
.justify-center{
|
| 1094 |
+
justify-content: center;
|
| 1095 |
+
}
|
| 1096 |
+
|
| 1097 |
+
.justify-between{
|
| 1098 |
+
justify-content: space-between;
|
| 1099 |
+
}
|
| 1100 |
+
|
| 1101 |
+
.gap-3{
|
| 1102 |
+
gap: 0.75rem;
|
| 1103 |
+
}
|
| 1104 |
+
|
| 1105 |
+
.gap-4{
|
| 1106 |
+
gap: 1rem;
|
| 1107 |
+
}
|
| 1108 |
+
|
| 1109 |
+
.gap-6{
|
| 1110 |
+
gap: 1.5rem;
|
| 1111 |
+
}
|
| 1112 |
+
|
| 1113 |
+
.space-x-1 > :not([hidden]) ~ :not([hidden]){
|
| 1114 |
+
--tw-space-x-reverse: 0;
|
| 1115 |
+
margin-right: calc(0.25rem * var(--tw-space-x-reverse));
|
| 1116 |
+
margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse)));
|
| 1117 |
+
}
|
| 1118 |
+
|
| 1119 |
+
.space-x-2 > :not([hidden]) ~ :not([hidden]){
|
| 1120 |
+
--tw-space-x-reverse: 0;
|
| 1121 |
+
margin-right: calc(0.5rem * var(--tw-space-x-reverse));
|
| 1122 |
+
margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
|
| 1123 |
+
}
|
| 1124 |
+
|
| 1125 |
+
.space-x-3 > :not([hidden]) ~ :not([hidden]){
|
| 1126 |
+
--tw-space-x-reverse: 0;
|
| 1127 |
+
margin-right: calc(0.75rem * var(--tw-space-x-reverse));
|
| 1128 |
+
margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse)));
|
| 1129 |
+
}
|
| 1130 |
+
|
| 1131 |
+
.space-x-4 > :not([hidden]) ~ :not([hidden]){
|
| 1132 |
+
--tw-space-x-reverse: 0;
|
| 1133 |
+
margin-right: calc(1rem * var(--tw-space-x-reverse));
|
| 1134 |
+
margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
|
| 1135 |
+
}
|
| 1136 |
+
|
| 1137 |
+
.space-x-6 > :not([hidden]) ~ :not([hidden]){
|
| 1138 |
+
--tw-space-x-reverse: 0;
|
| 1139 |
+
margin-right: calc(1.5rem * var(--tw-space-x-reverse));
|
| 1140 |
+
margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse)));
|
| 1141 |
+
}
|
| 1142 |
+
|
| 1143 |
+
.space-y-2 > :not([hidden]) ~ :not([hidden]){
|
| 1144 |
+
--tw-space-y-reverse: 0;
|
| 1145 |
+
margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));
|
| 1146 |
+
margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));
|
| 1147 |
+
}
|
| 1148 |
+
|
| 1149 |
+
.space-y-3 > :not([hidden]) ~ :not([hidden]){
|
| 1150 |
+
--tw-space-y-reverse: 0;
|
| 1151 |
+
margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));
|
| 1152 |
+
margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));
|
| 1153 |
+
}
|
| 1154 |
+
|
| 1155 |
+
.space-y-4 > :not([hidden]) ~ :not([hidden]){
|
| 1156 |
+
--tw-space-y-reverse: 0;
|
| 1157 |
+
margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
|
| 1158 |
+
margin-bottom: calc(1rem * var(--tw-space-y-reverse));
|
| 1159 |
+
}
|
| 1160 |
+
|
| 1161 |
+
.space-y-6 > :not([hidden]) ~ :not([hidden]){
|
| 1162 |
+
--tw-space-y-reverse: 0;
|
| 1163 |
+
margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));
|
| 1164 |
+
margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));
|
| 1165 |
+
}
|
| 1166 |
+
|
| 1167 |
+
.space-y-8 > :not([hidden]) ~ :not([hidden]){
|
| 1168 |
+
--tw-space-y-reverse: 0;
|
| 1169 |
+
margin-top: calc(2rem * calc(1 - var(--tw-space-y-reverse)));
|
| 1170 |
+
margin-bottom: calc(2rem * var(--tw-space-y-reverse));
|
| 1171 |
+
}
|
| 1172 |
+
|
| 1173 |
+
.overflow-x-auto{
|
| 1174 |
+
overflow-x: auto;
|
| 1175 |
+
}
|
| 1176 |
+
|
| 1177 |
+
.overflow-y-auto{
|
| 1178 |
+
overflow-y: auto;
|
| 1179 |
+
}
|
| 1180 |
+
|
| 1181 |
+
.rounded{
|
| 1182 |
+
border-radius: 0.25rem;
|
| 1183 |
+
}
|
| 1184 |
+
|
| 1185 |
+
.rounded-full{
|
| 1186 |
+
border-radius: 9999px;
|
| 1187 |
+
}
|
| 1188 |
+
|
| 1189 |
+
.rounded-lg{
|
| 1190 |
+
border-radius: 12px;
|
| 1191 |
+
}
|
| 1192 |
+
|
| 1193 |
+
.rounded-xl{
|
| 1194 |
+
border-radius: 16px;
|
| 1195 |
+
}
|
| 1196 |
+
|
| 1197 |
+
.rounded-t{
|
| 1198 |
+
border-top-left-radius: 0.25rem;
|
| 1199 |
+
border-top-right-radius: 0.25rem;
|
| 1200 |
+
}
|
| 1201 |
+
|
| 1202 |
+
.border{
|
| 1203 |
+
border-width: 1px;
|
| 1204 |
+
}
|
| 1205 |
+
|
| 1206 |
+
.border-2{
|
| 1207 |
+
border-width: 2px;
|
| 1208 |
+
}
|
| 1209 |
+
|
| 1210 |
+
.border-b{
|
| 1211 |
+
border-bottom-width: 1px;
|
| 1212 |
+
}
|
| 1213 |
+
|
| 1214 |
+
.border-l-4{
|
| 1215 |
+
border-left-width: 4px;
|
| 1216 |
+
}
|
| 1217 |
+
|
| 1218 |
+
.border-r{
|
| 1219 |
+
border-right-width: 1px;
|
| 1220 |
+
}
|
| 1221 |
+
|
| 1222 |
+
.border-t{
|
| 1223 |
+
border-top-width: 1px;
|
| 1224 |
+
}
|
| 1225 |
+
|
| 1226 |
+
.border-accent{
|
| 1227 |
+
--tw-border-opacity: 1;
|
| 1228 |
+
border-color: rgb(245 158 11 / var(--tw-border-opacity, 1));
|
| 1229 |
+
}
|
| 1230 |
+
|
| 1231 |
+
.border-border{
|
| 1232 |
+
border-color: rgba(148, 163, 184, 0.2);
|
| 1233 |
+
}
|
| 1234 |
+
|
| 1235 |
+
.border-error{
|
| 1236 |
+
--tw-border-opacity: 1;
|
| 1237 |
+
border-color: rgb(239 68 68 / var(--tw-border-opacity, 1));
|
| 1238 |
+
}
|
| 1239 |
+
|
| 1240 |
+
.border-error-100{
|
| 1241 |
+
--tw-border-opacity: 1;
|
| 1242 |
+
border-color: rgb(254 226 226 / var(--tw-border-opacity, 1));
|
| 1243 |
+
}
|
| 1244 |
+
|
| 1245 |
+
.border-primary{
|
| 1246 |
+
--tw-border-opacity: 1;
|
| 1247 |
+
border-color: rgb(79 70 229 / var(--tw-border-opacity, 1));
|
| 1248 |
+
}
|
| 1249 |
+
|
| 1250 |
+
.border-primary-100{
|
| 1251 |
+
--tw-border-opacity: 1;
|
| 1252 |
+
border-color: rgb(224 231 255 / var(--tw-border-opacity, 1));
|
| 1253 |
+
}
|
| 1254 |
+
|
| 1255 |
+
.border-secondary{
|
| 1256 |
+
--tw-border-opacity: 1;
|
| 1257 |
+
border-color: rgb(6 182 212 / var(--tw-border-opacity, 1));
|
| 1258 |
+
}
|
| 1259 |
+
|
| 1260 |
+
.border-success-100{
|
| 1261 |
+
--tw-border-opacity: 1;
|
| 1262 |
+
border-color: rgb(209 250 229 / var(--tw-border-opacity, 1));
|
| 1263 |
+
}
|
| 1264 |
+
|
| 1265 |
+
.border-transparent{
|
| 1266 |
+
border-color: transparent;
|
| 1267 |
+
}
|
| 1268 |
+
|
| 1269 |
+
.border-warning{
|
| 1270 |
+
--tw-border-opacity: 1;
|
| 1271 |
+
border-color: rgb(245 158 11 / var(--tw-border-opacity, 1));
|
| 1272 |
+
}
|
| 1273 |
+
|
| 1274 |
+
.border-warning-100{
|
| 1275 |
+
--tw-border-opacity: 1;
|
| 1276 |
+
border-color: rgb(254 243 199 / var(--tw-border-opacity, 1));
|
| 1277 |
+
}
|
| 1278 |
+
|
| 1279 |
+
.border-white{
|
| 1280 |
+
--tw-border-opacity: 1;
|
| 1281 |
+
border-color: rgb(255 255 255 / var(--tw-border-opacity, 1));
|
| 1282 |
+
}
|
| 1283 |
+
|
| 1284 |
+
.bg-accent{
|
| 1285 |
+
--tw-bg-opacity: 1;
|
| 1286 |
+
background-color: rgb(245 158 11 / var(--tw-bg-opacity, 1));
|
| 1287 |
+
}
|
| 1288 |
+
|
| 1289 |
+
.bg-accent-100{
|
| 1290 |
+
--tw-bg-opacity: 1;
|
| 1291 |
+
background-color: rgb(254 243 199 / var(--tw-bg-opacity, 1));
|
| 1292 |
+
}
|
| 1293 |
+
|
| 1294 |
+
.bg-accent-50{
|
| 1295 |
+
--tw-bg-opacity: 1;
|
| 1296 |
+
background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1));
|
| 1297 |
+
}
|
| 1298 |
+
|
| 1299 |
+
.bg-background{
|
| 1300 |
+
--tw-bg-opacity: 1;
|
| 1301 |
+
background-color: rgb(15 23 42 / var(--tw-bg-opacity, 1));
|
| 1302 |
+
}
|
| 1303 |
+
|
| 1304 |
+
.bg-black{
|
| 1305 |
+
--tw-bg-opacity: 1;
|
| 1306 |
+
background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));
|
| 1307 |
+
}
|
| 1308 |
+
|
| 1309 |
+
.bg-blue-600{
|
| 1310 |
+
--tw-bg-opacity: 1;
|
| 1311 |
+
background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1));
|
| 1312 |
+
}
|
| 1313 |
+
|
| 1314 |
+
.bg-blue-800{
|
| 1315 |
+
--tw-bg-opacity: 1;
|
| 1316 |
+
background-color: rgb(30 64 175 / var(--tw-bg-opacity, 1));
|
| 1317 |
+
}
|
| 1318 |
+
|
| 1319 |
+
.bg-error{
|
| 1320 |
+
--tw-bg-opacity: 1;
|
| 1321 |
+
background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1));
|
| 1322 |
+
}
|
| 1323 |
+
|
| 1324 |
+
.bg-error-100{
|
| 1325 |
+
--tw-bg-opacity: 1;
|
| 1326 |
+
background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1));
|
| 1327 |
+
}
|
| 1328 |
+
|
| 1329 |
+
.bg-error-50{
|
| 1330 |
+
--tw-bg-opacity: 1;
|
| 1331 |
+
background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1));
|
| 1332 |
+
}
|
| 1333 |
+
|
| 1334 |
+
.bg-gray-300{
|
| 1335 |
+
--tw-bg-opacity: 1;
|
| 1336 |
+
background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1));
|
| 1337 |
+
}
|
| 1338 |
+
|
| 1339 |
+
.bg-gray-600{
|
| 1340 |
+
--tw-bg-opacity: 1;
|
| 1341 |
+
background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));
|
| 1342 |
+
}
|
| 1343 |
+
|
| 1344 |
+
.bg-green-600{
|
| 1345 |
+
--tw-bg-opacity: 1;
|
| 1346 |
+
background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));
|
| 1347 |
+
}
|
| 1348 |
+
|
| 1349 |
+
.bg-primary{
|
| 1350 |
+
--tw-bg-opacity: 1;
|
| 1351 |
+
background-color: rgb(79 70 229 / var(--tw-bg-opacity, 1));
|
| 1352 |
+
}
|
| 1353 |
+
|
| 1354 |
+
.bg-primary-100{
|
| 1355 |
+
--tw-bg-opacity: 1;
|
| 1356 |
+
background-color: rgb(224 231 255 / var(--tw-bg-opacity, 1));
|
| 1357 |
+
}
|
| 1358 |
+
|
| 1359 |
+
.bg-primary-50{
|
| 1360 |
+
--tw-bg-opacity: 1;
|
| 1361 |
+
background-color: rgb(238 242 255 / var(--tw-bg-opacity, 1));
|
| 1362 |
+
}
|
| 1363 |
+
|
| 1364 |
+
.bg-secondary{
|
| 1365 |
+
--tw-bg-opacity: 1;
|
| 1366 |
+
background-color: rgb(6 182 212 / var(--tw-bg-opacity, 1));
|
| 1367 |
+
}
|
| 1368 |
+
|
| 1369 |
+
.bg-secondary-100{
|
| 1370 |
+
--tw-bg-opacity: 1;
|
| 1371 |
+
background-color: rgb(207 250 254 / var(--tw-bg-opacity, 1));
|
| 1372 |
+
}
|
| 1373 |
+
|
| 1374 |
+
.bg-secondary-50{
|
| 1375 |
+
--tw-bg-opacity: 1;
|
| 1376 |
+
background-color: rgb(236 254 255 / var(--tw-bg-opacity, 1));
|
| 1377 |
+
}
|
| 1378 |
+
|
| 1379 |
+
.bg-success{
|
| 1380 |
+
--tw-bg-opacity: 1;
|
| 1381 |
+
background-color: rgb(16 185 129 / var(--tw-bg-opacity, 1));
|
| 1382 |
+
}
|
| 1383 |
+
|
| 1384 |
+
.bg-success-100{
|
| 1385 |
+
--tw-bg-opacity: 1;
|
| 1386 |
+
background-color: rgb(209 250 229 / var(--tw-bg-opacity, 1));
|
| 1387 |
+
}
|
| 1388 |
+
|
| 1389 |
+
.bg-success-50{
|
| 1390 |
+
--tw-bg-opacity: 1;
|
| 1391 |
+
background-color: rgb(236 253 245 / var(--tw-bg-opacity, 1));
|
| 1392 |
+
}
|
| 1393 |
+
|
| 1394 |
+
.bg-surface{
|
| 1395 |
+
--tw-bg-opacity: 1;
|
| 1396 |
+
background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1));
|
| 1397 |
+
}
|
| 1398 |
+
|
| 1399 |
+
.bg-warning{
|
| 1400 |
+
--tw-bg-opacity: 1;
|
| 1401 |
+
background-color: rgb(245 158 11 / var(--tw-bg-opacity, 1));
|
| 1402 |
+
}
|
| 1403 |
+
|
| 1404 |
+
.bg-warning-100{
|
| 1405 |
+
--tw-bg-opacity: 1;
|
| 1406 |
+
background-color: rgb(254 243 199 / var(--tw-bg-opacity, 1));
|
| 1407 |
+
}
|
| 1408 |
+
|
| 1409 |
+
.bg-warning-50{
|
| 1410 |
+
--tw-bg-opacity: 1;
|
| 1411 |
+
background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1));
|
| 1412 |
+
}
|
| 1413 |
+
|
| 1414 |
+
.bg-white{
|
| 1415 |
+
--tw-bg-opacity: 1;
|
| 1416 |
+
background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
|
| 1417 |
+
}
|
| 1418 |
+
|
| 1419 |
+
.bg-opacity-50{
|
| 1420 |
+
--tw-bg-opacity: 0.5;
|
| 1421 |
+
}
|
| 1422 |
+
|
| 1423 |
+
.bg-gradient-to-br{
|
| 1424 |
+
background-image: linear-gradient(to bottom right, var(--tw-gradient-stops));
|
| 1425 |
+
}
|
| 1426 |
+
|
| 1427 |
+
.bg-gradient-to-r{
|
| 1428 |
+
background-image: linear-gradient(to right, var(--tw-gradient-stops));
|
| 1429 |
+
}
|
| 1430 |
+
|
| 1431 |
+
.from-accent-50{
|
| 1432 |
+
--tw-gradient-from: #FFFBEB var(--tw-gradient-from-position);
|
| 1433 |
+
--tw-gradient-to: rgb(255 251 235 / 0) var(--tw-gradient-to-position);
|
| 1434 |
+
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
|
| 1435 |
+
}
|
| 1436 |
+
|
| 1437 |
+
.from-primary{
|
| 1438 |
+
--tw-gradient-from: #4F46E5 var(--tw-gradient-from-position);
|
| 1439 |
+
--tw-gradient-to: rgb(79 70 229 / 0) var(--tw-gradient-to-position);
|
| 1440 |
+
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
|
| 1441 |
+
}
|
| 1442 |
+
|
| 1443 |
+
.from-primary-50{
|
| 1444 |
+
--tw-gradient-from: #EEF2FF var(--tw-gradient-from-position);
|
| 1445 |
+
--tw-gradient-to: rgb(238 242 255 / 0) var(--tw-gradient-to-position);
|
| 1446 |
+
--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
|
| 1447 |
+
}
|
| 1448 |
+
|
| 1449 |
+
.to-secondary{
|
| 1450 |
+
--tw-gradient-to: #06B6D4 var(--tw-gradient-to-position);
|
| 1451 |
+
}
|
| 1452 |
+
|
| 1453 |
+
.to-secondary-50{
|
| 1454 |
+
--tw-gradient-to: #ECFEFF var(--tw-gradient-to-position);
|
| 1455 |
+
}
|
| 1456 |
+
|
| 1457 |
+
.to-warning-50{
|
| 1458 |
+
--tw-gradient-to: #FFFBEB var(--tw-gradient-to-position);
|
| 1459 |
+
}
|
| 1460 |
+
|
| 1461 |
+
.object-cover{
|
| 1462 |
+
-o-object-fit: cover;
|
| 1463 |
+
object-fit: cover;
|
| 1464 |
+
}
|
| 1465 |
+
|
| 1466 |
+
.p-3{
|
| 1467 |
+
padding: 0.75rem;
|
| 1468 |
+
}
|
| 1469 |
+
|
| 1470 |
+
.p-4{
|
| 1471 |
+
padding: 1rem;
|
| 1472 |
+
}
|
| 1473 |
+
|
| 1474 |
+
.p-6{
|
| 1475 |
+
padding: 1.5rem;
|
| 1476 |
+
}
|
| 1477 |
+
|
| 1478 |
+
.p-8{
|
| 1479 |
+
padding: 2rem;
|
| 1480 |
+
}
|
| 1481 |
+
|
| 1482 |
+
.px-2{
|
| 1483 |
+
padding-left: 0.5rem;
|
| 1484 |
+
padding-right: 0.5rem;
|
| 1485 |
+
}
|
| 1486 |
+
|
| 1487 |
+
.px-3{
|
| 1488 |
+
padding-left: 0.75rem;
|
| 1489 |
+
padding-right: 0.75rem;
|
| 1490 |
+
}
|
| 1491 |
+
|
| 1492 |
+
.px-4{
|
| 1493 |
+
padding-left: 1rem;
|
| 1494 |
+
padding-right: 1rem;
|
| 1495 |
+
}
|
| 1496 |
+
|
| 1497 |
+
.px-6{
|
| 1498 |
+
padding-left: 1.5rem;
|
| 1499 |
+
padding-right: 1.5rem;
|
| 1500 |
+
}
|
| 1501 |
+
|
| 1502 |
+
.px-8{
|
| 1503 |
+
padding-left: 2rem;
|
| 1504 |
+
padding-right: 2rem;
|
| 1505 |
+
}
|
| 1506 |
+
|
| 1507 |
+
.py-1{
|
| 1508 |
+
padding-top: 0.25rem;
|
| 1509 |
+
padding-bottom: 0.25rem;
|
| 1510 |
+
}
|
| 1511 |
+
|
| 1512 |
+
.py-2{
|
| 1513 |
+
padding-top: 0.5rem;
|
| 1514 |
+
padding-bottom: 0.5rem;
|
| 1515 |
+
}
|
| 1516 |
+
|
| 1517 |
+
.py-3{
|
| 1518 |
+
padding-top: 0.75rem;
|
| 1519 |
+
padding-bottom: 0.75rem;
|
| 1520 |
+
}
|
| 1521 |
+
|
| 1522 |
+
.py-4{
|
| 1523 |
+
padding-top: 1rem;
|
| 1524 |
+
padding-bottom: 1rem;
|
| 1525 |
+
}
|
| 1526 |
+
|
| 1527 |
+
.pb-4{
|
| 1528 |
+
padding-bottom: 1rem;
|
| 1529 |
+
}
|
| 1530 |
+
|
| 1531 |
+
.pl-12{
|
| 1532 |
+
padding-left: 3rem;
|
| 1533 |
+
}
|
| 1534 |
+
|
| 1535 |
+
.pl-4{
|
| 1536 |
+
padding-left: 1rem;
|
| 1537 |
+
}
|
| 1538 |
+
|
| 1539 |
+
.pr-4{
|
| 1540 |
+
padding-right: 1rem;
|
| 1541 |
+
}
|
| 1542 |
+
|
| 1543 |
+
.pt-16{
|
| 1544 |
+
padding-top: 4rem;
|
| 1545 |
+
}
|
| 1546 |
+
|
| 1547 |
+
.pt-4{
|
| 1548 |
+
padding-top: 1rem;
|
| 1549 |
+
}
|
| 1550 |
+
|
| 1551 |
+
.text-left{
|
| 1552 |
+
text-align: left;
|
| 1553 |
+
}
|
| 1554 |
+
|
| 1555 |
+
.text-center{
|
| 1556 |
+
text-align: center;
|
| 1557 |
+
}
|
| 1558 |
+
|
| 1559 |
+
.text-2xl{
|
| 1560 |
+
font-size: 1.5rem;
|
| 1561 |
+
line-height: 2rem;
|
| 1562 |
+
}
|
| 1563 |
+
|
| 1564 |
+
.text-3xl{
|
| 1565 |
+
font-size: 1.875rem;
|
| 1566 |
+
line-height: 2.25rem;
|
| 1567 |
+
}
|
| 1568 |
+
|
| 1569 |
+
.text-4xl{
|
| 1570 |
+
font-size: 2.25rem;
|
| 1571 |
+
line-height: 2.5rem;
|
| 1572 |
+
}
|
| 1573 |
+
|
| 1574 |
+
.text-lg{
|
| 1575 |
+
font-size: 1.125rem;
|
| 1576 |
+
line-height: 1.75rem;
|
| 1577 |
+
}
|
| 1578 |
+
|
| 1579 |
+
.text-sm{
|
| 1580 |
+
font-size: 0.875rem;
|
| 1581 |
+
line-height: 1.25rem;
|
| 1582 |
+
}
|
| 1583 |
+
|
| 1584 |
+
.text-xl{
|
| 1585 |
+
font-size: 1.25rem;
|
| 1586 |
+
line-height: 1.75rem;
|
| 1587 |
+
}
|
| 1588 |
+
|
| 1589 |
+
.text-xs{
|
| 1590 |
+
font-size: 0.75rem;
|
| 1591 |
+
line-height: 1rem;
|
| 1592 |
+
}
|
| 1593 |
+
|
| 1594 |
+
.font-bold{
|
| 1595 |
+
font-weight: 700;
|
| 1596 |
+
}
|
| 1597 |
+
|
| 1598 |
+
.font-medium{
|
| 1599 |
+
font-weight: 500;
|
| 1600 |
+
}
|
| 1601 |
+
|
| 1602 |
+
.font-semibold{
|
| 1603 |
+
font-weight: 600;
|
| 1604 |
+
}
|
| 1605 |
+
|
| 1606 |
+
.leading-relaxed{
|
| 1607 |
+
line-height: 1.625;
|
| 1608 |
+
}
|
| 1609 |
+
|
| 1610 |
+
.text-accent{
|
| 1611 |
+
--tw-text-opacity: 1;
|
| 1612 |
+
color: rgb(245 158 11 / var(--tw-text-opacity, 1));
|
| 1613 |
+
}
|
| 1614 |
+
|
| 1615 |
+
.text-accent-100{
|
| 1616 |
+
--tw-text-opacity: 1;
|
| 1617 |
+
color: rgb(254 243 199 / var(--tw-text-opacity, 1));
|
| 1618 |
+
}
|
| 1619 |
+
|
| 1620 |
+
.text-border{
|
| 1621 |
+
color: rgba(148, 163, 184, 0.2);
|
| 1622 |
+
}
|
| 1623 |
+
|
| 1624 |
+
.text-error{
|
| 1625 |
+
--tw-text-opacity: 1;
|
| 1626 |
+
color: rgb(239 68 68 / var(--tw-text-opacity, 1));
|
| 1627 |
+
}
|
| 1628 |
+
|
| 1629 |
+
.text-gray-700{
|
| 1630 |
+
--tw-text-opacity: 1;
|
| 1631 |
+
color: rgb(55 65 81 / var(--tw-text-opacity, 1));
|
| 1632 |
+
}
|
| 1633 |
+
|
| 1634 |
+
.text-primary{
|
| 1635 |
+
--tw-text-opacity: 1;
|
| 1636 |
+
color: rgb(79 70 229 / var(--tw-text-opacity, 1));
|
| 1637 |
+
}
|
| 1638 |
+
|
| 1639 |
+
.text-secondary{
|
| 1640 |
+
--tw-text-opacity: 1;
|
| 1641 |
+
color: rgb(6 182 212 / var(--tw-text-opacity, 1));
|
| 1642 |
+
}
|
| 1643 |
+
|
| 1644 |
+
.text-success{
|
| 1645 |
+
--tw-text-opacity: 1;
|
| 1646 |
+
color: rgb(16 185 129 / var(--tw-text-opacity, 1));
|
| 1647 |
+
}
|
| 1648 |
+
|
| 1649 |
+
.text-success-700{
|
| 1650 |
+
--tw-text-opacity: 1;
|
| 1651 |
+
color: rgb(4 120 87 / var(--tw-text-opacity, 1));
|
| 1652 |
+
}
|
| 1653 |
+
|
| 1654 |
+
.text-text-primary{
|
| 1655 |
+
--tw-text-opacity: 1;
|
| 1656 |
+
color: rgb(248 250 252 / var(--tw-text-opacity, 1));
|
| 1657 |
+
}
|
| 1658 |
+
|
| 1659 |
+
.text-text-secondary{
|
| 1660 |
+
--tw-text-opacity: 1;
|
| 1661 |
+
color: rgb(148 163 184 / var(--tw-text-opacity, 1));
|
| 1662 |
+
}
|
| 1663 |
+
|
| 1664 |
+
.text-warning{
|
| 1665 |
+
--tw-text-opacity: 1;
|
| 1666 |
+
color: rgb(245 158 11 / var(--tw-text-opacity, 1));
|
| 1667 |
+
}
|
| 1668 |
+
|
| 1669 |
+
.text-white{
|
| 1670 |
+
--tw-text-opacity: 1;
|
| 1671 |
+
color: rgb(255 255 255 / var(--tw-text-opacity, 1));
|
| 1672 |
+
}
|
| 1673 |
+
|
| 1674 |
+
.placeholder-text-secondary::-moz-placeholder{
|
| 1675 |
+
--tw-placeholder-opacity: 1;
|
| 1676 |
+
color: rgb(148 163 184 / var(--tw-placeholder-opacity, 1));
|
| 1677 |
+
}
|
| 1678 |
+
|
| 1679 |
+
.placeholder-text-secondary::placeholder{
|
| 1680 |
+
--tw-placeholder-opacity: 1;
|
| 1681 |
+
color: rgb(148 163 184 / var(--tw-placeholder-opacity, 1));
|
| 1682 |
+
}
|
| 1683 |
+
|
| 1684 |
+
.opacity-20{
|
| 1685 |
+
opacity: 0.2;
|
| 1686 |
+
}
|
| 1687 |
+
|
| 1688 |
+
.opacity-50{
|
| 1689 |
+
opacity: 0.5;
|
| 1690 |
+
}
|
| 1691 |
+
|
| 1692 |
+
.opacity-90{
|
| 1693 |
+
opacity: 0.9;
|
| 1694 |
+
}
|
| 1695 |
+
|
| 1696 |
+
.shadow-lg{
|
| 1697 |
+
--tw-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
|
| 1698 |
+
--tw-shadow-colored: 0 10px 15px var(--tw-shadow-color);
|
| 1699 |
+
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
| 1700 |
+
}
|
| 1701 |
+
|
| 1702 |
+
.shadow-md{
|
| 1703 |
+
--tw-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
| 1704 |
+
--tw-shadow-colored: 0 4px 6px var(--tw-shadow-color);
|
| 1705 |
+
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
| 1706 |
+
}
|
| 1707 |
+
|
| 1708 |
+
.ring{
|
| 1709 |
+
--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
|
| 1710 |
+
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
|
| 1711 |
+
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
|
| 1712 |
+
}
|
| 1713 |
+
|
| 1714 |
+
.filter{
|
| 1715 |
+
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
|
| 1716 |
+
}
|
| 1717 |
+
|
| 1718 |
+
.transition{
|
| 1719 |
+
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;
|
| 1720 |
+
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
|
| 1721 |
+
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;
|
| 1722 |
+
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
| 1723 |
+
transition-duration: 150ms;
|
| 1724 |
+
}
|
| 1725 |
+
|
| 1726 |
+
.transition-all{
|
| 1727 |
+
transition-property: all;
|
| 1728 |
+
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
| 1729 |
+
transition-duration: 150ms;
|
| 1730 |
+
}
|
| 1731 |
+
|
| 1732 |
+
.transition-colors{
|
| 1733 |
+
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
|
| 1734 |
+
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
| 1735 |
+
transition-duration: 150ms;
|
| 1736 |
+
}
|
| 1737 |
+
|
| 1738 |
+
.transition-transform{
|
| 1739 |
+
transition-property: transform;
|
| 1740 |
+
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
| 1741 |
+
transition-duration: 150ms;
|
| 1742 |
+
}
|
| 1743 |
+
|
| 1744 |
+
.duration-1000{
|
| 1745 |
+
transition-duration: 1000ms;
|
| 1746 |
+
}
|
| 1747 |
+
|
| 1748 |
+
.duration-200{
|
| 1749 |
+
transition-duration: 200ms;
|
| 1750 |
+
}
|
| 1751 |
+
|
| 1752 |
+
.duration-300{
|
| 1753 |
+
transition-duration: 300ms;
|
| 1754 |
+
}
|
| 1755 |
+
|
| 1756 |
+
.transition-theme{
|
| 1757 |
+
transition: background-color 300ms cubic-bezier(0.4, 0, 0.2, 1), color 300ms cubic-bezier(0.4, 0, 0.2, 1), border-color 300ms cubic-bezier(0.4, 0, 0.2, 1);
|
| 1758 |
+
transition: background-color 300ms cubic-bezier(0.4, 0, 0.2, 1),
|
| 1759 |
+
color 300ms cubic-bezier(0.4, 0, 0.2, 1),
|
| 1760 |
+
border-color 300ms cubic-bezier(0.4, 0, 0.2, 1);
|
| 1761 |
+
}
|
| 1762 |
+
|
| 1763 |
+
:root {
|
| 1764 |
+
/* Primary Colors */
|
| 1765 |
+
--color-primary: #4F46E5;
|
| 1766 |
+
/* indigo-600 */
|
| 1767 |
+
--color-primary-50: #EEF2FF;
|
| 1768 |
+
/* indigo-50 */
|
| 1769 |
+
--color-primary-100: #E0E7FF;
|
| 1770 |
+
/* indigo-100 */
|
| 1771 |
+
--color-primary-500: #6366F1;
|
| 1772 |
+
/* indigo-500 */
|
| 1773 |
+
--color-primary-600: #4F46E5;
|
| 1774 |
+
/* indigo-600 */
|
| 1775 |
+
--color-primary-700: #4338CA;
|
| 1776 |
+
/* indigo-700 */
|
| 1777 |
+
--color-primary-900: #312E81;
|
| 1778 |
+
/* indigo-900 */
|
| 1779 |
+
/* Secondary Colors */
|
| 1780 |
+
--color-secondary: #06B6D4;
|
| 1781 |
+
/* cyan-500 */
|
| 1782 |
+
--color-secondary-50: #ECFEFF;
|
| 1783 |
+
/* cyan-50 */
|
| 1784 |
+
--color-secondary-100: #CFFAFE;
|
| 1785 |
+
/* cyan-100 */
|
| 1786 |
+
--color-secondary-400: #22D3EE;
|
| 1787 |
+
/* cyan-400 */
|
| 1788 |
+
--color-secondary-500: #06B6D4;
|
| 1789 |
+
/* cyan-500 */
|
| 1790 |
+
--color-secondary-600: #0891B2;
|
| 1791 |
+
/* cyan-600 */
|
| 1792 |
+
--color-secondary-700: #0E7490;
|
| 1793 |
+
/* cyan-700 */
|
| 1794 |
+
/* Accent Colors */
|
| 1795 |
+
--color-accent: #F59E0B;
|
| 1796 |
+
/* amber-500 */
|
| 1797 |
+
--color-accent-50: #FFFBEB;
|
| 1798 |
+
/* amber-50 */
|
| 1799 |
+
--color-accent-100: #FEF3C7;
|
| 1800 |
+
/* amber-100 */
|
| 1801 |
+
--color-accent-400: #FBBF24;
|
| 1802 |
+
/* amber-400 */
|
| 1803 |
+
--color-accent-500: #F59E0B;
|
| 1804 |
+
/* amber-500 */
|
| 1805 |
+
--color-accent-600: #D97706;
|
| 1806 |
+
/* amber-600 */
|
| 1807 |
+
--color-accent-700: #B45309;
|
| 1808 |
+
/* amber-700 */
|
| 1809 |
+
/* Background Colors */
|
| 1810 |
+
--color-background: #0F172A;
|
| 1811 |
+
/* slate-900 */
|
| 1812 |
+
--color-background-light: #F8FAFC;
|
| 1813 |
+
/* slate-50 */
|
| 1814 |
+
--color-surface: #1E293B;
|
| 1815 |
+
/* slate-800 */
|
| 1816 |
+
--color-surface-light: #FFFFFF;
|
| 1817 |
+
/* white */
|
| 1818 |
+
--color-surface-hover: #334155;
|
| 1819 |
+
/* slate-700 */
|
| 1820 |
+
/* Text Colors */
|
| 1821 |
+
--color-text-primary: #F8FAFC;
|
| 1822 |
+
/* slate-50 */
|
| 1823 |
+
--color-text-primary-light: #0F172A;
|
| 1824 |
+
/* slate-900 */
|
| 1825 |
+
--color-text-secondary: #94A3B8;
|
| 1826 |
+
/* slate-400 */
|
| 1827 |
+
--color-text-secondary-light: #64748B;
|
| 1828 |
+
/* slate-500 */
|
| 1829 |
+
--color-text-muted: #64748B;
|
| 1830 |
+
/* slate-500 */
|
| 1831 |
+
--color-text-muted-light: #94A3B8;
|
| 1832 |
+
/* slate-400 */
|
| 1833 |
+
/* Status Colors */
|
| 1834 |
+
--color-success: #10B981;
|
| 1835 |
+
/* emerald-500 */
|
| 1836 |
+
--color-success-50: #ECFDF5;
|
| 1837 |
+
/* emerald-50 */
|
| 1838 |
+
--color-success-100: #D1FAE5;
|
| 1839 |
+
/* emerald-100 */
|
| 1840 |
+
--color-success-600: #059669;
|
| 1841 |
+
/* emerald-600 */
|
| 1842 |
+
--color-success-700: #047857;
|
| 1843 |
+
/* emerald-700 */
|
| 1844 |
+
--color-warning: #F59E0B;
|
| 1845 |
+
/* amber-500 */
|
| 1846 |
+
--color-warning-50: #FFFBEB;
|
| 1847 |
+
/* amber-50 */
|
| 1848 |
+
--color-warning-100: #FEF3C7;
|
| 1849 |
+
/* amber-100 */
|
| 1850 |
+
--color-warning-600: #D97706;
|
| 1851 |
+
/* amber-600 */
|
| 1852 |
+
--color-error: #EF4444;
|
| 1853 |
+
/* red-500 */
|
| 1854 |
+
--color-error-50: #FEF2F2;
|
| 1855 |
+
/* red-50 */
|
| 1856 |
+
--color-error-100: #FEE2E2;
|
| 1857 |
+
/* red-100 */
|
| 1858 |
+
--color-error-600: #DC2626;
|
| 1859 |
+
/* red-600 */
|
| 1860 |
+
--color-error-700: #B91C1C;
|
| 1861 |
+
/* red-700 */
|
| 1862 |
+
/* Border Colors */
|
| 1863 |
+
--color-border: rgba(148, 163, 184, 0.2);
|
| 1864 |
+
/* slate-400 with opacity */
|
| 1865 |
+
--color-border-light: rgba(148, 163, 184, 0.3);
|
| 1866 |
+
/* slate-400 with opacity */
|
| 1867 |
+
/* Shadow Colors */
|
| 1868 |
+
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);
|
| 1869 |
+
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
|
| 1870 |
+
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
|
| 1871 |
+
}
|
| 1872 |
+
|
| 1873 |
+
/* Light theme overrides */
|
| 1874 |
+
|
| 1875 |
+
.light {
|
| 1876 |
+
--color-background: #F8FAFC;
|
| 1877 |
+
/* slate-50 */
|
| 1878 |
+
--color-surface: #FFFFFF;
|
| 1879 |
+
/* white */
|
| 1880 |
+
--color-surface-hover: #F1F5F9;
|
| 1881 |
+
/* slate-100 */
|
| 1882 |
+
--color-text-primary: #0F172A;
|
| 1883 |
+
/* slate-900 */
|
| 1884 |
+
--color-text-secondary: #64748B;
|
| 1885 |
+
/* slate-500 */
|
| 1886 |
+
--color-text-muted: #94A3B8;
|
| 1887 |
+
/* slate-400 */
|
| 1888 |
+
--color-border: rgba(148, 163, 184, 0.3);
|
| 1889 |
+
/* slate-400 with opacity */
|
| 1890 |
+
}
|
| 1891 |
+
|
| 1892 |
+
/* Base styles */
|
| 1893 |
+
|
| 1894 |
+
/* Component styles */
|
| 1895 |
+
|
| 1896 |
+
/* Utility classes */
|
| 1897 |
+
|
| 1898 |
+
.last\:border-b-0:last-child{
|
| 1899 |
+
border-bottom-width: 0px;
|
| 1900 |
+
}
|
| 1901 |
+
|
| 1902 |
+
.hover\:scale-105:hover{
|
| 1903 |
+
--tw-scale-x: 1.05;
|
| 1904 |
+
--tw-scale-y: 1.05;
|
| 1905 |
+
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
| 1906 |
+
}
|
| 1907 |
+
|
| 1908 |
+
.hover\:border-accent:hover{
|
| 1909 |
+
--tw-border-opacity: 1;
|
| 1910 |
+
border-color: rgb(245 158 11 / var(--tw-border-opacity, 1));
|
| 1911 |
+
}
|
| 1912 |
+
|
| 1913 |
+
.hover\:border-error:hover{
|
| 1914 |
+
--tw-border-opacity: 1;
|
| 1915 |
+
border-color: rgb(239 68 68 / var(--tw-border-opacity, 1));
|
| 1916 |
+
}
|
| 1917 |
+
|
| 1918 |
+
.hover\:border-primary:hover{
|
| 1919 |
+
--tw-border-opacity: 1;
|
| 1920 |
+
border-color: rgb(79 70 229 / var(--tw-border-opacity, 1));
|
| 1921 |
+
}
|
| 1922 |
+
|
| 1923 |
+
.hover\:border-secondary:hover{
|
| 1924 |
+
--tw-border-opacity: 1;
|
| 1925 |
+
border-color: rgb(6 182 212 / var(--tw-border-opacity, 1));
|
| 1926 |
+
}
|
| 1927 |
+
|
| 1928 |
+
.hover\:border-success:hover{
|
| 1929 |
+
--tw-border-opacity: 1;
|
| 1930 |
+
border-color: rgb(16 185 129 / var(--tw-border-opacity, 1));
|
| 1931 |
+
}
|
| 1932 |
+
|
| 1933 |
+
.hover\:border-white:hover{
|
| 1934 |
+
--tw-border-opacity: 1;
|
| 1935 |
+
border-color: rgb(255 255 255 / var(--tw-border-opacity, 1));
|
| 1936 |
+
}
|
| 1937 |
+
|
| 1938 |
+
.hover\:bg-accent-50:hover{
|
| 1939 |
+
--tw-bg-opacity: 1;
|
| 1940 |
+
background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1));
|
| 1941 |
+
}
|
| 1942 |
+
|
| 1943 |
+
.hover\:bg-blue-700:hover{
|
| 1944 |
+
--tw-bg-opacity: 1;
|
| 1945 |
+
background-color: rgb(29 78 216 / var(--tw-bg-opacity, 1));
|
| 1946 |
+
}
|
| 1947 |
+
|
| 1948 |
+
.hover\:bg-blue-900:hover{
|
| 1949 |
+
--tw-bg-opacity: 1;
|
| 1950 |
+
background-color: rgb(30 58 138 / var(--tw-bg-opacity, 1));
|
| 1951 |
+
}
|
| 1952 |
+
|
| 1953 |
+
.hover\:bg-error:hover{
|
| 1954 |
+
--tw-bg-opacity: 1;
|
| 1955 |
+
background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1));
|
| 1956 |
+
}
|
| 1957 |
+
|
| 1958 |
+
.hover\:bg-error-50:hover{
|
| 1959 |
+
--tw-bg-opacity: 1;
|
| 1960 |
+
background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1));
|
| 1961 |
+
}
|
| 1962 |
+
|
| 1963 |
+
.hover\:bg-gray-400:hover{
|
| 1964 |
+
--tw-bg-opacity: 1;
|
| 1965 |
+
background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1));
|
| 1966 |
+
}
|
| 1967 |
+
|
| 1968 |
+
.hover\:bg-green-700:hover{
|
| 1969 |
+
--tw-bg-opacity: 1;
|
| 1970 |
+
background-color: rgb(21 128 61 / var(--tw-bg-opacity, 1));
|
| 1971 |
+
}
|
| 1972 |
+
|
| 1973 |
+
.hover\:bg-primary-50:hover{
|
| 1974 |
+
--tw-bg-opacity: 1;
|
| 1975 |
+
background-color: rgb(238 242 255 / var(--tw-bg-opacity, 1));
|
| 1976 |
+
}
|
| 1977 |
+
|
| 1978 |
+
.hover\:bg-secondary-50:hover{
|
| 1979 |
+
--tw-bg-opacity: 1;
|
| 1980 |
+
background-color: rgb(236 254 255 / var(--tw-bg-opacity, 1));
|
| 1981 |
+
}
|
| 1982 |
+
|
| 1983 |
+
.hover\:bg-surface-hover:hover{
|
| 1984 |
+
--tw-bg-opacity: 1;
|
| 1985 |
+
background-color: rgb(51 65 85 / var(--tw-bg-opacity, 1));
|
| 1986 |
+
}
|
| 1987 |
+
|
| 1988 |
+
.hover\:bg-warning-50:hover{
|
| 1989 |
+
--tw-bg-opacity: 1;
|
| 1990 |
+
background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1));
|
| 1991 |
+
}
|
| 1992 |
+
|
| 1993 |
+
.hover\:bg-warning-600:hover{
|
| 1994 |
+
--tw-bg-opacity: 1;
|
| 1995 |
+
background-color: rgb(217 119 6 / var(--tw-bg-opacity, 1));
|
| 1996 |
+
}
|
| 1997 |
+
|
| 1998 |
+
.hover\:text-accent-600:hover{
|
| 1999 |
+
--tw-text-opacity: 1;
|
| 2000 |
+
color: rgb(217 119 6 / var(--tw-text-opacity, 1));
|
| 2001 |
+
}
|
| 2002 |
+
|
| 2003 |
+
.hover\:text-error:hover{
|
| 2004 |
+
--tw-text-opacity: 1;
|
| 2005 |
+
color: rgb(239 68 68 / var(--tw-text-opacity, 1));
|
| 2006 |
+
}
|
| 2007 |
+
|
| 2008 |
+
.hover\:text-primary:hover{
|
| 2009 |
+
--tw-text-opacity: 1;
|
| 2010 |
+
color: rgb(79 70 229 / var(--tw-text-opacity, 1));
|
| 2011 |
+
}
|
| 2012 |
+
|
| 2013 |
+
.hover\:text-primary-600:hover{
|
| 2014 |
+
--tw-text-opacity: 1;
|
| 2015 |
+
color: rgb(79 70 229 / var(--tw-text-opacity, 1));
|
| 2016 |
+
}
|
| 2017 |
+
|
| 2018 |
+
.hover\:text-primary-700:hover{
|
| 2019 |
+
--tw-text-opacity: 1;
|
| 2020 |
+
color: rgb(67 56 202 / var(--tw-text-opacity, 1));
|
| 2021 |
+
}
|
| 2022 |
+
|
| 2023 |
+
.hover\:text-secondary-600:hover{
|
| 2024 |
+
--tw-text-opacity: 1;
|
| 2025 |
+
color: rgb(8 145 178 / var(--tw-text-opacity, 1));
|
| 2026 |
+
}
|
| 2027 |
+
|
| 2028 |
+
.hover\:text-success-600:hover{
|
| 2029 |
+
--tw-text-opacity: 1;
|
| 2030 |
+
color: rgb(5 150 105 / var(--tw-text-opacity, 1));
|
| 2031 |
+
}
|
| 2032 |
+
|
| 2033 |
+
.hover\:text-text-primary:hover{
|
| 2034 |
+
--tw-text-opacity: 1;
|
| 2035 |
+
color: rgb(248 250 252 / var(--tw-text-opacity, 1));
|
| 2036 |
+
}
|
| 2037 |
+
|
| 2038 |
+
.hover\:shadow-lg:hover{
|
| 2039 |
+
--tw-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
|
| 2040 |
+
--tw-shadow-colored: 0 10px 15px var(--tw-shadow-color);
|
| 2041 |
+
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
| 2042 |
+
}
|
| 2043 |
+
|
| 2044 |
+
.hover\:shadow-xl:hover{
|
| 2045 |
+
--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
|
| 2046 |
+
--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);
|
| 2047 |
+
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
| 2048 |
+
}
|
| 2049 |
+
|
| 2050 |
+
.focus\:border-transparent:focus{
|
| 2051 |
+
border-color: transparent;
|
| 2052 |
+
}
|
| 2053 |
+
|
| 2054 |
+
.focus\:outline-none:focus{
|
| 2055 |
+
outline: 2px solid transparent;
|
| 2056 |
+
outline-offset: 2px;
|
| 2057 |
+
}
|
| 2058 |
+
|
| 2059 |
+
.focus\:ring-2:focus{
|
| 2060 |
+
--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
|
| 2061 |
+
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
|
| 2062 |
+
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
|
| 2063 |
+
}
|
| 2064 |
+
|
| 2065 |
+
.focus\:ring-primary:focus{
|
| 2066 |
+
--tw-ring-opacity: 1;
|
| 2067 |
+
--tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity, 1));
|
| 2068 |
+
}
|
| 2069 |
+
|
| 2070 |
+
@media (min-width: 640px){
|
| 2071 |
+
.sm\:block{
|
| 2072 |
+
display: block;
|
| 2073 |
+
}
|
| 2074 |
+
|
| 2075 |
+
.sm\:grid-cols-2{
|
| 2076 |
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
| 2077 |
+
}
|
| 2078 |
+
|
| 2079 |
+
.sm\:flex-row{
|
| 2080 |
+
flex-direction: row;
|
| 2081 |
+
}
|
| 2082 |
+
}
|
| 2083 |
+
|
| 2084 |
+
@media (min-width: 768px){
|
| 2085 |
+
.md\:grid-cols-2{
|
| 2086 |
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
| 2087 |
+
}
|
| 2088 |
+
|
| 2089 |
+
.md\:grid-cols-3{
|
| 2090 |
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
| 2091 |
+
}
|
| 2092 |
+
}
|
| 2093 |
+
|
| 2094 |
+
@media (min-width: 1024px){
|
| 2095 |
+
.lg\:z-auto{
|
| 2096 |
+
z-index: auto;
|
| 2097 |
+
}
|
| 2098 |
+
|
| 2099 |
+
.lg\:ml-80{
|
| 2100 |
+
margin-left: 20rem;
|
| 2101 |
+
}
|
| 2102 |
+
|
| 2103 |
+
.lg\:flex{
|
| 2104 |
+
display: flex;
|
| 2105 |
+
}
|
| 2106 |
+
|
| 2107 |
+
.lg\:hidden{
|
| 2108 |
+
display: none;
|
| 2109 |
+
}
|
| 2110 |
+
|
| 2111 |
+
.lg\:flex-none{
|
| 2112 |
+
flex: none;
|
| 2113 |
+
}
|
| 2114 |
+
|
| 2115 |
+
.lg\:-translate-x-full{
|
| 2116 |
+
--tw-translate-x: -100%;
|
| 2117 |
+
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
| 2118 |
+
}
|
| 2119 |
+
|
| 2120 |
+
.lg\:translate-x-0{
|
| 2121 |
+
--tw-translate-x: 0px;
|
| 2122 |
+
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
| 2123 |
+
}
|
| 2124 |
+
|
| 2125 |
+
.lg\:grid-cols-2{
|
| 2126 |
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
| 2127 |
+
}
|
| 2128 |
+
|
| 2129 |
+
.lg\:grid-cols-3{
|
| 2130 |
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
| 2131 |
+
}
|
| 2132 |
+
|
| 2133 |
+
.lg\:p-4{
|
| 2134 |
+
padding: 1rem;
|
| 2135 |
+
}
|
| 2136 |
+
|
| 2137 |
+
.lg\:p-6{
|
| 2138 |
+
padding: 1.5rem;
|
| 2139 |
+
}
|
| 2140 |
+
|
| 2141 |
+
.lg\:p-8{
|
| 2142 |
+
padding: 2rem;
|
| 2143 |
+
}
|
| 2144 |
+
|
| 2145 |
+
.lg\:pt-20{
|
| 2146 |
+
padding-top: 5rem;
|
| 2147 |
+
}
|
| 2148 |
+
|
| 2149 |
+
.lg\:text-2xl{
|
| 2150 |
+
font-size: 1.5rem;
|
| 2151 |
+
line-height: 2rem;
|
| 2152 |
+
}
|
| 2153 |
+
|
| 2154 |
+
.lg\:text-xl{
|
| 2155 |
+
font-size: 1.25rem;
|
| 2156 |
+
line-height: 1.75rem;
|
| 2157 |
+
}
|
| 2158 |
+
}
|
css/tailwind.css
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
|
| 2 |
+
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&display=swap');
|
| 3 |
+
@tailwind base;
|
| 4 |
+
@tailwind components;
|
| 5 |
+
@tailwind utilities;
|
| 6 |
+
|
| 7 |
+
:root {
|
| 8 |
+
/* Primary Colors */
|
| 9 |
+
--color-primary: #4F46E5; /* indigo-600 */
|
| 10 |
+
--color-primary-50: #EEF2FF; /* indigo-50 */
|
| 11 |
+
--color-primary-100: #E0E7FF; /* indigo-100 */
|
| 12 |
+
--color-primary-500: #6366F1; /* indigo-500 */
|
| 13 |
+
--color-primary-600: #4F46E5; /* indigo-600 */
|
| 14 |
+
--color-primary-700: #4338CA; /* indigo-700 */
|
| 15 |
+
--color-primary-900: #312E81; /* indigo-900 */
|
| 16 |
+
|
| 17 |
+
/* Secondary Colors */
|
| 18 |
+
--color-secondary: #06B6D4; /* cyan-500 */
|
| 19 |
+
--color-secondary-50: #ECFEFF; /* cyan-50 */
|
| 20 |
+
--color-secondary-100: #CFFAFE; /* cyan-100 */
|
| 21 |
+
--color-secondary-400: #22D3EE; /* cyan-400 */
|
| 22 |
+
--color-secondary-500: #06B6D4; /* cyan-500 */
|
| 23 |
+
--color-secondary-600: #0891B2; /* cyan-600 */
|
| 24 |
+
--color-secondary-700: #0E7490; /* cyan-700 */
|
| 25 |
+
|
| 26 |
+
/* Accent Colors */
|
| 27 |
+
--color-accent: #F59E0B; /* amber-500 */
|
| 28 |
+
--color-accent-50: #FFFBEB; /* amber-50 */
|
| 29 |
+
--color-accent-100: #FEF3C7; /* amber-100 */
|
| 30 |
+
--color-accent-400: #FBBF24; /* amber-400 */
|
| 31 |
+
--color-accent-500: #F59E0B; /* amber-500 */
|
| 32 |
+
--color-accent-600: #D97706; /* amber-600 */
|
| 33 |
+
--color-accent-700: #B45309; /* amber-700 */
|
| 34 |
+
|
| 35 |
+
/* Background Colors */
|
| 36 |
+
--color-background: #0F172A; /* slate-900 */
|
| 37 |
+
--color-background-light: #F8FAFC; /* slate-50 */
|
| 38 |
+
--color-surface: #1E293B; /* slate-800 */
|
| 39 |
+
--color-surface-light: #FFFFFF; /* white */
|
| 40 |
+
--color-surface-hover: #334155; /* slate-700 */
|
| 41 |
+
|
| 42 |
+
/* Text Colors */
|
| 43 |
+
--color-text-primary: #F8FAFC; /* slate-50 */
|
| 44 |
+
--color-text-primary-light: #0F172A; /* slate-900 */
|
| 45 |
+
--color-text-secondary: #94A3B8; /* slate-400 */
|
| 46 |
+
--color-text-secondary-light: #64748B; /* slate-500 */
|
| 47 |
+
--color-text-muted: #64748B; /* slate-500 */
|
| 48 |
+
--color-text-muted-light: #94A3B8; /* slate-400 */
|
| 49 |
+
|
| 50 |
+
/* Status Colors */
|
| 51 |
+
--color-success: #10B981; /* emerald-500 */
|
| 52 |
+
--color-success-50: #ECFDF5; /* emerald-50 */
|
| 53 |
+
--color-success-100: #D1FAE5; /* emerald-100 */
|
| 54 |
+
--color-success-600: #059669; /* emerald-600 */
|
| 55 |
+
--color-success-700: #047857; /* emerald-700 */
|
| 56 |
+
|
| 57 |
+
--color-warning: #F59E0B; /* amber-500 */
|
| 58 |
+
--color-warning-50: #FFFBEB; /* amber-50 */
|
| 59 |
+
--color-warning-100: #FEF3C7; /* amber-100 */
|
| 60 |
+
--color-warning-600: #D97706; /* amber-600 */
|
| 61 |
+
|
| 62 |
+
--color-error: #EF4444; /* red-500 */
|
| 63 |
+
--color-error-50: #FEF2F2; /* red-50 */
|
| 64 |
+
--color-error-100: #FEE2E2; /* red-100 */
|
| 65 |
+
--color-error-600: #DC2626; /* red-600 */
|
| 66 |
+
--color-error-700: #B91C1C; /* red-700 */
|
| 67 |
+
|
| 68 |
+
/* Border Colors */
|
| 69 |
+
--color-border: rgba(148, 163, 184, 0.2); /* slate-400 with opacity */
|
| 70 |
+
--color-border-light: rgba(148, 163, 184, 0.3); /* slate-400 with opacity */
|
| 71 |
+
|
| 72 |
+
/* Shadow Colors */
|
| 73 |
+
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);
|
| 74 |
+
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
|
| 75 |
+
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
/* Light theme overrides */
|
| 79 |
+
.light {
|
| 80 |
+
--color-background: #F8FAFC; /* slate-50 */
|
| 81 |
+
--color-surface: #FFFFFF; /* white */
|
| 82 |
+
--color-surface-hover: #F1F5F9; /* slate-100 */
|
| 83 |
+
--color-text-primary: #0F172A; /* slate-900 */
|
| 84 |
+
--color-text-secondary: #64748B; /* slate-500 */
|
| 85 |
+
--color-text-muted: #94A3B8; /* slate-400 */
|
| 86 |
+
--color-border: rgba(148, 163, 184, 0.3); /* slate-400 with opacity */
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
/* Base styles */
|
| 90 |
+
@layer base {
|
| 91 |
+
* {
|
| 92 |
+
@apply border-border;
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
body {
|
| 96 |
+
@apply bg-background text-text-primary font-sans;
|
| 97 |
+
transition: background-color 300ms cubic-bezier(0.4, 0, 0.2, 1), color 300ms cubic-bezier(0.4, 0, 0.2, 1);
|
| 98 |
+
}
|
| 99 |
+
|
| 100 |
+
h1, h2, h3, h4, h5, h6 {
|
| 101 |
+
@apply font-inter font-semibold;
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
p, span, div {
|
| 105 |
+
@apply font-inter;
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
/* Reduced motion preferences */
|
| 109 |
+
@media (prefers-reduced-motion: reduce) {
|
| 110 |
+
* {
|
| 111 |
+
animation-duration: 0.01ms !important;
|
| 112 |
+
animation-iteration-count: 1 !important;
|
| 113 |
+
transition-duration: 0.01ms !important;
|
| 114 |
+
}
|
| 115 |
+
}
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
/* Component styles */
|
| 119 |
+
@layer components {
|
| 120 |
+
.card {
|
| 121 |
+
@apply bg-surface border border-border rounded-lg shadow-sm;
|
| 122 |
+
transition: all 150ms ease-out;
|
| 123 |
+
}
|
| 124 |
+
|
| 125 |
+
.card:hover {
|
| 126 |
+
@apply shadow-md;
|
| 127 |
+
transform: translateY(-1px);
|
| 128 |
+
}
|
| 129 |
+
|
| 130 |
+
.btn {
|
| 131 |
+
@apply px-4 py-2 rounded-md font-medium transition-all duration-150 ease-out;
|
| 132 |
+
min-height: 44px;
|
| 133 |
+
min-width: 44px;
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
.btn:hover {
|
| 137 |
+
transform: scale(0.98);
|
| 138 |
+
}
|
| 139 |
+
|
| 140 |
+
.btn-primary {
|
| 141 |
+
@apply bg-primary text-white hover:bg-primary-700;
|
| 142 |
+
}
|
| 143 |
+
|
| 144 |
+
.btn-secondary {
|
| 145 |
+
@apply bg-secondary text-white hover:bg-secondary-600;
|
| 146 |
+
}
|
| 147 |
+
|
| 148 |
+
.btn-accent {
|
| 149 |
+
@apply bg-accent text-white hover:bg-accent-600;
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
.toast {
|
| 153 |
+
@apply bg-surface border border-border rounded-lg shadow-lg p-4;
|
| 154 |
+
animation: slideIn 300ms cubic-bezier(0.4, 0, 0.2, 1);
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
@keyframes slideIn {
|
| 158 |
+
from {
|
| 159 |
+
transform: translateY(-10px);
|
| 160 |
+
opacity: 0;
|
| 161 |
+
}
|
| 162 |
+
to {
|
| 163 |
+
transform: translateY(0);
|
| 164 |
+
opacity: 1;
|
| 165 |
+
}
|
| 166 |
+
}
|
| 167 |
+
|
| 168 |
+
.skeleton {
|
| 169 |
+
@apply bg-surface animate-pulse rounded;
|
| 170 |
+
}
|
| 171 |
+
|
| 172 |
+
.progress-bar {
|
| 173 |
+
@apply bg-surface rounded-full overflow-hidden;
|
| 174 |
+
}
|
| 175 |
+
|
| 176 |
+
.progress-fill {
|
| 177 |
+
@apply bg-primary h-full transition-all duration-300 ease-out;
|
| 178 |
+
}
|
| 179 |
+
}
|
| 180 |
+
|
| 181 |
+
/* Utility classes */
|
| 182 |
+
@layer utilities {
|
| 183 |
+
.text-balance {
|
| 184 |
+
text-wrap: balance;
|
| 185 |
+
}
|
| 186 |
+
|
| 187 |
+
.transition-theme {
|
| 188 |
+
transition: background-color 300ms cubic-bezier(0.4, 0, 0.2, 1),
|
| 189 |
+
color 300ms cubic-bezier(0.4, 0, 0.2, 1),
|
| 190 |
+
border-color 300ms cubic-bezier(0.4, 0, 0.2, 1);
|
| 191 |
+
}
|
| 192 |
+
|
| 193 |
+
.micro-interaction {
|
| 194 |
+
transition: all 150ms ease-out;
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
.micro-interaction:hover {
|
| 198 |
+
transform: scale(0.98);
|
| 199 |
+
}
|
| 200 |
+
|
| 201 |
+
.touch-target {
|
| 202 |
+
min-height: 44px;
|
| 203 |
+
min-width: 44px;
|
| 204 |
+
}
|
| 205 |
+
}
|
index.html
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>Quiz App - Redirecting...</title>
|
| 7 |
+
<link rel="stylesheet" href="css/main.css" />
|
| 8 |
+
<style>
|
| 9 |
+
body {
|
| 10 |
+
display: flex;
|
| 11 |
+
justify-content: center;
|
| 12 |
+
align-items: center;
|
| 13 |
+
height: 100vh;
|
| 14 |
+
margin: 0;
|
| 15 |
+
font-family: Arial, sans-serif;
|
| 16 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 17 |
+
color: white;
|
| 18 |
+
}
|
| 19 |
+
.loading-container {
|
| 20 |
+
text-align: center;
|
| 21 |
+
}
|
| 22 |
+
.spinner {
|
| 23 |
+
border: 4px solid rgba(255, 255, 255, 0.3);
|
| 24 |
+
border-radius: 50%;
|
| 25 |
+
border-top: 4px solid white;
|
| 26 |
+
width: 50px;
|
| 27 |
+
height: 50px;
|
| 28 |
+
animation: spin 1s linear infinite;
|
| 29 |
+
margin: 0 auto 20px;
|
| 30 |
+
}
|
| 31 |
+
@keyframes spin {
|
| 32 |
+
0% { transform: rotate(0deg); }
|
| 33 |
+
100% { transform: rotate(360deg); }
|
| 34 |
+
}
|
| 35 |
+
h1 {
|
| 36 |
+
margin: 0;
|
| 37 |
+
font-size: 24px;
|
| 38 |
+
}
|
| 39 |
+
p {
|
| 40 |
+
margin: 10px 0 0;
|
| 41 |
+
opacity: 0.8;
|
| 42 |
+
}
|
| 43 |
+
</style>
|
| 44 |
+
<script type="module" src="https://static.rocket.new/rocket-web.js?_cfg=https%3A%2F%2Ftriviavers2501back.builtwithrocket.new&_be=https%3A%2F%2Fapplication.rocket.new&_v=0.1.5"></script>
|
| 45 |
+
</head>
|
| 46 |
+
<body>
|
| 47 |
+
<div class="loading-container">
|
| 48 |
+
<div class="spinner"></div>
|
| 49 |
+
<h1>Quiz App</h1>
|
| 50 |
+
<p>Loading your dashboard...</p>
|
| 51 |
+
</div>
|
| 52 |
+
|
| 53 |
+
<script>
|
| 54 |
+
// Redirect to quiz dashboard after a brief loading animation
|
| 55 |
+
setTimeout(function() {
|
| 56 |
+
window.location.href = 'pages/quiz_dashboard.html';
|
| 57 |
+
}, 1500);
|
| 58 |
+
</script>
|
| 59 |
+
</body>
|
| 60 |
+
</html>
|
package-lock.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"name": "triviaverse_quiz",
|
| 3 |
+
"version": "1.0.0",
|
| 4 |
+
"description": "",
|
| 5 |
+
"main": "index.html",
|
| 6 |
+
"dependencies": {
|
| 7 |
+
"@dhiwise/component-tagger": "^1.0.9",
|
| 8 |
+
"@tailwindcss/forms": "^0.5.7",
|
| 9 |
+
"tailwindcss-animate": "^1.0.7",
|
| 10 |
+
"tailwindcss-elevation": "^2.0.0",
|
| 11 |
+
"tailwindcss-fluid-type": "^2.0.7"
|
| 12 |
+
},
|
| 13 |
+
"scripts": {
|
| 14 |
+
"build:css": "npx @dhiwise/component-tagger && npx tailwindcss -i ./css/tailwind.css -o ./css/main.css",
|
| 15 |
+
"watch:css": "npx @dhiwise/component-tagger && npx tailwindcss -i ./css/tailwind.css -o ./css/main.css --watch",
|
| 16 |
+
"dev": "npm run watch:css"
|
| 17 |
+
},
|
| 18 |
+
"author": "",
|
| 19 |
+
"license": "MIT",
|
| 20 |
+
"devDependencies": {
|
| 21 |
+
"tailwindcss": "^3.4.17",
|
| 22 |
+
"@tailwindcss/aspect-ratio": "^0.4.2",
|
| 23 |
+
"@tailwindcss/container-queries": "^0.1.1",
|
| 24 |
+
"@tailwindcss/line-clamp": "^0.1.0",
|
| 25 |
+
"@tailwindcss/typography": "^0.5.16"
|
| 26 |
+
}
|
| 27 |
+
}
|
pages/active_quiz_interface.html
ADDED
|
@@ -0,0 +1,544 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en" class="dark">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>Active Quiz - TriviaVerse Quiz</title>
|
| 7 |
+
<link rel="stylesheet" href="../css/main.css" />
|
| 8 |
+
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet" />
|
| 9 |
+
<script type="module" src="https://static.rocket.new/rocket-web.js?_cfg=https%3A%2F%2Ftriviavers2501back.builtwithrocket.new&_be=https%3A%2F%2Fapplication.rocket.new&_v=0.1.5"></script>
|
| 10 |
+
</head>
|
| 11 |
+
<body class="bg-background text-text-primary transition-theme">
|
| 12 |
+
<!-- Mobile Menu Overlay -->
|
| 13 |
+
<div id="mobileMenuOverlay" class="fixed inset-0 bg-black bg-opacity-50 z-40 hidden lg:hidden"></div>
|
| 14 |
+
|
| 15 |
+
<!-- Minimized Header for Quiz Mode -->
|
| 16 |
+
<header class="bg-surface border-b border-border p-3 lg:p-4 fixed top-0 left-0 right-0 z-30">
|
| 17 |
+
<div class="flex items-center justify-between">
|
| 18 |
+
<!-- Mobile Menu & Logo -->
|
| 19 |
+
<div class="flex items-center space-x-3">
|
| 20 |
+
<button id="mobileMenuBtn" class="lg:hidden text-text-primary hover:text-primary">
|
| 21 |
+
<i class="fas fa-bars text-lg"></i>
|
| 22 |
+
</button>
|
| 23 |
+
<div class="flex items-center space-x-2">
|
| 24 |
+
<div class="w-8 h-8 bg-gradient-to-br from-primary to-secondary rounded-lg flex items-center justify-center">
|
| 25 |
+
<i class="fas fa-brain text-white text-sm"></i>
|
| 26 |
+
</div>
|
| 27 |
+
<span class="text-lg font-bold text-text-primary hidden sm:block">TriviaVerse</span>
|
| 28 |
+
</div>
|
| 29 |
+
</div>
|
| 30 |
+
|
| 31 |
+
<!-- Quiz Progress & Score -->
|
| 32 |
+
<div class="flex items-center space-x-4">
|
| 33 |
+
<!-- Current Score -->
|
| 34 |
+
<div class="text-center">
|
| 35 |
+
<p class="text-xs text-text-secondary">Score</p>
|
| 36 |
+
<p id="currentScore" class="text-lg font-bold text-primary">0</p>
|
| 37 |
+
</div>
|
| 38 |
+
|
| 39 |
+
<!-- Current Streak -->
|
| 40 |
+
<div class="text-center">
|
| 41 |
+
<p class="text-xs text-text-secondary">Streak</p>
|
| 42 |
+
<p id="currentStreak" class="text-lg font-bold text-accent">0</p>
|
| 43 |
+
</div>
|
| 44 |
+
|
| 45 |
+
<!-- Exit Quiz -->
|
| 46 |
+
<button id="exitQuizBtn" class="text-text-secondary hover:text-error transition-colors">
|
| 47 |
+
<i class="fas fa-times text-lg"></i>
|
| 48 |
+
</button>
|
| 49 |
+
</div>
|
| 50 |
+
</div>
|
| 51 |
+
</header>
|
| 52 |
+
|
| 53 |
+
<!-- Sidebar (Hidden in Quiz Mode, Accessible via Menu) -->
|
| 54 |
+
<aside id="sidebar" class="fixed left-0 top-0 h-full w-80 bg-surface border-r border-border transform -translate-x-full lg:-translate-x-full transition-transform duration-300 z-50">
|
| 55 |
+
<div class="p-6 border-b border-border">
|
| 56 |
+
<!-- Logo -->
|
| 57 |
+
<div class="flex items-center space-x-3 mb-6">
|
| 58 |
+
<div class="w-10 h-10 bg-gradient-to-br from-primary to-secondary rounded-lg flex items-center justify-center">
|
| 59 |
+
<i class="fas fa-brain text-white text-lg"></i>
|
| 60 |
+
</div>
|
| 61 |
+
<div>
|
| 62 |
+
<h1 class="text-xl font-bold text-text-primary">TriviaVerse</h1>
|
| 63 |
+
<p class="text-sm text-text-secondary">Quiz Platform</p>
|
| 64 |
+
</div>
|
| 65 |
+
</div>
|
| 66 |
+
|
| 67 |
+
<!-- Close button for mobile -->
|
| 68 |
+
<button id="closeSidebar" class="absolute top-4 right-4 text-text-secondary hover:text-text-primary">
|
| 69 |
+
<i class="fas fa-times text-xl"></i>
|
| 70 |
+
</button>
|
| 71 |
+
</div>
|
| 72 |
+
|
| 73 |
+
<!-- Navigation -->
|
| 74 |
+
<nav class="p-6 space-y-2">
|
| 75 |
+
<a href="quiz_dashboard.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 76 |
+
<i class="fas fa-home"></i>
|
| 77 |
+
<span>Dashboard</span>
|
| 78 |
+
</a>
|
| 79 |
+
<a href="active_quiz_interface.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg bg-primary text-white">
|
| 80 |
+
<i class="fas fa-play-circle"></i>
|
| 81 |
+
<span>Active Quiz</span>
|
| 82 |
+
</a>
|
| 83 |
+
<a href="quiz_results_statistics.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 84 |
+
<i class="fas fa-chart-bar"></i>
|
| 85 |
+
<span>Statistics</span>
|
| 86 |
+
</a>
|
| 87 |
+
<a href="topic_selection_browse.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 88 |
+
<i class="fas fa-book"></i>
|
| 89 |
+
<span>Browse Topics</span>
|
| 90 |
+
</a>
|
| 91 |
+
<a href="settings_preferences.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 92 |
+
<i class="fas fa-cog"></i>
|
| 93 |
+
<span>Settings</span>
|
| 94 |
+
</a>
|
| 95 |
+
</nav>
|
| 96 |
+
</aside>
|
| 97 |
+
|
| 98 |
+
<!-- Main Quiz Content -->
|
| 99 |
+
<main class="pt-16 lg:pt-20 min-h-screen">
|
| 100 |
+
<div class="max-w-4xl mx-auto p-4 lg:p-6">
|
| 101 |
+
<!-- Quiz Progress Bar -->
|
| 102 |
+
<div class="mb-6">
|
| 103 |
+
<div class="flex items-center justify-between mb-2">
|
| 104 |
+
<span class="text-sm text-text-secondary">Question <span id="currentQuestion">1</span> of <span id="totalQuestions">10</span></span>
|
| 105 |
+
<span class="text-sm text-text-secondary">Topic: <span id="currentTopic" class="text-primary font-medium">Python Programming</span></span>
|
| 106 |
+
</div>
|
| 107 |
+
<div class="progress-bar h-3">
|
| 108 |
+
<div id="quizProgress" class="progress-fill" style="width: 10%"></div>
|
| 109 |
+
</div>
|
| 110 |
+
</div>
|
| 111 |
+
|
| 112 |
+
<!-- Timer Section -->
|
| 113 |
+
<div class="card p-4 mb-6 bg-gradient-to-r from-accent-50 to-warning-50 border-accent-200">
|
| 114 |
+
<div class="flex items-center justify-center space-x-4">
|
| 115 |
+
<div class="w-12 h-12 bg-accent rounded-full flex items-center justify-center">
|
| 116 |
+
<i class="fas fa-clock text-white text-lg"></i>
|
| 117 |
+
</div>
|
| 118 |
+
<div class="text-center">
|
| 119 |
+
<p class="text-sm text-text-secondary mb-1">Time Remaining</p>
|
| 120 |
+
<div class="flex items-center space-x-1">
|
| 121 |
+
<span id="timerMinutes" class="text-2xl font-bold text-accent">01</span>
|
| 122 |
+
<span class="text-2xl font-bold text-accent">:</span>
|
| 123 |
+
<span id="timerSeconds" class="text-2xl font-bold text-accent">30</span>
|
| 124 |
+
</div>
|
| 125 |
+
</div>
|
| 126 |
+
<div class="w-16 h-16 relative">
|
| 127 |
+
<svg class="w-16 h-16 transform -rotate-90" viewBox="0 0 64 64">
|
| 128 |
+
<circle cx="32" cy="32" r="28" stroke="currentColor" stroke-width="4" fill="none" class="text-accent-100"/>
|
| 129 |
+
<circle id="timerCircle" cx="32" cy="32" r="28" stroke="currentColor" stroke-width="4" fill="none" class="text-accent transition-all duration-1000" stroke-dasharray="175.93" stroke-dashoffset="0"/>
|
| 130 |
+
</svg>
|
| 131 |
+
</div>
|
| 132 |
+
</div>
|
| 133 |
+
</div>
|
| 134 |
+
|
| 135 |
+
<!-- Question Display Area -->
|
| 136 |
+
<div class="card p-6 lg:p-8 mb-6">
|
| 137 |
+
<div class="text-center mb-6">
|
| 138 |
+
<div class="w-16 h-16 bg-primary-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 139 |
+
<i class="fas fa-question text-primary text-2xl"></i>
|
| 140 |
+
</div>
|
| 141 |
+
<h2 class="text-xl lg:text-2xl font-semibold text-text-primary mb-2">Question</h2>
|
| 142 |
+
</div>
|
| 143 |
+
|
| 144 |
+
<div class="max-w-3xl mx-auto">
|
| 145 |
+
<p id="questionText" class="text-lg lg:text-xl text-text-primary text-center leading-relaxed mb-6">
|
| 146 |
+
Which of the following is the correct way to create a list in Python?
|
| 147 |
+
</p>
|
| 148 |
+
|
| 149 |
+
<!-- Question Image (if applicable) -->
|
| 150 |
+
<div id="questionImage" class="hidden mb-6">
|
| 151 |
+
<img src alt="Question illustration" class="w-full max-w-md mx-auto rounded-lg shadow-md" />
|
| 152 |
+
</div>
|
| 153 |
+
</div>
|
| 154 |
+
</div>
|
| 155 |
+
|
| 156 |
+
<!-- Answer Options -->
|
| 157 |
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-4 mb-6">
|
| 158 |
+
<button class="answer-option card p-4 lg:p-6 text-left hover:border-primary hover:bg-primary-50 transition-all duration-200 transform hover:scale-105" data-answer="A">
|
| 159 |
+
<div class="flex items-center space-x-4">
|
| 160 |
+
<div class="w-10 h-10 bg-primary-100 rounded-full flex items-center justify-center flex-shrink-0">
|
| 161 |
+
<span class="text-primary font-bold">A</span>
|
| 162 |
+
</div>
|
| 163 |
+
<p class="text-text-primary font-medium">list = [1, 2, 3, 4]</p>
|
| 164 |
+
</div>
|
| 165 |
+
</button>
|
| 166 |
+
|
| 167 |
+
<button class="answer-option card p-4 lg:p-6 text-left hover:border-secondary hover:bg-secondary-50 transition-all duration-200 transform hover:scale-105" data-answer="B">
|
| 168 |
+
<div class="flex items-center space-x-4">
|
| 169 |
+
<div class="w-10 h-10 bg-secondary-100 rounded-full flex items-center justify-center flex-shrink-0">
|
| 170 |
+
<span class="text-secondary font-bold">B</span>
|
| 171 |
+
</div>
|
| 172 |
+
<p class="text-text-primary font-medium">list = (1, 2, 3, 4)</p>
|
| 173 |
+
</div>
|
| 174 |
+
</button>
|
| 175 |
+
|
| 176 |
+
<button class="answer-option card p-4 lg:p-6 text-left hover:border-accent hover:bg-accent-50 transition-all duration-200 transform hover:scale-105" data-answer="C">
|
| 177 |
+
<div class="flex items-center space-x-4">
|
| 178 |
+
<div class="w-10 h-10 bg-accent-100 rounded-full flex items-center justify-center flex-shrink-0">
|
| 179 |
+
<span class="text-accent font-bold">C</span>
|
| 180 |
+
</div>
|
| 181 |
+
<p class="text-text-primary font-medium">list = {1, 2, 3, 4}</p>
|
| 182 |
+
</div>
|
| 183 |
+
</button>
|
| 184 |
+
|
| 185 |
+
<button class="answer-option card p-4 lg:p-6 text-left hover:border-error hover:bg-error-50 transition-all duration-200 transform hover:scale-105" data-answer="D">
|
| 186 |
+
<div class="flex items-center space-x-4">
|
| 187 |
+
<div class="w-10 h-10 bg-error-100 rounded-full flex items-center justify-center flex-shrink-0">
|
| 188 |
+
<span class="text-error font-bold">D</span>
|
| 189 |
+
</div>
|
| 190 |
+
<p class="text-text-primary font-medium">list = "1, 2, 3, 4"</p>
|
| 191 |
+
</div>
|
| 192 |
+
</button>
|
| 193 |
+
</div>
|
| 194 |
+
|
| 195 |
+
<!-- Hints Section -->
|
| 196 |
+
<div class="card p-4 mb-6" id="hintsSection">
|
| 197 |
+
<button id="hintsToggle" class="flex items-center justify-between w-full text-left">
|
| 198 |
+
<div class="flex items-center space-x-3">
|
| 199 |
+
<div class="w-8 h-8 bg-warning-100 rounded-full flex items-center justify-center">
|
| 200 |
+
<i class="fas fa-lightbulb text-warning text-sm"></i>
|
| 201 |
+
</div>
|
| 202 |
+
<span class="text-text-primary font-medium">Need a hint?</span>
|
| 203 |
+
<span class="text-xs bg-warning-100 text-warning px-2 py-1 rounded-full">Available: 3</span>
|
| 204 |
+
</div>
|
| 205 |
+
<i class="fas fa-chevron-down text-text-secondary transition-transform duration-200" id="hintsChevron"></i>
|
| 206 |
+
</button>
|
| 207 |
+
|
| 208 |
+
<div id="hintsContent" class="hidden mt-4 pt-4 border-t border-border">
|
| 209 |
+
<div class="space-y-3">
|
| 210 |
+
<div class="p-3 bg-warning-50 rounded-lg border border-warning-200">
|
| 211 |
+
<p class="text-sm text-text-primary">💡 <strong>Hint 1:</strong> Think about the syntax used for creating collections in Python.</p>
|
| 212 |
+
</div>
|
| 213 |
+
<div class="p-3 bg-info-50 rounded-lg border border-info-200 opacity-50">
|
| 214 |
+
<p class="text-sm text-text-secondary">🔒 <strong>Hint 2:</strong> Unlock by using Hint 1</p>
|
| 215 |
+
</div>
|
| 216 |
+
<div class="p-3 bg-success-50 rounded-lg border border-success-200 opacity-50">
|
| 217 |
+
<p class="text-sm text-text-secondary">🔒 <strong>Hint 3:</strong> Unlock by using Hint 2</p>
|
| 218 |
+
</div>
|
| 219 |
+
</div>
|
| 220 |
+
</div>
|
| 221 |
+
</div>
|
| 222 |
+
|
| 223 |
+
<!-- Action Buttons -->
|
| 224 |
+
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
| 225 |
+
<button id="generateQuestionBtn" class="btn btn-secondary px-6 py-3 text-lg">
|
| 226 |
+
<i class="fas fa-sync-alt mr-2"></i>
|
| 227 |
+
Generate New Question
|
| 228 |
+
</button>
|
| 229 |
+
|
| 230 |
+
<button id="nextQuestionBtn" class="btn btn-primary px-8 py-3 text-lg" disabled>
|
| 231 |
+
<i class="fas fa-arrow-right mr-2"></i>
|
| 232 |
+
Next Question
|
| 233 |
+
</button>
|
| 234 |
+
</div>
|
| 235 |
+
|
| 236 |
+
<!-- Answer Feedback Modal -->
|
| 237 |
+
<div id="feedbackModal" class="fixed inset-0 bg-black bg-opacity-50 z-50 hidden flex items-center justify-center p-4">
|
| 238 |
+
<div class="card max-w-md w-full p-6 animate-scale-in">
|
| 239 |
+
<div class="text-center">
|
| 240 |
+
<div id="feedbackIcon" class="w-16 h-16 mx-auto mb-4 rounded-full flex items-center justify-center">
|
| 241 |
+
<i class="text-2xl"></i>
|
| 242 |
+
</div>
|
| 243 |
+
<h3 id="feedbackTitle" class="text-xl font-bold mb-2"></h3>
|
| 244 |
+
<p id="feedbackMessage" class="text-text-secondary mb-4"></p>
|
| 245 |
+
<div id="correctAnswer" class="hidden p-3 bg-success-50 rounded-lg border border-success-200 mb-4">
|
| 246 |
+
<p class="text-sm text-success-700"><strong>Correct Answer:</strong> <span id="correctAnswerText"></span></p>
|
| 247 |
+
</div>
|
| 248 |
+
<button id="continueFeedback" class="btn btn-primary w-full">Continue</button>
|
| 249 |
+
</div>
|
| 250 |
+
</div>
|
| 251 |
+
</div>
|
| 252 |
+
</div>
|
| 253 |
+
</main>
|
| 254 |
+
|
| 255 |
+
<script>
|
| 256 |
+
// Quiz state management
|
| 257 |
+
let quizState = {
|
| 258 |
+
currentQuestion: 1,
|
| 259 |
+
totalQuestions: 10,
|
| 260 |
+
score: 0,
|
| 261 |
+
streak: 0,
|
| 262 |
+
timeRemaining: 90, // seconds
|
| 263 |
+
selectedAnswer: null,
|
| 264 |
+
correctAnswer: 'A',
|
| 265 |
+
hintsUsed: 0,
|
| 266 |
+
maxHints: 3,
|
| 267 |
+
topic: 'Python Programming'
|
| 268 |
+
};
|
| 269 |
+
|
| 270 |
+
// Timer functionality
|
| 271 |
+
let timerInterval;
|
| 272 |
+
|
| 273 |
+
function startTimer() {
|
| 274 |
+
timerInterval = setInterval(() => {
|
| 275 |
+
quizState.timeRemaining--;
|
| 276 |
+
updateTimerDisplay();
|
| 277 |
+
|
| 278 |
+
if (quizState.timeRemaining <= 0) {
|
| 279 |
+
clearInterval(timerInterval);
|
| 280 |
+
handleTimeUp();
|
| 281 |
+
}
|
| 282 |
+
}, 1000);
|
| 283 |
+
}
|
| 284 |
+
|
| 285 |
+
function updateTimerDisplay() {
|
| 286 |
+
const minutes = Math.floor(quizState.timeRemaining / 60);
|
| 287 |
+
const seconds = quizState.timeRemaining % 60;
|
| 288 |
+
|
| 289 |
+
document.getElementById('timerMinutes').textContent = minutes.toString().padStart(2, '0');
|
| 290 |
+
document.getElementById('timerSeconds').textContent = seconds.toString().padStart(2, '0');
|
| 291 |
+
|
| 292 |
+
// Update circular progress
|
| 293 |
+
const totalTime = 90; // Initial time
|
| 294 |
+
const progress = (quizState.timeRemaining / totalTime) * 175.93;
|
| 295 |
+
document.getElementById('timerCircle').style.strokeDashoffset = 175.93 - progress;
|
| 296 |
+
|
| 297 |
+
// Change color based on time remaining
|
| 298 |
+
const timerCircle = document.getElementById('timerCircle');
|
| 299 |
+
if (quizState.timeRemaining <= 10) {
|
| 300 |
+
timerCircle.classList.remove('text-accent');
|
| 301 |
+
timerCircle.classList.add('text-error');
|
| 302 |
+
} else if (quizState.timeRemaining <= 30) {
|
| 303 |
+
timerCircle.classList.remove('text-accent');
|
| 304 |
+
timerCircle.classList.add('text-warning');
|
| 305 |
+
}
|
| 306 |
+
}
|
| 307 |
+
|
| 308 |
+
function handleTimeUp() {
|
| 309 |
+
showFeedback(false, 'Time\'s up!', 'Don\'t worry, keep practicing to improve your speed.');
|
| 310 |
+
}
|
| 311 |
+
|
| 312 |
+
// Mobile menu functionality
|
| 313 |
+
const mobileMenuBtn = document.getElementById('mobileMenuBtn');
|
| 314 |
+
const sidebar = document.getElementById('sidebar');
|
| 315 |
+
const mobileMenuOverlay = document.getElementById('mobileMenuOverlay');
|
| 316 |
+
const closeSidebar = document.getElementById('closeSidebar');
|
| 317 |
+
|
| 318 |
+
mobileMenuBtn.addEventListener('click', () => {
|
| 319 |
+
sidebar.classList.remove('-translate-x-full');
|
| 320 |
+
mobileMenuOverlay.classList.remove('hidden');
|
| 321 |
+
});
|
| 322 |
+
|
| 323 |
+
closeSidebar.addEventListener('click', () => {
|
| 324 |
+
sidebar.classList.add('-translate-x-full');
|
| 325 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 326 |
+
});
|
| 327 |
+
|
| 328 |
+
mobileMenuOverlay.addEventListener('click', () => {
|
| 329 |
+
sidebar.classList.add('-translate-x-full');
|
| 330 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 331 |
+
});
|
| 332 |
+
|
| 333 |
+
// Answer selection functionality
|
| 334 |
+
document.querySelectorAll('.answer-option').forEach(button => {
|
| 335 |
+
button.addEventListener('click', (e) => {
|
| 336 |
+
// Remove previous selections
|
| 337 |
+
document.querySelectorAll('.answer-option').forEach(btn => {
|
| 338 |
+
btn.classList.remove('border-primary', 'bg-primary-50', 'border-secondary', 'bg-secondary-50',
|
| 339 |
+
'border-accent', 'bg-accent-50', 'border-error', 'bg-error-50');
|
| 340 |
+
});
|
| 341 |
+
|
| 342 |
+
// Add selection styling
|
| 343 |
+
const answer = e.currentTarget.dataset.answer;
|
| 344 |
+
quizState.selectedAnswer = answer;
|
| 345 |
+
|
| 346 |
+
// Add selected styling based on option
|
| 347 |
+
if (answer === 'A') {
|
| 348 |
+
e.currentTarget.classList.add('border-primary', 'bg-primary-50');
|
| 349 |
+
} else if (answer === 'B') {
|
| 350 |
+
e.currentTarget.classList.add('border-secondary', 'bg-secondary-50');
|
| 351 |
+
} else if (answer === 'C') {
|
| 352 |
+
e.currentTarget.classList.add('border-accent', 'bg-accent-50');
|
| 353 |
+
} else if (answer === 'D') {
|
| 354 |
+
e.currentTarget.classList.add('border-error', 'bg-error-50');
|
| 355 |
+
}
|
| 356 |
+
|
| 357 |
+
// Enable next button and show feedback
|
| 358 |
+
document.getElementById('nextQuestionBtn').disabled = false;
|
| 359 |
+
document.getElementById('nextQuestionBtn').classList.remove('opacity-50', 'cursor-not-allowed');
|
| 360 |
+
|
| 361 |
+
// Stop timer and show feedback
|
| 362 |
+
clearInterval(timerInterval);
|
| 363 |
+
setTimeout(() => {
|
| 364 |
+
checkAnswer();
|
| 365 |
+
}, 500);
|
| 366 |
+
});
|
| 367 |
+
});
|
| 368 |
+
|
| 369 |
+
function checkAnswer() {
|
| 370 |
+
const isCorrect = quizState.selectedAnswer === quizState.correctAnswer;
|
| 371 |
+
|
| 372 |
+
if (isCorrect) {
|
| 373 |
+
quizState.score += 10;
|
| 374 |
+
quizState.streak++;
|
| 375 |
+
showFeedback(true, 'Correct!', 'Great job! You\'re on a roll.');
|
| 376 |
+
} else {
|
| 377 |
+
quizState.streak = 0;
|
| 378 |
+
showFeedback(false, 'Incorrect', 'Don\'t worry, learning from mistakes makes you stronger!');
|
| 379 |
+
}
|
| 380 |
+
|
| 381 |
+
updateScoreDisplay();
|
| 382 |
+
}
|
| 383 |
+
|
| 384 |
+
function showFeedback(isCorrect, title, message) {
|
| 385 |
+
const modal = document.getElementById('feedbackModal');
|
| 386 |
+
const icon = document.getElementById('feedbackIcon');
|
| 387 |
+
const titleEl = document.getElementById('feedbackTitle');
|
| 388 |
+
const messageEl = document.getElementById('feedbackMessage');
|
| 389 |
+
const correctAnswerEl = document.getElementById('correctAnswer');
|
| 390 |
+
const correctAnswerText = document.getElementById('correctAnswerText');
|
| 391 |
+
|
| 392 |
+
// Set feedback content
|
| 393 |
+
titleEl.textContent = title;
|
| 394 |
+
messageEl.textContent = message;
|
| 395 |
+
|
| 396 |
+
if (isCorrect) {
|
| 397 |
+
icon.className = 'w-16 h-16 mx-auto mb-4 rounded-full flex items-center justify-center bg-success-100';
|
| 398 |
+
icon.innerHTML = '<i class="fas fa-check text-2xl text-success"></i>';
|
| 399 |
+
titleEl.className = 'text-xl font-bold mb-2 text-success';
|
| 400 |
+
correctAnswerEl.classList.add('hidden');
|
| 401 |
+
} else {
|
| 402 |
+
icon.className = 'w-16 h-16 mx-auto mb-4 rounded-full flex items-center justify-center bg-error-100';
|
| 403 |
+
icon.innerHTML = '<i class="fas fa-times text-2xl text-error"></i>';
|
| 404 |
+
titleEl.className = 'text-xl font-bold mb-2 text-error';
|
| 405 |
+
correctAnswerEl.classList.remove('hidden');
|
| 406 |
+
correctAnswerText.textContent = 'A - list = [1, 2, 3, 4]';
|
| 407 |
+
}
|
| 408 |
+
|
| 409 |
+
modal.classList.remove('hidden');
|
| 410 |
+
}
|
| 411 |
+
|
| 412 |
+
function updateScoreDisplay() {
|
| 413 |
+
document.getElementById('currentScore').textContent = quizState.score;
|
| 414 |
+
document.getElementById('currentStreak').textContent = quizState.streak;
|
| 415 |
+
}
|
| 416 |
+
|
| 417 |
+
// Hints functionality
|
| 418 |
+
const hintsToggle = document.getElementById('hintsToggle');
|
| 419 |
+
const hintsContent = document.getElementById('hintsContent');
|
| 420 |
+
const hintsChevron = document.getElementById('hintsChevron');
|
| 421 |
+
|
| 422 |
+
hintsToggle.addEventListener('click', () => {
|
| 423 |
+
hintsContent.classList.toggle('hidden');
|
| 424 |
+
hintsChevron.classList.toggle('rotate-180');
|
| 425 |
+
});
|
| 426 |
+
|
| 427 |
+
// Continue feedback
|
| 428 |
+
document.getElementById('continueFeedback').addEventListener('click', () => {
|
| 429 |
+
document.getElementById('feedbackModal').classList.add('hidden');
|
| 430 |
+
});
|
| 431 |
+
|
| 432 |
+
// Next question functionality
|
| 433 |
+
document.getElementById('nextQuestionBtn').addEventListener('click', () => {
|
| 434 |
+
if (quizState.currentQuestion < quizState.totalQuestions) {
|
| 435 |
+
nextQuestion();
|
| 436 |
+
} else {
|
| 437 |
+
finishQuiz();
|
| 438 |
+
}
|
| 439 |
+
});
|
| 440 |
+
|
| 441 |
+
function nextQuestion() {
|
| 442 |
+
quizState.currentQuestion++;
|
| 443 |
+
quizState.timeRemaining = 90;
|
| 444 |
+
quizState.selectedAnswer = null;
|
| 445 |
+
|
| 446 |
+
// Update progress
|
| 447 |
+
const progress = (quizState.currentQuestion / quizState.totalQuestions) * 100;
|
| 448 |
+
document.getElementById('quizProgress').style.width = progress + '%';
|
| 449 |
+
document.getElementById('currentQuestion').textContent = quizState.currentQuestion;
|
| 450 |
+
|
| 451 |
+
// Reset answer options
|
| 452 |
+
document.querySelectorAll('.answer-option').forEach(btn => {
|
| 453 |
+
btn.classList.remove('border-primary', 'bg-primary-50', 'border-secondary', 'bg-secondary-50',
|
| 454 |
+
'border-accent', 'bg-accent-50', 'border-error', 'bg-error-50');
|
| 455 |
+
});
|
| 456 |
+
|
| 457 |
+
// Disable next button
|
| 458 |
+
document.getElementById('nextQuestionBtn').disabled = true;
|
| 459 |
+
document.getElementById('nextQuestionBtn').classList.add('opacity-50', 'cursor-not-allowed');
|
| 460 |
+
|
| 461 |
+
// Start new timer
|
| 462 |
+
startTimer();
|
| 463 |
+
|
| 464 |
+
// Load new question (mock)
|
| 465 |
+
loadNewQuestion();
|
| 466 |
+
}
|
| 467 |
+
|
| 468 |
+
function loadNewQuestion() {
|
| 469 |
+
const questions = [
|
| 470 |
+
{
|
| 471 |
+
text: "Which Python keyword is used to create a function?",
|
| 472 |
+
options: ["def", "function", "create", "make"],
|
| 473 |
+
correct: "A"
|
| 474 |
+
},
|
| 475 |
+
{
|
| 476 |
+
text: "What is the output of print(type([]))?",
|
| 477 |
+
options: ["<class 'array'>", "<class 'list'>", "<class 'tuple'>", "<class 'dict'>"],
|
| 478 |
+
correct: "B"
|
| 479 |
+
},
|
| 480 |
+
{
|
| 481 |
+
text: "Which operator is used for exponentiation in Python?",
|
| 482 |
+
options: ["^", "**", "exp", "pow"],
|
| 483 |
+
correct: "B"
|
| 484 |
+
}
|
| 485 |
+
];
|
| 486 |
+
|
| 487 |
+
const randomQuestion = questions[Math.floor(Math.random() * questions.length)];
|
| 488 |
+
document.getElementById('questionText').textContent = randomQuestion.text;
|
| 489 |
+
|
| 490 |
+
const options = document.querySelectorAll('.answer-option p');
|
| 491 |
+
options.forEach((option, index) => {
|
| 492 |
+
option.textContent = randomQuestion.options[index];
|
| 493 |
+
});
|
| 494 |
+
|
| 495 |
+
quizState.correctAnswer = randomQuestion.correct;
|
| 496 |
+
}
|
| 497 |
+
|
| 498 |
+
// Generate new question
|
| 499 |
+
document.getElementById('generateQuestionBtn').addEventListener('click', () => {
|
| 500 |
+
loadNewQuestion();
|
| 501 |
+
// Reset timer
|
| 502 |
+
clearInterval(timerInterval);
|
| 503 |
+
quizState.timeRemaining = 90;
|
| 504 |
+
updateTimerDisplay();
|
| 505 |
+
startTimer();
|
| 506 |
+
});
|
| 507 |
+
|
| 508 |
+
function finishQuiz() {
|
| 509 |
+
localStorage.setItem('quizResults', JSON.stringify({
|
| 510 |
+
score: quizState.score,
|
| 511 |
+
totalQuestions: quizState.totalQuestions,
|
| 512 |
+
topic: quizState.topic,
|
| 513 |
+
date: new Date().toISOString()
|
| 514 |
+
}));
|
| 515 |
+
window.location.href = 'quiz_results_statistics.html';
|
| 516 |
+
}
|
| 517 |
+
|
| 518 |
+
// Exit quiz
|
| 519 |
+
document.getElementById('exitQuizBtn').addEventListener('click', () => {
|
| 520 |
+
if (confirm('Are you sure you want to exit the quiz? Your progress will be lost.')) {
|
| 521 |
+
window.location.href = 'quiz_dashboard.html';
|
| 522 |
+
}
|
| 523 |
+
});
|
| 524 |
+
|
| 525 |
+
// Initialize quiz
|
| 526 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 527 |
+
// Load saved topic
|
| 528 |
+
const savedTopic = localStorage.getItem('selectedTopic');
|
| 529 |
+
if (savedTopic) {
|
| 530 |
+
quizState.topic = savedTopic;
|
| 531 |
+
document.getElementById('currentTopic').textContent = savedTopic;
|
| 532 |
+
}
|
| 533 |
+
|
| 534 |
+
// Start timer
|
| 535 |
+
startTimer();
|
| 536 |
+
updateScoreDisplay();
|
| 537 |
+
|
| 538 |
+
// Set initial button state
|
| 539 |
+
document.getElementById('nextQuestionBtn').disabled = true;
|
| 540 |
+
document.getElementById('nextQuestionBtn').classList.add('opacity-50', 'cursor-not-allowed');
|
| 541 |
+
});
|
| 542 |
+
</script>
|
| 543 |
+
</body>
|
| 544 |
+
</html>
|
pages/fact_game_challenge.html
ADDED
|
@@ -0,0 +1,936 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en" class="dark">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>Fact Game Challenge - TriviaVerse Quiz</title>
|
| 7 |
+
<link rel="stylesheet" href="../css/main.css" />
|
| 8 |
+
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet" />
|
| 9 |
+
<style>
|
| 10 |
+
.fact-card {
|
| 11 |
+
min-height: 200px;
|
| 12 |
+
transition: all 0.3s ease;
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
+
.fact-card.shake {
|
| 16 |
+
animation: shake 0.5s ease-in-out;
|
| 17 |
+
}
|
| 18 |
+
|
| 19 |
+
@keyframes shake {
|
| 20 |
+
0%, 20%, 40%, 60%, 80% { transform: translateX(0); }
|
| 21 |
+
10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); }
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
.timer-circle {
|
| 25 |
+
position: relative;
|
| 26 |
+
width: 60px;
|
| 27 |
+
height: 60px;
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
.timer-circle svg {
|
| 31 |
+
width: 100%;
|
| 32 |
+
height: 100%;
|
| 33 |
+
transform: rotate(-90deg);
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
.timer-circle circle {
|
| 37 |
+
fill: none;
|
| 38 |
+
stroke-width: 4;
|
| 39 |
+
stroke-linecap: round;
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
.timer-bg {
|
| 43 |
+
stroke: rgba(148, 163, 184, 0.2);
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
.timer-progress {
|
| 47 |
+
stroke: #F59E0B;
|
| 48 |
+
stroke-dasharray: 188.5;
|
| 49 |
+
stroke-dashoffset: 0;
|
| 50 |
+
transition: stroke-dashoffset 0.1s linear;
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
.timer-progress.warning {
|
| 54 |
+
stroke: #EF4444;
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
.choice-btn {
|
| 58 |
+
transition: all 0.2s ease;
|
| 59 |
+
position: relative;
|
| 60 |
+
overflow: hidden;
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
.choice-btn:hover {
|
| 64 |
+
transform: translateY(-2px);
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
.choice-btn.correct {
|
| 68 |
+
animation: correctPulse 0.6s ease;
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
+
.choice-btn.incorrect {
|
| 72 |
+
animation: incorrectShake 0.6s ease;
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
@keyframes correctPulse {
|
| 76 |
+
0% { transform: scale(1); background-color: #10B981; }
|
| 77 |
+
50% { transform: scale(1.05); background-color: #059669; }
|
| 78 |
+
100% { transform: scale(1); background-color: #10B981; }
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
@keyframes incorrectShake {
|
| 82 |
+
0%, 20%, 40%, 60%, 80% { transform: translateX(0); background-color: #EF4444; }
|
| 83 |
+
10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); background-color: #DC2626; }
|
| 84 |
+
}
|
| 85 |
+
|
| 86 |
+
.streak-counter {
|
| 87 |
+
background: linear-gradient(45deg, #F59E0B, #EF4444);
|
| 88 |
+
-webkit-background-clip: text;
|
| 89 |
+
-webkit-text-fill-color: transparent;
|
| 90 |
+
background-clip: text;
|
| 91 |
+
font-weight: bold;
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
.fact-reveal {
|
| 95 |
+
max-height: 0;
|
| 96 |
+
overflow: hidden;
|
| 97 |
+
transition: max-height 0.3s ease-out;
|
| 98 |
+
}
|
| 99 |
+
|
| 100 |
+
.fact-reveal.show {
|
| 101 |
+
max-height: 200px;
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
.achievement-badge {
|
| 105 |
+
animation: bounceIn 0.6s ease;
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
@keyframes bounceIn {
|
| 109 |
+
0% { transform: scale(0); opacity: 0; }
|
| 110 |
+
50% { transform: scale(1.2); opacity: 1; }
|
| 111 |
+
100% { transform: scale(1); opacity: 1; }
|
| 112 |
+
}
|
| 113 |
+
|
| 114 |
+
.rapid-fire-indicator {
|
| 115 |
+
animation: pulse 1s infinite;
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
@keyframes pulse {
|
| 119 |
+
0%, 100% { opacity: 1; }
|
| 120 |
+
50% { opacity: 0.7; }
|
| 121 |
+
}
|
| 122 |
+
</style>
|
| 123 |
+
<script type="module" src="https://static.rocket.new/rocket-web.js?_cfg=https%3A%2F%2Ftriviavers2501back.builtwithrocket.new&_be=https%3A%2F%2Fapplication.rocket.new&_v=0.1.5"></script>
|
| 124 |
+
</head>
|
| 125 |
+
<body class="bg-background text-text-primary transition-theme">
|
| 126 |
+
<!-- Mobile Menu Overlay -->
|
| 127 |
+
<div id="mobileMenuOverlay" class="fixed inset-0 bg-black bg-opacity-50 z-40 hidden lg:hidden"></div>
|
| 128 |
+
|
| 129 |
+
<!-- Sidebar -->
|
| 130 |
+
<aside id="sidebar" class="fixed left-0 top-0 h-full w-80 bg-surface border-r border-border transform -translate-x-full lg:translate-x-0 transition-transform duration-300 z-50 lg:z-auto">
|
| 131 |
+
<div class="p-6 border-b border-border">
|
| 132 |
+
<!-- Logo -->
|
| 133 |
+
<div class="flex items-center space-x-3 mb-6">
|
| 134 |
+
<div class="w-10 h-10 bg-gradient-to-br from-primary to-secondary rounded-lg flex items-center justify-center">
|
| 135 |
+
<i class="fas fa-brain text-white text-lg"></i>
|
| 136 |
+
</div>
|
| 137 |
+
<div>
|
| 138 |
+
<h1 class="text-xl font-bold text-text-primary">TriviaVerse</h1>
|
| 139 |
+
<p class="text-sm text-text-secondary">Quiz Platform</p>
|
| 140 |
+
</div>
|
| 141 |
+
</div>
|
| 142 |
+
|
| 143 |
+
<!-- Close button for mobile -->
|
| 144 |
+
<button id="closeSidebar" class="absolute top-4 right-4 lg:hidden text-text-secondary hover:text-text-primary">
|
| 145 |
+
<i class="fas fa-times text-xl"></i>
|
| 146 |
+
</button>
|
| 147 |
+
</div>
|
| 148 |
+
|
| 149 |
+
<!-- Navigation -->
|
| 150 |
+
<nav class="p-6 space-y-2">
|
| 151 |
+
<a href="quiz_dashboard.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 152 |
+
<i class="fas fa-home"></i>
|
| 153 |
+
<span>Dashboard</span>
|
| 154 |
+
</a>
|
| 155 |
+
<a href="active_quiz_interface.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 156 |
+
<i class="fas fa-play-circle"></i>
|
| 157 |
+
<span>Active Quiz</span>
|
| 158 |
+
</a>
|
| 159 |
+
<a href="flashcards_learning_interface.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 160 |
+
<i class="fas fa-layer-group"></i>
|
| 161 |
+
<span>Flashcards</span>
|
| 162 |
+
</a>
|
| 163 |
+
<a href="fact_game_challenge.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg bg-primary text-white">
|
| 164 |
+
<i class="fas fa-gamepad"></i>
|
| 165 |
+
<span>Fact Game</span>
|
| 166 |
+
</a>
|
| 167 |
+
<a href="quiz_results_statistics.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 168 |
+
<i class="fas fa-chart-bar"></i>
|
| 169 |
+
<span>Statistics</span>
|
| 170 |
+
</a>
|
| 171 |
+
<a href="topic_selection_browse.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 172 |
+
<i class="fas fa-book"></i>
|
| 173 |
+
<span>Browse Topics</span>
|
| 174 |
+
</a>
|
| 175 |
+
<a href="settings_preferences.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 176 |
+
<i class="fas fa-cog"></i>
|
| 177 |
+
<span>Settings</span>
|
| 178 |
+
</a>
|
| 179 |
+
</nav>
|
| 180 |
+
|
| 181 |
+
<!-- Game Settings -->
|
| 182 |
+
<div class="p-6 border-t border-border">
|
| 183 |
+
<h3 class="text-sm font-semibold text-text-primary mb-4">Game Settings</h3>
|
| 184 |
+
|
| 185 |
+
<!-- Language Switcher -->
|
| 186 |
+
<div class="mb-4">
|
| 187 |
+
<label class="block text-sm text-text-secondary mb-2">Language</label>
|
| 188 |
+
<select id="languageSelect" class="w-full bg-background border border-border rounded-lg px-3 py-2 text-text-primary focus:outline-none focus:ring-2 focus:ring-primary">
|
| 189 |
+
<option value="en">English</option>
|
| 190 |
+
<option value="te">తెలుగు (Telugu)</option>
|
| 191 |
+
<option value="hi">हिंदी (Hindi)</option>
|
| 192 |
+
<option value="kn">ಕನ್ನಡ (Kannada)</option>
|
| 193 |
+
</select>
|
| 194 |
+
</div>
|
| 195 |
+
|
| 196 |
+
<!-- Rapid Fire Toggle -->
|
| 197 |
+
<div class="flex items-center justify-between mb-4">
|
| 198 |
+
<span class="text-sm text-text-secondary">Rapid Fire Mode</span>
|
| 199 |
+
<button id="rapidFireToggle" class="relative inline-flex h-6 w-11 items-center rounded-full bg-gray-300 transition-colors">
|
| 200 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-1"></span>
|
| 201 |
+
</button>
|
| 202 |
+
</div>
|
| 203 |
+
|
| 204 |
+
<!-- Theme Toggle -->
|
| 205 |
+
<div class="flex items-center justify-between">
|
| 206 |
+
<span class="text-sm text-text-secondary">Dark Theme</span>
|
| 207 |
+
<button id="themeToggle" class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 208 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 209 |
+
</button>
|
| 210 |
+
</div>
|
| 211 |
+
</div>
|
| 212 |
+
</aside>
|
| 213 |
+
|
| 214 |
+
<!-- Main Content -->
|
| 215 |
+
<main class="lg:ml-80 min-h-screen">
|
| 216 |
+
<!-- Header -->
|
| 217 |
+
<header class="bg-surface border-b border-border p-4 lg:p-6">
|
| 218 |
+
<div class="flex items-center justify-between">
|
| 219 |
+
<!-- Mobile Menu Button -->
|
| 220 |
+
<button id="mobileMenuBtn" class="lg:hidden text-text-primary hover:text-primary">
|
| 221 |
+
<i class="fas fa-bars text-xl"></i>
|
| 222 |
+
</button>
|
| 223 |
+
|
| 224 |
+
<!-- Title -->
|
| 225 |
+
<div class="flex-1 lg:flex-none">
|
| 226 |
+
<h2 class="text-2xl font-bold text-text-primary">Fact Game Challenge</h2>
|
| 227 |
+
<p class="text-text-secondary mt-1">Test your knowledge with rapid-fire facts</p>
|
| 228 |
+
</div>
|
| 229 |
+
|
| 230 |
+
<!-- Game Stats -->
|
| 231 |
+
<div class="hidden lg:flex items-center space-x-6">
|
| 232 |
+
<!-- Timer -->
|
| 233 |
+
<div class="timer-circle">
|
| 234 |
+
<svg>
|
| 235 |
+
<circle class="timer-bg" cx="30" cy="30" r="26"/>
|
| 236 |
+
<circle class="timer-progress" cx="30" cy="30" r="26" style="stroke-dashoffset: 0;"/>
|
| 237 |
+
</svg>
|
| 238 |
+
<div class="absolute inset-0 flex items-center justify-center">
|
| 239 |
+
<span class="text-sm font-bold text-accent" id="timerText">15</span>
|
| 240 |
+
</div>
|
| 241 |
+
</div>
|
| 242 |
+
|
| 243 |
+
<!-- Streak -->
|
| 244 |
+
<div class="text-center">
|
| 245 |
+
<p class="text-sm font-medium text-text-primary">Streak</p>
|
| 246 |
+
<p class="text-2xl font-bold streak-counter" id="streakCounter">0</p>
|
| 247 |
+
</div>
|
| 248 |
+
</div>
|
| 249 |
+
</div>
|
| 250 |
+
</header>
|
| 251 |
+
|
| 252 |
+
<!-- Game Interface -->
|
| 253 |
+
<div class="p-4 lg:p-6 max-w-4xl mx-auto">
|
| 254 |
+
<!-- Game Stats Mobile -->
|
| 255 |
+
<div class="lg:hidden grid grid-cols-3 gap-4 mb-6">
|
| 256 |
+
<div class="card p-4 text-center">
|
| 257 |
+
<p class="text-text-secondary text-sm">Score</p>
|
| 258 |
+
<p class="text-xl font-bold text-primary" id="scoreDisplay">0</p>
|
| 259 |
+
</div>
|
| 260 |
+
<div class="card p-4 text-center">
|
| 261 |
+
<p class="text-text-secondary text-sm">Streak</p>
|
| 262 |
+
<p class="text-xl font-bold streak-counter" id="streakDisplayMobile">0</p>
|
| 263 |
+
</div>
|
| 264 |
+
<div class="card p-4 text-center">
|
| 265 |
+
<p class="text-text-secondary text-sm">Time</p>
|
| 266 |
+
<p class="text-xl font-bold text-accent" id="timerDisplayMobile">15</p>
|
| 267 |
+
</div>
|
| 268 |
+
</div>
|
| 269 |
+
|
| 270 |
+
<!-- Game Progress -->
|
| 271 |
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
|
| 272 |
+
<div class="card p-4">
|
| 273 |
+
<div class="flex items-center justify-between">
|
| 274 |
+
<div>
|
| 275 |
+
<p class="text-text-secondary text-sm">Total Score</p>
|
| 276 |
+
<p class="text-2xl font-bold text-primary" id="totalScore">0</p>
|
| 277 |
+
</div>
|
| 278 |
+
<div class="w-10 h-10 bg-primary-100 rounded-lg flex items-center justify-center">
|
| 279 |
+
<i class="fas fa-star text-primary"></i>
|
| 280 |
+
</div>
|
| 281 |
+
</div>
|
| 282 |
+
</div>
|
| 283 |
+
|
| 284 |
+
<div class="card p-4">
|
| 285 |
+
<div class="flex items-center justify-between">
|
| 286 |
+
<div>
|
| 287 |
+
<p class="text-text-secondary text-sm">Best Streak</p>
|
| 288 |
+
<p class="text-2xl font-bold text-accent" id="bestStreak">0</p>
|
| 289 |
+
</div>
|
| 290 |
+
<div class="w-10 h-10 bg-accent-100 rounded-lg flex items-center justify-center">
|
| 291 |
+
<i class="fas fa-fire text-accent"></i>
|
| 292 |
+
</div>
|
| 293 |
+
</div>
|
| 294 |
+
</div>
|
| 295 |
+
|
| 296 |
+
<div class="card p-4">
|
| 297 |
+
<div class="flex items-center justify-between">
|
| 298 |
+
<div>
|
| 299 |
+
<p class="text-text-secondary text-sm">Accuracy</p>
|
| 300 |
+
<p class="text-2xl font-bold text-success" id="accuracy">100%</p>
|
| 301 |
+
</div>
|
| 302 |
+
<div class="w-10 h-10 bg-success-100 rounded-lg flex items-center justify-center">
|
| 303 |
+
<i class="fas fa-bullseye text-success"></i>
|
| 304 |
+
</div>
|
| 305 |
+
</div>
|
| 306 |
+
</div>
|
| 307 |
+
</div>
|
| 308 |
+
|
| 309 |
+
<!-- Fact Card -->
|
| 310 |
+
<div class="card p-8 mb-6 fact-card" id="factCard">
|
| 311 |
+
<div class="text-center">
|
| 312 |
+
<!-- Topic Badge -->
|
| 313 |
+
<span class="inline-block bg-secondary-100 text-secondary text-sm px-3 py-1 rounded-full mb-4" id="topicBadge">
|
| 314 |
+
General Knowledge
|
| 315 |
+
</span>
|
| 316 |
+
|
| 317 |
+
<!-- Fact Statement -->
|
| 318 |
+
<h3 class="text-xl lg:text-2xl font-semibold text-text-primary mb-6 leading-relaxed" id="factStatement">
|
| 319 |
+
The Great Wall of China is visible from space with the naked eye.
|
| 320 |
+
</h3>
|
| 321 |
+
|
| 322 |
+
<!-- Game Mode Indicator -->
|
| 323 |
+
<div class="mb-6">
|
| 324 |
+
<div id="normalModeIndicator" class="flex items-center justify-center space-x-2">
|
| 325 |
+
<i class="fas fa-clock text-text-secondary"></i>
|
| 326 |
+
<span class="text-text-secondary text-sm">Take your time to think</span>
|
| 327 |
+
</div>
|
| 328 |
+
<div id="rapidFireIndicator" class="hidden items-center justify-center space-x-2 rapid-fire-indicator">
|
| 329 |
+
<i class="fas fa-bolt text-accent"></i>
|
| 330 |
+
<span class="text-accent text-sm font-semibold">RAPID FIRE MODE ACTIVE!</span>
|
| 331 |
+
</div>
|
| 332 |
+
</div>
|
| 333 |
+
|
| 334 |
+
<!-- True/False Choices -->
|
| 335 |
+
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4 mb-6" id="choiceButtons">
|
| 336 |
+
<button class="choice-btn btn bg-success text-white py-4 px-8 rounded-xl text-lg font-semibold hover:bg-green-700" data-choice="true">
|
| 337 |
+
<i class="fas fa-check mr-3"></i>
|
| 338 |
+
TRUE
|
| 339 |
+
</button>
|
| 340 |
+
<button class="choice-btn btn bg-error text-white py-4 px-8 rounded-xl text-lg font-semibold" data-choice="false">
|
| 341 |
+
<i class="fas fa-times mr-3"></i>
|
| 342 |
+
FALSE
|
| 343 |
+
</button>
|
| 344 |
+
</div>
|
| 345 |
+
|
| 346 |
+
<!-- Fact Revelation -->
|
| 347 |
+
<div class="fact-reveal" id="factReveal">
|
| 348 |
+
<div class="border-t border-border pt-4 mt-4">
|
| 349 |
+
<div class="text-left space-y-3">
|
| 350 |
+
<div class="flex items-start space-x-3">
|
| 351 |
+
<div class="w-8 h-8 bg-primary-100 rounded-full flex items-center justify-center flex-shrink-0 mt-1">
|
| 352 |
+
<i class="fas fa-lightbulb text-primary text-sm"></i>
|
| 353 |
+
</div>
|
| 354 |
+
<div>
|
| 355 |
+
<h4 class="font-semibold text-text-primary mb-2">Did You Know?</h4>
|
| 356 |
+
<p class="text-text-secondary leading-relaxed" id="factExplanation">
|
| 357 |
+
This is actually FALSE! The Great Wall of China is not visible from space with the naked eye.
|
| 358 |
+
This is a common misconception. While the wall is massive, it's only about 6 meters wide on average,
|
| 359 |
+
making it impossible to see from the Moon or even low Earth orbit without aid.
|
| 360 |
+
</p>
|
| 361 |
+
</div>
|
| 362 |
+
</div>
|
| 363 |
+
|
| 364 |
+
<!-- Social Share -->
|
| 365 |
+
<div class="mt-4 pt-4 border-t border-border">
|
| 366 |
+
<p class="text-sm text-text-secondary mb-3">Found this fact interesting?</p>
|
| 367 |
+
<div class="flex space-x-2">
|
| 368 |
+
<button class="btn bg-blue-600 text-white px-4 py-2 rounded-lg text-sm hover:bg-blue-700">
|
| 369 |
+
<i class="fab fa-twitter mr-2"></i>Share
|
| 370 |
+
</button>
|
| 371 |
+
<button class="btn bg-blue-800 text-white px-4 py-2 rounded-lg text-sm hover:bg-blue-900">
|
| 372 |
+
<i class="fab fa-facebook mr-2"></i>Share
|
| 373 |
+
</button>
|
| 374 |
+
<button id="bookmarkFact" class="btn bg-accent-100 text-accent px-4 py-2 rounded-lg text-sm hover:bg-accent-50">
|
| 375 |
+
<i class="far fa-bookmark mr-2"></i>Save
|
| 376 |
+
</button>
|
| 377 |
+
</div>
|
| 378 |
+
</div>
|
| 379 |
+
</div>
|
| 380 |
+
</div>
|
| 381 |
+
</div>
|
| 382 |
+
</div>
|
| 383 |
+
</div>
|
| 384 |
+
|
| 385 |
+
<!-- Next Question Button -->
|
| 386 |
+
<div class="text-center mb-6">
|
| 387 |
+
<button id="nextQuestionBtn" class="btn btn-primary px-8 py-4 rounded-xl text-lg font-semibold hidden">
|
| 388 |
+
<i class="fas fa-arrow-right mr-2"></i>
|
| 389 |
+
Next Fact
|
| 390 |
+
</button>
|
| 391 |
+
</div>
|
| 392 |
+
|
| 393 |
+
<!-- Achievement Notifications -->
|
| 394 |
+
<div id="achievementNotification" class="hidden fixed top-4 right-4 bg-gradient-to-r from-accent-50 to-warning-50 border border-accent p-4 rounded-lg shadow-lg z-50 achievement-badge">
|
| 395 |
+
<div class="flex items-center space-x-3">
|
| 396 |
+
<div class="w-10 h-10 bg-accent rounded-full flex items-center justify-center">
|
| 397 |
+
<i class="fas fa-trophy text-white"></i>
|
| 398 |
+
</div>
|
| 399 |
+
<div>
|
| 400 |
+
<p class="font-semibold text-text-primary">Achievement Unlocked!</p>
|
| 401 |
+
<p class="text-sm text-text-secondary" id="achievementText">Fact Explorer - Answered 10 facts correctly!</p>
|
| 402 |
+
</div>
|
| 403 |
+
</div>
|
| 404 |
+
</div>
|
| 405 |
+
|
| 406 |
+
<!-- Quick Actions -->
|
| 407 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
| 408 |
+
<!-- Game Controls -->
|
| 409 |
+
<div class="card p-6">
|
| 410 |
+
<h4 class="text-lg font-semibold text-text-primary mb-4">Game Controls</h4>
|
| 411 |
+
<div class="space-y-3">
|
| 412 |
+
<button id="pauseGame" class="w-full text-left px-4 py-3 rounded bg-warning-100 text-warning hover:bg-warning-50 transition-colors">
|
| 413 |
+
<i class="fas fa-pause mr-3"></i>
|
| 414 |
+
Pause Game
|
| 415 |
+
</button>
|
| 416 |
+
<button id="newGame" class="w-full text-left px-4 py-3 rounded text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 417 |
+
<i class="fas fa-redo mr-3"></i>
|
| 418 |
+
New Game
|
| 419 |
+
</button>
|
| 420 |
+
<button id="viewStats" class="w-full text-left px-4 py-3 rounded text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 421 |
+
<i class="fas fa-chart-line mr-3"></i>
|
| 422 |
+
View Detailed Stats
|
| 423 |
+
</button>
|
| 424 |
+
</div>
|
| 425 |
+
</div>
|
| 426 |
+
|
| 427 |
+
<!-- Quick Navigation -->
|
| 428 |
+
<div class="card p-6">
|
| 429 |
+
<h4 class="text-lg font-semibold text-text-primary mb-4">Continue Learning</h4>
|
| 430 |
+
<div class="space-y-3">
|
| 431 |
+
<a href="flashcards_learning_interface.html" class="block px-4 py-3 rounded text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 432 |
+
<i class="fas fa-layer-group mr-3"></i>
|
| 433 |
+
Study with Flashcards
|
| 434 |
+
</a>
|
| 435 |
+
<a href="active_quiz_interface.html" class="block px-4 py-3 rounded text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 436 |
+
<i class="fas fa-play-circle mr-3"></i>
|
| 437 |
+
Take a Quiz
|
| 438 |
+
</a>
|
| 439 |
+
<a href="quiz_results_statistics.html" class="block px-4 py-3 rounded text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 440 |
+
<i class="fas fa-chart-bar mr-3"></i>
|
| 441 |
+
View Learning Analytics
|
| 442 |
+
</a>
|
| 443 |
+
</div>
|
| 444 |
+
</div>
|
| 445 |
+
</div>
|
| 446 |
+
</div>
|
| 447 |
+
</main>
|
| 448 |
+
|
| 449 |
+
<script>
|
| 450 |
+
// Sample fact data
|
| 451 |
+
const facts = [
|
| 452 |
+
{
|
| 453 |
+
id: 1,
|
| 454 |
+
topic: "General Knowledge",
|
| 455 |
+
statement: "The Great Wall of China is visible from space with the naked eye.",
|
| 456 |
+
isTrue: false,
|
| 457 |
+
explanation: "This is actually FALSE! The Great Wall of China is not visible from space with the naked eye. This is a common misconception. While the wall is massive, it's only about 6 meters wide on average, making it impossible to see from the Moon or even low Earth orbit without aid."
|
| 458 |
+
},
|
| 459 |
+
{
|
| 460 |
+
id: 2,
|
| 461 |
+
topic: "Science",
|
| 462 |
+
statement: "Lightning never strikes the same place twice.",
|
| 463 |
+
isTrue: false,
|
| 464 |
+
explanation: "This is FALSE! Lightning can and does strike the same place multiple times. The Empire State Building, for example, is struck by lightning about 25 times per year. Tall structures are particularly likely to be struck repeatedly."
|
| 465 |
+
},
|
| 466 |
+
{
|
| 467 |
+
id: 3,
|
| 468 |
+
topic: "Biology",
|
| 469 |
+
statement: "Goldfish have a memory span of only 3 seconds.",
|
| 470 |
+
isTrue: false,
|
| 471 |
+
explanation: "This is FALSE! Goldfish actually have much better memories than commonly believed. Studies have shown that goldfish can remember things for months, not seconds. They can be trained to respond to different colors, sounds, and cues."
|
| 472 |
+
},
|
| 473 |
+
{
|
| 474 |
+
id: 4,
|
| 475 |
+
topic: "Space",
|
| 476 |
+
statement: "There are more stars in the observable universe than grains of sand on all Earth's beaches.",
|
| 477 |
+
isTrue: true,
|
| 478 |
+
explanation: "This is TRUE! Scientists estimate there are about 10^24 stars in the observable universe, while there are roughly 7.5 × 10^18 grains of sand on all the world's beaches. That means there are more than 100 stars for every grain of sand!"
|
| 479 |
+
},
|
| 480 |
+
{
|
| 481 |
+
id: 5,
|
| 482 |
+
topic: "History",
|
| 483 |
+
statement: "Cleopatra lived closer in time to the Moon landing than to the construction of the Great Pyramid.",
|
| 484 |
+
isTrue: true,
|
| 485 |
+
explanation: "This is TRUE! Cleopatra VII lived around 69-30 BCE. The Great Pyramid was built around 2580-2560 BCE, while the Moon landing occurred in 1969 CE. Cleopatra lived about 2,500 years after the pyramid but only about 2,000 years before the Moon landing."
|
| 486 |
+
},
|
| 487 |
+
{
|
| 488 |
+
id: 6,
|
| 489 |
+
topic: "Geography",
|
| 490 |
+
statement: "Australia is wider than the Moon.",
|
| 491 |
+
isTrue: true,
|
| 492 |
+
explanation: "This is TRUE! Australia's diameter from east to west is approximately 4,000 km, while the Moon's diameter is about 3,474 km. So Australia is indeed wider than the Moon!"
|
| 493 |
+
},
|
| 494 |
+
{
|
| 495 |
+
id: 7,
|
| 496 |
+
topic: "Technology",
|
| 497 |
+
statement: "The first computer bug was an actual insect.",
|
| 498 |
+
isTrue: true,
|
| 499 |
+
explanation: "This is TRUE! In 1947, Grace Hopper found an actual moth stuck in a Harvard Mark II computer, causing a malfunction. She taped the moth in her logbook with the note 'First actual case of bug being found.' This is the origin of the term 'computer bug.'"
|
| 500 |
+
},
|
| 501 |
+
{
|
| 502 |
+
id: 8,
|
| 503 |
+
topic: "Nature",
|
| 504 |
+
statement: "Bananas are berries, but strawberries are not.",
|
| 505 |
+
isTrue: true,
|
| 506 |
+
explanation: "This is TRUE! Botanically speaking, bananas are indeed berries because they develop from a single flower with one ovary. Strawberries, however, are not true berries - they're aggregate fruits. True berries include grapes, blueberries, and even eggplants!"
|
| 507 |
+
}
|
| 508 |
+
];
|
| 509 |
+
|
| 510 |
+
// Game state
|
| 511 |
+
let currentFactIndex = 0;
|
| 512 |
+
let score = 0;
|
| 513 |
+
let streak = 0;
|
| 514 |
+
let bestStreak = 0;
|
| 515 |
+
let totalAnswered = 0;
|
| 516 |
+
let correctAnswers = 0;
|
| 517 |
+
let timeLeft = 15;
|
| 518 |
+
let timerInterval = null;
|
| 519 |
+
let isRapidFire = false;
|
| 520 |
+
let gameActive = true;
|
| 521 |
+
let isAnswered = false;
|
| 522 |
+
|
| 523 |
+
// DOM elements
|
| 524 |
+
const factCard = document.getElementById('factCard');
|
| 525 |
+
const topicBadge = document.getElementById('topicBadge');
|
| 526 |
+
const factStatement = document.getElementById('factStatement');
|
| 527 |
+
const factReveal = document.getElementById('factReveal');
|
| 528 |
+
const factExplanation = document.getElementById('factExplanation');
|
| 529 |
+
const choiceButtons = document.getElementById('choiceButtons');
|
| 530 |
+
const nextQuestionBtn = document.getElementById('nextQuestionBtn');
|
| 531 |
+
const timerText = document.getElementById('timerText');
|
| 532 |
+
const timerDisplayMobile = document.getElementById('timerDisplayMobile');
|
| 533 |
+
const streakCounter = document.getElementById('streakCounter');
|
| 534 |
+
const streakDisplayMobile = document.getElementById('streakDisplayMobile');
|
| 535 |
+
const totalScore = document.getElementById('totalScore');
|
| 536 |
+
const bestStreakDisplay = document.getElementById('bestStreak');
|
| 537 |
+
const accuracy = document.getElementById('accuracy');
|
| 538 |
+
const scoreDisplay = document.getElementById('scoreDisplay');
|
| 539 |
+
const rapidFireToggle = document.getElementById('rapidFireToggle');
|
| 540 |
+
const normalModeIndicator = document.getElementById('normalModeIndicator');
|
| 541 |
+
const rapidFireIndicator = document.getElementById('rapidFireIndicator');
|
| 542 |
+
const achievementNotification = document.getElementById('achievementNotification');
|
| 543 |
+
const achievementText = document.getElementById('achievementText');
|
| 544 |
+
|
| 545 |
+
// Mobile menu functionality
|
| 546 |
+
const mobileMenuBtn = document.getElementById('mobileMenuBtn');
|
| 547 |
+
const sidebar = document.getElementById('sidebar');
|
| 548 |
+
const mobileMenuOverlay = document.getElementById('mobileMenuOverlay');
|
| 549 |
+
const closeSidebar = document.getElementById('closeSidebar');
|
| 550 |
+
|
| 551 |
+
// Initialize game
|
| 552 |
+
function init() {
|
| 553 |
+
loadFact();
|
| 554 |
+
startTimer();
|
| 555 |
+
updateUI();
|
| 556 |
+
}
|
| 557 |
+
|
| 558 |
+
// Load current fact
|
| 559 |
+
function loadFact() {
|
| 560 |
+
if (currentFactIndex >= facts.length) {
|
| 561 |
+
currentFactIndex = 0; // Loop back to start
|
| 562 |
+
}
|
| 563 |
+
|
| 564 |
+
const fact = facts[currentFactIndex];
|
| 565 |
+
topicBadge.textContent = fact.topic;
|
| 566 |
+
factStatement.textContent = fact.statement;
|
| 567 |
+
factExplanation.textContent = fact.explanation;
|
| 568 |
+
|
| 569 |
+
// Reset UI state
|
| 570 |
+
factReveal.classList.remove('show');
|
| 571 |
+
nextQuestionBtn.classList.add('hidden');
|
| 572 |
+
isAnswered = false;
|
| 573 |
+
|
| 574 |
+
// Enable choice buttons
|
| 575 |
+
const buttons = choiceButtons.querySelectorAll('.choice-btn');
|
| 576 |
+
buttons.forEach(btn => {
|
| 577 |
+
btn.disabled = false;
|
| 578 |
+
btn.classList.remove('correct', 'incorrect');
|
| 579 |
+
});
|
| 580 |
+
|
| 581 |
+
// Reset timer
|
| 582 |
+
timeLeft = isRapidFire ? 10 : 15;
|
| 583 |
+
updateTimer();
|
| 584 |
+
startTimer();
|
| 585 |
+
}
|
| 586 |
+
|
| 587 |
+
// Timer functionality
|
| 588 |
+
function startTimer() {
|
| 589 |
+
if (timerInterval) clearInterval(timerInterval);
|
| 590 |
+
|
| 591 |
+
timerInterval = setInterval(() => {
|
| 592 |
+
if (!gameActive || isAnswered) return;
|
| 593 |
+
|
| 594 |
+
timeLeft--;
|
| 595 |
+
updateTimer();
|
| 596 |
+
|
| 597 |
+
if (timeLeft <= 0) {
|
| 598 |
+
handleTimeout();
|
| 599 |
+
}
|
| 600 |
+
}, 1000);
|
| 601 |
+
}
|
| 602 |
+
|
| 603 |
+
function updateTimer() {
|
| 604 |
+
const timerProgress = document.querySelector('.timer-progress');
|
| 605 |
+
const maxTime = isRapidFire ? 10 : 15;
|
| 606 |
+
const progress = (timeLeft / maxTime) * 188.5;
|
| 607 |
+
|
| 608 |
+
timerProgress.style.strokeDashoffset = 188.5 - progress;
|
| 609 |
+
|
| 610 |
+
if (timeLeft <= 5) {
|
| 611 |
+
timerProgress.classList.add('warning');
|
| 612 |
+
} else {
|
| 613 |
+
timerProgress.classList.remove('warning');
|
| 614 |
+
}
|
| 615 |
+
|
| 616 |
+
if (timerText) timerText.textContent = timeLeft;
|
| 617 |
+
if (timerDisplayMobile) timerDisplayMobile.textContent = timeLeft;
|
| 618 |
+
}
|
| 619 |
+
|
| 620 |
+
function handleTimeout() {
|
| 621 |
+
clearInterval(timerInterval);
|
| 622 |
+
isAnswered = true;
|
| 623 |
+
|
| 624 |
+
// Mark as incorrect
|
| 625 |
+
handleAnswer(null, false);
|
| 626 |
+
factCard.classList.add('shake');
|
| 627 |
+
setTimeout(() => factCard.classList.remove('shake'), 500);
|
| 628 |
+
}
|
| 629 |
+
|
| 630 |
+
// Handle answer selection
|
| 631 |
+
function handleAnswer(selectedChoice, isCorrect) {
|
| 632 |
+
if (isAnswered) return;
|
| 633 |
+
|
| 634 |
+
isAnswered = true;
|
| 635 |
+
clearInterval(timerInterval);
|
| 636 |
+
totalAnswered++;
|
| 637 |
+
|
| 638 |
+
const fact = facts[currentFactIndex];
|
| 639 |
+
const buttons = choiceButtons.querySelectorAll('.choice-btn');
|
| 640 |
+
|
| 641 |
+
// Disable all buttons
|
| 642 |
+
buttons.forEach(btn => btn.disabled = true);
|
| 643 |
+
|
| 644 |
+
if (isCorrect) {
|
| 645 |
+
// Correct answer
|
| 646 |
+
correctAnswers++;
|
| 647 |
+
score += isRapidFire ? 20 : 10;
|
| 648 |
+
streak++;
|
| 649 |
+
|
| 650 |
+
if (streak > bestStreak) {
|
| 651 |
+
bestStreak = streak;
|
| 652 |
+
}
|
| 653 |
+
|
| 654 |
+
// Animate correct button
|
| 655 |
+
if (selectedChoice !== null) {
|
| 656 |
+
const selectedBtn = Array.from(buttons).find(btn =>
|
| 657 |
+
btn.dataset.choice === selectedChoice.toString()
|
| 658 |
+
);
|
| 659 |
+
if (selectedBtn) {
|
| 660 |
+
selectedBtn.classList.add('correct');
|
| 661 |
+
}
|
| 662 |
+
}
|
| 663 |
+
|
| 664 |
+
// Check for achievements
|
| 665 |
+
checkAchievements();
|
| 666 |
+
|
| 667 |
+
} else {
|
| 668 |
+
// Incorrect answer
|
| 669 |
+
streak = 0;
|
| 670 |
+
|
| 671 |
+
// Animate incorrect button if one was selected
|
| 672 |
+
if (selectedChoice !== null) {
|
| 673 |
+
const selectedBtn = Array.from(buttons).find(btn =>
|
| 674 |
+
btn.dataset.choice === selectedChoice.toString()
|
| 675 |
+
);
|
| 676 |
+
if (selectedBtn) {
|
| 677 |
+
selectedBtn.classList.add('incorrect');
|
| 678 |
+
}
|
| 679 |
+
}
|
| 680 |
+
|
| 681 |
+
// Highlight correct answer
|
| 682 |
+
const correctBtn = Array.from(buttons).find(btn =>
|
| 683 |
+
btn.dataset.choice === fact.isTrue.toString()
|
| 684 |
+
);
|
| 685 |
+
if (correctBtn) {
|
| 686 |
+
setTimeout(() => correctBtn.classList.add('correct'), 300);
|
| 687 |
+
}
|
| 688 |
+
}
|
| 689 |
+
|
| 690 |
+
// Show explanation and next button
|
| 691 |
+
setTimeout(() => {
|
| 692 |
+
factReveal.classList.add('show');
|
| 693 |
+
nextQuestionBtn.classList.remove('hidden');
|
| 694 |
+
}, 800);
|
| 695 |
+
|
| 696 |
+
updateUI();
|
| 697 |
+
}
|
| 698 |
+
|
| 699 |
+
// Check for achievements
|
| 700 |
+
function checkAchievements() {
|
| 701 |
+
let achievement = null;
|
| 702 |
+
|
| 703 |
+
if (streak === 5) {
|
| 704 |
+
achievement = "Fact Streak - 5 correct answers in a row!";
|
| 705 |
+
} else if (streak === 10) {
|
| 706 |
+
achievement = "Fact Master - 10 correct answers in a row!";
|
| 707 |
+
} else if (correctAnswers === 10) {
|
| 708 |
+
achievement = "Fact Explorer - Answered 10 facts correctly!";
|
| 709 |
+
} else if (correctAnswers === 25) {
|
| 710 |
+
achievement = "Fact Enthusiast - Answered 25 facts correctly!";
|
| 711 |
+
} else if (score >= 100) {
|
| 712 |
+
achievement = "Century Club - Scored 100 points!";
|
| 713 |
+
}
|
| 714 |
+
|
| 715 |
+
if (achievement) {
|
| 716 |
+
showAchievement(achievement);
|
| 717 |
+
}
|
| 718 |
+
}
|
| 719 |
+
|
| 720 |
+
// Show achievement notification
|
| 721 |
+
function showAchievement(text) {
|
| 722 |
+
achievementText.textContent = text;
|
| 723 |
+
achievementNotification.classList.remove('hidden');
|
| 724 |
+
|
| 725 |
+
setTimeout(() => {
|
| 726 |
+
achievementNotification.classList.add('hidden');
|
| 727 |
+
}, 4000);
|
| 728 |
+
}
|
| 729 |
+
|
| 730 |
+
// Update UI elements
|
| 731 |
+
function updateUI() {
|
| 732 |
+
if (totalScore) totalScore.textContent = score;
|
| 733 |
+
if (scoreDisplay) scoreDisplay.textContent = score;
|
| 734 |
+
if (streakCounter) streakCounter.textContent = streak;
|
| 735 |
+
if (streakDisplayMobile) streakDisplayMobile.textContent = streak;
|
| 736 |
+
if (bestStreakDisplay) bestStreakDisplay.textContent = bestStreak;
|
| 737 |
+
|
| 738 |
+
const accuracyPercent = totalAnswered > 0 ? Math.round((correctAnswers / totalAnswered) * 100) : 100;
|
| 739 |
+
if (accuracy) accuracy.textContent = `${accuracyPercent}%`;
|
| 740 |
+
}
|
| 741 |
+
|
| 742 |
+
// Next question
|
| 743 |
+
function nextQuestion() {
|
| 744 |
+
currentFactIndex++;
|
| 745 |
+
loadFact();
|
| 746 |
+
}
|
| 747 |
+
|
| 748 |
+
// Rapid fire mode toggle
|
| 749 |
+
function toggleRapidFire() {
|
| 750 |
+
isRapidFire = !isRapidFire;
|
| 751 |
+
const toggleSpan = rapidFireToggle.querySelector('span');
|
| 752 |
+
|
| 753 |
+
if (isRapidFire) {
|
| 754 |
+
toggleSpan.classList.add('translate-x-6');
|
| 755 |
+
toggleSpan.classList.remove('translate-x-1');
|
| 756 |
+
rapidFireToggle.classList.add('bg-accent');
|
| 757 |
+
rapidFireToggle.classList.remove('bg-gray-300');
|
| 758 |
+
normalModeIndicator.classList.add('hidden');
|
| 759 |
+
rapidFireIndicator.classList.remove('hidden');
|
| 760 |
+
rapidFireIndicator.classList.add('flex');
|
| 761 |
+
} else {
|
| 762 |
+
toggleSpan.classList.add('translate-x-1');
|
| 763 |
+
toggleSpan.classList.remove('translate-x-6');
|
| 764 |
+
rapidFireToggle.classList.remove('bg-accent');
|
| 765 |
+
rapidFireToggle.classList.add('bg-gray-300');
|
| 766 |
+
normalModeIndicator.classList.remove('hidden');
|
| 767 |
+
rapidFireIndicator.classList.add('hidden');
|
| 768 |
+
rapidFireIndicator.classList.remove('flex');
|
| 769 |
+
}
|
| 770 |
+
|
| 771 |
+
// Restart current question with new timing
|
| 772 |
+
if (gameActive && !isAnswered) {
|
| 773 |
+
loadFact();
|
| 774 |
+
}
|
| 775 |
+
}
|
| 776 |
+
|
| 777 |
+
// Event listeners
|
| 778 |
+
choiceButtons.addEventListener('click', (e) => {
|
| 779 |
+
if (!e.target.classList.contains('choice-btn') || isAnswered) return;
|
| 780 |
+
|
| 781 |
+
const choice = e.target.dataset.choice === 'true';
|
| 782 |
+
const fact = facts[currentFactIndex];
|
| 783 |
+
const isCorrect = choice === fact.isTrue;
|
| 784 |
+
|
| 785 |
+
handleAnswer(choice, isCorrect);
|
| 786 |
+
});
|
| 787 |
+
|
| 788 |
+
nextQuestionBtn.addEventListener('click', nextQuestion);
|
| 789 |
+
rapidFireToggle.addEventListener('click', toggleRapidFire);
|
| 790 |
+
|
| 791 |
+
// Game control buttons
|
| 792 |
+
document.getElementById('pauseGame').addEventListener('click', () => {
|
| 793 |
+
gameActive = !gameActive;
|
| 794 |
+
const btn = document.getElementById('pauseGame');
|
| 795 |
+
|
| 796 |
+
if (gameActive) {
|
| 797 |
+
btn.innerHTML = '<i class="fas fa-pause mr-3"></i>Pause Game';
|
| 798 |
+
startTimer();
|
| 799 |
+
} else {
|
| 800 |
+
btn.innerHTML = '<i class="fas fa-play mr-3"></i>Resume Game';
|
| 801 |
+
clearInterval(timerInterval);
|
| 802 |
+
}
|
| 803 |
+
});
|
| 804 |
+
|
| 805 |
+
document.getElementById('newGame').addEventListener('click', () => {
|
| 806 |
+
// Reset game state
|
| 807 |
+
currentFactIndex = 0;
|
| 808 |
+
score = 0;
|
| 809 |
+
streak = 0;
|
| 810 |
+
totalAnswered = 0;
|
| 811 |
+
correctAnswers = 0;
|
| 812 |
+
gameActive = true;
|
| 813 |
+
isAnswered = false;
|
| 814 |
+
|
| 815 |
+
// Shuffle facts
|
| 816 |
+
for (let i = facts.length - 1; i > 0; i--) {
|
| 817 |
+
const j = Math.floor(Math.random() * (i + 1));
|
| 818 |
+
[facts[i], facts[j]] = [facts[j], facts[i]];
|
| 819 |
+
}
|
| 820 |
+
|
| 821 |
+
updateUI();
|
| 822 |
+
loadFact();
|
| 823 |
+
});
|
| 824 |
+
|
| 825 |
+
document.getElementById('bookmarkFact').addEventListener('click', (e) => {
|
| 826 |
+
e.target.innerHTML = '<i class="fas fa-bookmark mr-2"></i>Saved!';
|
| 827 |
+
e.target.classList.add('bg-accent', 'text-white');
|
| 828 |
+
setTimeout(() => {
|
| 829 |
+
e.target.innerHTML = '<i class="far fa-bookmark mr-2"></i>Save';
|
| 830 |
+
e.target.classList.remove('bg-accent', 'text-white');
|
| 831 |
+
}, 1000);
|
| 832 |
+
});
|
| 833 |
+
|
| 834 |
+
// Mobile menu events
|
| 835 |
+
mobileMenuBtn.addEventListener('click', () => {
|
| 836 |
+
sidebar.classList.remove('-translate-x-full');
|
| 837 |
+
mobileMenuOverlay.classList.remove('hidden');
|
| 838 |
+
});
|
| 839 |
+
|
| 840 |
+
closeSidebar.addEventListener('click', () => {
|
| 841 |
+
sidebar.classList.add('-translate-x-full');
|
| 842 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 843 |
+
});
|
| 844 |
+
|
| 845 |
+
mobileMenuOverlay.addEventListener('click', () => {
|
| 846 |
+
sidebar.classList.add('-translate-x-full');
|
| 847 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 848 |
+
});
|
| 849 |
+
|
| 850 |
+
// Theme toggle functionality
|
| 851 |
+
const themeToggle = document.getElementById('themeToggle');
|
| 852 |
+
const html = document.documentElement;
|
| 853 |
+
|
| 854 |
+
themeToggle.addEventListener('click', () => {
|
| 855 |
+
html.classList.toggle('dark');
|
| 856 |
+
const isDark = html.classList.contains('dark');
|
| 857 |
+
|
| 858 |
+
const toggleSpan = themeToggle.querySelector('span');
|
| 859 |
+
if (isDark) {
|
| 860 |
+
toggleSpan.classList.add('translate-x-6');
|
| 861 |
+
toggleSpan.classList.remove('translate-x-1');
|
| 862 |
+
} else {
|
| 863 |
+
toggleSpan.classList.add('translate-x-1');
|
| 864 |
+
toggleSpan.classList.remove('translate-x-6');
|
| 865 |
+
}
|
| 866 |
+
|
| 867 |
+
localStorage.setItem('theme', isDark ? 'dark' : 'light');
|
| 868 |
+
});
|
| 869 |
+
|
| 870 |
+
// Language selection
|
| 871 |
+
const languageSelect = document.getElementById('languageSelect');
|
| 872 |
+
languageSelect.addEventListener('change', (e) => {
|
| 873 |
+
localStorage.setItem('selectedLanguage', e.target.value);
|
| 874 |
+
console.log('Language changed to:', e.target.value);
|
| 875 |
+
});
|
| 876 |
+
|
| 877 |
+
// Keyboard shortcuts
|
| 878 |
+
document.addEventListener('keydown', (e) => {
|
| 879 |
+
if (isAnswered) {
|
| 880 |
+
if (e.key === ' ' || e.key === 'Enter') {
|
| 881 |
+
e.preventDefault();
|
| 882 |
+
nextQuestion();
|
| 883 |
+
}
|
| 884 |
+
return;
|
| 885 |
+
}
|
| 886 |
+
|
| 887 |
+
switch(e.key) {
|
| 888 |
+
case 'ArrowLeft':
|
| 889 |
+
case '1':
|
| 890 |
+
case 't':
|
| 891 |
+
case 'T':
|
| 892 |
+
e.preventDefault();
|
| 893 |
+
const trueBtn = choiceButtons.querySelector('[data-choice="true"]');
|
| 894 |
+
if (trueBtn && !trueBtn.disabled) {
|
| 895 |
+
trueBtn.click();
|
| 896 |
+
}
|
| 897 |
+
break;
|
| 898 |
+
case 'ArrowRight':
|
| 899 |
+
case '2':
|
| 900 |
+
case 'f':
|
| 901 |
+
case 'F':
|
| 902 |
+
e.preventDefault();
|
| 903 |
+
const falseBtn = choiceButtons.querySelector('[data-choice="false"]');
|
| 904 |
+
if (falseBtn && !falseBtn.disabled) {
|
| 905 |
+
falseBtn.click();
|
| 906 |
+
}
|
| 907 |
+
break;
|
| 908 |
+
case 'r':
|
| 909 |
+
case 'R':
|
| 910 |
+
e.preventDefault();
|
| 911 |
+
toggleRapidFire();
|
| 912 |
+
break;
|
| 913 |
+
}
|
| 914 |
+
});
|
| 915 |
+
|
| 916 |
+
// Load saved preferences
|
| 917 |
+
const savedTheme = localStorage.getItem('theme');
|
| 918 |
+
if (savedTheme) {
|
| 919 |
+
html.classList.toggle('dark', savedTheme === 'dark');
|
| 920 |
+
const toggleSpan = themeToggle.querySelector('span');
|
| 921 |
+
if (savedTheme === 'dark') {
|
| 922 |
+
toggleSpan.classList.add('translate-x-6');
|
| 923 |
+
toggleSpan.classList.remove('translate-x-1');
|
| 924 |
+
}
|
| 925 |
+
}
|
| 926 |
+
|
| 927 |
+
const savedLanguage = localStorage.getItem('selectedLanguage');
|
| 928 |
+
if (savedLanguage) {
|
| 929 |
+
languageSelect.value = savedLanguage;
|
| 930 |
+
}
|
| 931 |
+
|
| 932 |
+
// Initialize the game
|
| 933 |
+
init();
|
| 934 |
+
</script>
|
| 935 |
+
</body>
|
| 936 |
+
</html>
|
pages/flashcards_learning_interface.html
ADDED
|
@@ -0,0 +1,735 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en" class="dark">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>Flashcards Learning - TriviaVerse Quiz</title>
|
| 7 |
+
<link rel="stylesheet" href="../css/main.css" />
|
| 8 |
+
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet" />
|
| 9 |
+
<style>
|
| 10 |
+
.flashcard {
|
| 11 |
+
perspective: 1000px;
|
| 12 |
+
min-height: 300px;
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
+
.flashcard-inner {
|
| 16 |
+
position: relative;
|
| 17 |
+
width: 100%;
|
| 18 |
+
height: 100%;
|
| 19 |
+
text-align: center;
|
| 20 |
+
transition: transform 0.6s;
|
| 21 |
+
transform-style: preserve-3d;
|
| 22 |
+
cursor: pointer;
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
.flashcard.flipped .flashcard-inner {
|
| 26 |
+
transform: rotateY(180deg);
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
.flashcard-front, .flashcard-back {
|
| 30 |
+
position: absolute;
|
| 31 |
+
width: 100%;
|
| 32 |
+
height: 100%;
|
| 33 |
+
backface-visibility: hidden;
|
| 34 |
+
border-radius: 12px;
|
| 35 |
+
padding: 2rem;
|
| 36 |
+
display: flex;
|
| 37 |
+
align-items: center;
|
| 38 |
+
justify-content: center;
|
| 39 |
+
flex-direction: column;
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
.flashcard-back {
|
| 43 |
+
transform: rotateY(180deg);
|
| 44 |
+
background: linear-gradient(135deg, #4F46E5, #06B6D4);
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
.difficulty-btn {
|
| 48 |
+
transition: all 0.2s ease;
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
.difficulty-btn:hover {
|
| 52 |
+
transform: translateY(-2px);
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
.progress-circle {
|
| 56 |
+
position: relative;
|
| 57 |
+
width: 80px;
|
| 58 |
+
height: 80px;
|
| 59 |
+
}
|
| 60 |
+
|
| 61 |
+
.progress-circle svg {
|
| 62 |
+
width: 100%;
|
| 63 |
+
height: 100%;
|
| 64 |
+
transform: rotate(-90deg);
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
.progress-circle circle {
|
| 68 |
+
fill: none;
|
| 69 |
+
stroke-width: 6;
|
| 70 |
+
stroke-linecap: round;
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
.progress-bg {
|
| 74 |
+
stroke: rgba(148, 163, 184, 0.2);
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
.progress-bar-circle {
|
| 78 |
+
stroke: #4F46E5;
|
| 79 |
+
stroke-dasharray: 251.2;
|
| 80 |
+
stroke-dashoffset: 251.2;
|
| 81 |
+
transition: stroke-dashoffset 0.3s ease;
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
@keyframes cardFlip {
|
| 85 |
+
0% { transform: scale(1); }
|
| 86 |
+
50% { transform: scale(1.05); }
|
| 87 |
+
100% { transform: scale(1); }
|
| 88 |
+
}
|
| 89 |
+
|
| 90 |
+
.card-animate {
|
| 91 |
+
animation: cardFlip 0.3s ease;
|
| 92 |
+
}
|
| 93 |
+
</style>
|
| 94 |
+
<script type="module" src="https://static.rocket.new/rocket-web.js?_cfg=https%3A%2F%2Ftriviavers2501back.builtwithrocket.new&_be=https%3A%2F%2Fapplication.rocket.new&_v=0.1.5"></script>
|
| 95 |
+
</head>
|
| 96 |
+
<body class="bg-background text-text-primary transition-theme">
|
| 97 |
+
<!-- Mobile Menu Overlay -->
|
| 98 |
+
<div id="mobileMenuOverlay" class="fixed inset-0 bg-black bg-opacity-50 z-40 hidden lg:hidden"></div>
|
| 99 |
+
|
| 100 |
+
<!-- Sidebar -->
|
| 101 |
+
<aside id="sidebar" class="fixed left-0 top-0 h-full w-80 bg-surface border-r border-border transform -translate-x-full lg:translate-x-0 transition-transform duration-300 z-50 lg:z-auto">
|
| 102 |
+
<div class="p-6 border-b border-border">
|
| 103 |
+
<!-- Logo -->
|
| 104 |
+
<div class="flex items-center space-x-3 mb-6">
|
| 105 |
+
<div class="w-10 h-10 bg-gradient-to-br from-primary to-secondary rounded-lg flex items-center justify-center">
|
| 106 |
+
<i class="fas fa-brain text-white text-lg"></i>
|
| 107 |
+
</div>
|
| 108 |
+
<div>
|
| 109 |
+
<h1 class="text-xl font-bold text-text-primary">TriviaVerse</h1>
|
| 110 |
+
<p class="text-sm text-text-secondary">Quiz Platform</p>
|
| 111 |
+
</div>
|
| 112 |
+
</div>
|
| 113 |
+
|
| 114 |
+
<!-- Close button for mobile -->
|
| 115 |
+
<button id="closeSidebar" class="absolute top-4 right-4 lg:hidden text-text-secondary hover:text-text-primary">
|
| 116 |
+
<i class="fas fa-times text-xl"></i>
|
| 117 |
+
</button>
|
| 118 |
+
</div>
|
| 119 |
+
|
| 120 |
+
<!-- Navigation -->
|
| 121 |
+
<nav class="p-6 space-y-2">
|
| 122 |
+
<a href="quiz_dashboard.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 123 |
+
<i class="fas fa-home"></i>
|
| 124 |
+
<span>Dashboard</span>
|
| 125 |
+
</a>
|
| 126 |
+
<a href="active_quiz_interface.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 127 |
+
<i class="fas fa-play-circle"></i>
|
| 128 |
+
<span>Active Quiz</span>
|
| 129 |
+
</a>
|
| 130 |
+
<a href="flashcards_learning_interface.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg bg-primary text-white">
|
| 131 |
+
<i class="fas fa-layer-group"></i>
|
| 132 |
+
<span>Flashcards</span>
|
| 133 |
+
</a>
|
| 134 |
+
<a href="fact_game_challenge.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 135 |
+
<i class="fas fa-gamepad"></i>
|
| 136 |
+
<span>Fact Game</span>
|
| 137 |
+
</a>
|
| 138 |
+
<a href="quiz_results_statistics.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 139 |
+
<i class="fas fa-chart-bar"></i>
|
| 140 |
+
<span>Statistics</span>
|
| 141 |
+
</a>
|
| 142 |
+
<a href="topic_selection_browse.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 143 |
+
<i class="fas fa-book"></i>
|
| 144 |
+
<span>Browse Topics</span>
|
| 145 |
+
</a>
|
| 146 |
+
<a href="settings_preferences.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 147 |
+
<i class="fas fa-cog"></i>
|
| 148 |
+
<span>Settings</span>
|
| 149 |
+
</a>
|
| 150 |
+
</nav>
|
| 151 |
+
|
| 152 |
+
<!-- Game Settings -->
|
| 153 |
+
<div class="p-6 border-t border-border">
|
| 154 |
+
<h3 class="text-sm font-semibold text-text-primary mb-4">Study Settings</h3>
|
| 155 |
+
|
| 156 |
+
<!-- Language Switcher -->
|
| 157 |
+
<div class="mb-4">
|
| 158 |
+
<label class="block text-sm text-text-secondary mb-2">Language</label>
|
| 159 |
+
<select id="languageSelect" class="w-full bg-background border border-border rounded-lg px-3 py-2 text-text-primary focus:outline-none focus:ring-2 focus:ring-primary">
|
| 160 |
+
<option value="en">English</option>
|
| 161 |
+
<option value="te">తెలుగు (Telugu)</option>
|
| 162 |
+
<option value="hi">हिंदी (Hindi)</option>
|
| 163 |
+
<option value="kn">ಕನ್ನಡ (Kannada)</option>
|
| 164 |
+
</select>
|
| 165 |
+
</div>
|
| 166 |
+
|
| 167 |
+
<!-- Audio Toggle -->
|
| 168 |
+
<div class="flex items-center justify-between mb-4">
|
| 169 |
+
<span class="text-sm text-text-secondary">Audio Pronunciation</span>
|
| 170 |
+
<button id="audioToggle" class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 171 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 172 |
+
</button>
|
| 173 |
+
</div>
|
| 174 |
+
|
| 175 |
+
<!-- Theme Toggle -->
|
| 176 |
+
<div class="flex items-center justify-between">
|
| 177 |
+
<span class="text-sm text-text-secondary">Dark Theme</span>
|
| 178 |
+
<button id="themeToggle" class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 179 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 180 |
+
</button>
|
| 181 |
+
</div>
|
| 182 |
+
</div>
|
| 183 |
+
</aside>
|
| 184 |
+
|
| 185 |
+
<!-- Main Content -->
|
| 186 |
+
<main class="lg:ml-80 min-h-screen">
|
| 187 |
+
<!-- Header -->
|
| 188 |
+
<header class="bg-surface border-b border-border p-4 lg:p-6">
|
| 189 |
+
<div class="flex items-center justify-between">
|
| 190 |
+
<!-- Mobile Menu Button -->
|
| 191 |
+
<button id="mobileMenuBtn" class="lg:hidden text-text-primary hover:text-primary">
|
| 192 |
+
<i class="fas fa-bars text-xl"></i>
|
| 193 |
+
</button>
|
| 194 |
+
|
| 195 |
+
<!-- Title -->
|
| 196 |
+
<div class="flex-1 lg:flex-none">
|
| 197 |
+
<h2 class="text-2xl font-bold text-text-primary">Flashcards Learning</h2>
|
| 198 |
+
<p class="text-text-secondary mt-1">Master topics through spaced repetition</p>
|
| 199 |
+
</div>
|
| 200 |
+
|
| 201 |
+
<!-- Session Progress -->
|
| 202 |
+
<div class="hidden lg:flex items-center space-x-4">
|
| 203 |
+
<div class="progress-circle">
|
| 204 |
+
<svg>
|
| 205 |
+
<circle class="progress-bg" cx="40" cy="40" r="36"/>
|
| 206 |
+
<circle class="progress-bar-circle" cx="40" cy="40" r="36" style="stroke-dashoffset: 125.6;"/>
|
| 207 |
+
</svg>
|
| 208 |
+
<div class="absolute inset-0 flex items-center justify-center">
|
| 209 |
+
<span class="text-sm font-semibold text-text-primary" id="progressText">5/10</span>
|
| 210 |
+
</div>
|
| 211 |
+
</div>
|
| 212 |
+
<div>
|
| 213 |
+
<p class="text-sm font-medium text-text-primary">Session Progress</p>
|
| 214 |
+
<p class="text-xs text-text-secondary">50% Complete</p>
|
| 215 |
+
</div>
|
| 216 |
+
</div>
|
| 217 |
+
</div>
|
| 218 |
+
</header>
|
| 219 |
+
|
| 220 |
+
<!-- Study Interface -->
|
| 221 |
+
<div class="p-4 lg:p-6 max-w-4xl mx-auto">
|
| 222 |
+
<!-- Study Stats -->
|
| 223 |
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
|
| 224 |
+
<div class="card p-4">
|
| 225 |
+
<div class="flex items-center justify-between">
|
| 226 |
+
<div>
|
| 227 |
+
<p class="text-text-secondary text-sm">Cards Remaining</p>
|
| 228 |
+
<p class="text-2xl font-bold text-primary" id="cardsRemaining">5</p>
|
| 229 |
+
</div>
|
| 230 |
+
<div class="w-10 h-10 bg-primary-100 rounded-lg flex items-center justify-center">
|
| 231 |
+
<i class="fas fa-layer-group text-primary"></i>
|
| 232 |
+
</div>
|
| 233 |
+
</div>
|
| 234 |
+
</div>
|
| 235 |
+
|
| 236 |
+
<div class="card p-4">
|
| 237 |
+
<div class="flex items-center justify-between">
|
| 238 |
+
<div>
|
| 239 |
+
<p class="text-text-secondary text-sm">Mastery Level</p>
|
| 240 |
+
<p class="text-2xl font-bold text-success" id="masteryLevel">85%</p>
|
| 241 |
+
</div>
|
| 242 |
+
<div class="w-10 h-10 bg-success-100 rounded-lg flex items-center justify-center">
|
| 243 |
+
<i class="fas fa-brain text-success"></i>
|
| 244 |
+
</div>
|
| 245 |
+
</div>
|
| 246 |
+
</div>
|
| 247 |
+
|
| 248 |
+
<div class="card p-4">
|
| 249 |
+
<div class="flex items-center justify-between">
|
| 250 |
+
<div>
|
| 251 |
+
<p class="text-text-secondary text-sm">Study Streak</p>
|
| 252 |
+
<p class="text-2xl font-bold text-accent" id="studyStreak">7</p>
|
| 253 |
+
</div>
|
| 254 |
+
<div class="w-10 h-10 bg-accent-100 rounded-lg flex items-center justify-center">
|
| 255 |
+
<i class="fas fa-fire text-accent"></i>
|
| 256 |
+
</div>
|
| 257 |
+
</div>
|
| 258 |
+
</div>
|
| 259 |
+
</div>
|
| 260 |
+
|
| 261 |
+
<!-- Flashcard -->
|
| 262 |
+
<div class="card p-8 mb-6 flashcard" id="flashcard">
|
| 263 |
+
<div class="flashcard-inner">
|
| 264 |
+
<!-- Front of card -->
|
| 265 |
+
<div class="flashcard-front bg-surface border border-border">
|
| 266 |
+
<div class="mb-4">
|
| 267 |
+
<span class="inline-block bg-primary-100 text-primary text-xs px-3 py-1 rounded-full mb-4">Python Programming</span>
|
| 268 |
+
</div>
|
| 269 |
+
<h3 class="text-xl lg:text-2xl font-semibold text-text-primary mb-4 text-center" id="cardQuestion">
|
| 270 |
+
What is the difference between a list and a tuple in Python?
|
| 271 |
+
</h3>
|
| 272 |
+
<p class="text-text-secondary text-center mb-6">
|
| 273 |
+
<i class="fas fa-mouse-pointer mr-2"></i>
|
| 274 |
+
Click to reveal answer
|
| 275 |
+
</p>
|
| 276 |
+
<div class="flex items-center justify-center space-x-4">
|
| 277 |
+
<button id="audioBtn" class="btn bg-secondary-100 text-secondary px-4 py-2 rounded-lg hover:bg-secondary-50">
|
| 278 |
+
<i class="fas fa-volume-up mr-2"></i>
|
| 279 |
+
Pronounce
|
| 280 |
+
</button>
|
| 281 |
+
<button id="bookmarkBtn" class="btn bg-accent-100 text-accent px-4 py-2 rounded-lg hover:bg-accent-50">
|
| 282 |
+
<i class="far fa-bookmark mr-2"></i>
|
| 283 |
+
Bookmark
|
| 284 |
+
</button>
|
| 285 |
+
</div>
|
| 286 |
+
</div>
|
| 287 |
+
|
| 288 |
+
<!-- Back of card -->
|
| 289 |
+
<div class="flashcard-back text-white">
|
| 290 |
+
<h3 class="text-xl font-semibold mb-4 text-center">Answer</h3>
|
| 291 |
+
<div class="text-left space-y-3" id="cardAnswer">
|
| 292 |
+
<p class="leading-relaxed">
|
| 293 |
+
<strong>Lists:</strong> Mutable, ordered collections that can be modified after creation.
|
| 294 |
+
Use square brackets []. Example: my_list = [1, 2, 3]
|
| 295 |
+
</p>
|
| 296 |
+
<p class="leading-relaxed">
|
| 297 |
+
<strong>Tuples:</strong> Immutable, ordered collections that cannot be modified after creation.
|
| 298 |
+
Use parentheses (). Example: my_tuple = (1, 2, 3)
|
| 299 |
+
</p>
|
| 300 |
+
<p class="text-sm opacity-90 mt-4">
|
| 301 |
+
<i class="fas fa-lightbulb mr-2"></i>
|
| 302 |
+
<strong>Memory tip:</strong> Think "T" for Tuple = "T" for immutable (can't change)
|
| 303 |
+
</p>
|
| 304 |
+
</div>
|
| 305 |
+
</div>
|
| 306 |
+
</div>
|
| 307 |
+
</div>
|
| 308 |
+
|
| 309 |
+
<!-- Difficulty Rating -->
|
| 310 |
+
<div class="text-center mb-6">
|
| 311 |
+
<p class="text-text-secondary mb-4">How difficult was this card?</p>
|
| 312 |
+
<div class="flex justify-center space-x-4">
|
| 313 |
+
<button class="difficulty-btn btn bg-success text-white px-6 py-3 rounded-lg hover:bg-green-700" data-difficulty="easy">
|
| 314 |
+
<i class="fas fa-smile mr-2"></i>
|
| 315 |
+
Easy
|
| 316 |
+
</button>
|
| 317 |
+
<button class="difficulty-btn btn bg-warning text-white px-6 py-3 rounded-lg hover:bg-warning-600" data-difficulty="medium">
|
| 318 |
+
<i class="fas fa-meh mr-2"></i>
|
| 319 |
+
Medium
|
| 320 |
+
</button>
|
| 321 |
+
<button class="difficulty-btn btn bg-error text-white px-6 py-3 rounded-lg hover:bg-error" data-difficulty="hard">
|
| 322 |
+
<i class="fas fa-frown mr-2"></i>
|
| 323 |
+
Hard
|
| 324 |
+
</button>
|
| 325 |
+
</div>
|
| 326 |
+
</div>
|
| 327 |
+
|
| 328 |
+
<!-- Navigation Controls -->
|
| 329 |
+
<div class="flex justify-between items-center">
|
| 330 |
+
<button id="prevCard" class="btn btn-secondary px-6 py-3 rounded-lg" disabled>
|
| 331 |
+
<i class="fas fa-arrow-left mr-2"></i>
|
| 332 |
+
Previous
|
| 333 |
+
</button>
|
| 334 |
+
|
| 335 |
+
<div class="flex space-x-3">
|
| 336 |
+
<button id="flipCard" class="btn btn-primary px-6 py-3 rounded-lg">
|
| 337 |
+
<i class="fas fa-sync-alt mr-2"></i>
|
| 338 |
+
Flip Card
|
| 339 |
+
</button>
|
| 340 |
+
<button id="resetCard" class="btn bg-gray-600 text-white px-6 py-3 rounded-lg hover:bg-gray-400">
|
| 341 |
+
<i class="fas fa-redo mr-2"></i>
|
| 342 |
+
Reset
|
| 343 |
+
</button>
|
| 344 |
+
</div>
|
| 345 |
+
|
| 346 |
+
<button id="nextCard" class="btn btn-primary px-6 py-3 rounded-lg">
|
| 347 |
+
Next
|
| 348 |
+
<i class="fas fa-arrow-right ml-2"></i>
|
| 349 |
+
</button>
|
| 350 |
+
</div>
|
| 351 |
+
|
| 352 |
+
<!-- Quick Actions -->
|
| 353 |
+
<div class="mt-8 grid grid-cols-1 md:grid-cols-2 gap-4">
|
| 354 |
+
<div class="card p-4">
|
| 355 |
+
<h4 class="text-lg font-semibold text-text-primary mb-3">Study Options</h4>
|
| 356 |
+
<div class="space-y-2">
|
| 357 |
+
<button class="w-full text-left px-3 py-2 rounded text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 358 |
+
<i class="fas fa-random mr-2"></i>
|
| 359 |
+
Shuffle Deck
|
| 360 |
+
</button>
|
| 361 |
+
<button class="w-full text-left px-3 py-2 rounded text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 362 |
+
<i class="fas fa-bookmark mr-2"></i>
|
| 363 |
+
Review Bookmarked
|
| 364 |
+
</button>
|
| 365 |
+
<button class="w-full text-left px-3 py-2 rounded text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 366 |
+
<i class="fas fa-clock mr-2"></i>
|
| 367 |
+
Timed Practice
|
| 368 |
+
</button>
|
| 369 |
+
</div>
|
| 370 |
+
</div>
|
| 371 |
+
|
| 372 |
+
<div class="card p-4">
|
| 373 |
+
<h4 class="text-lg font-semibold text-text-primary mb-3">Quick Switch</h4>
|
| 374 |
+
<div class="space-y-2">
|
| 375 |
+
<a href="active_quiz_interface.html" class="block px-3 py-2 rounded text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 376 |
+
<i class="fas fa-play-circle mr-2"></i>
|
| 377 |
+
Switch to Quiz Mode
|
| 378 |
+
</a>
|
| 379 |
+
<a href="fact_game_challenge.html" class="block px-3 py-2 rounded text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 380 |
+
<i class="fas fa-gamepad mr-2"></i>
|
| 381 |
+
Try Fact Game
|
| 382 |
+
</a>
|
| 383 |
+
<a href="quiz_results_statistics.html" class="block px-3 py-2 rounded text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 384 |
+
<i class="fas fa-chart-bar mr-2"></i>
|
| 385 |
+
View Analytics
|
| 386 |
+
</a>
|
| 387 |
+
</div>
|
| 388 |
+
</div>
|
| 389 |
+
</div>
|
| 390 |
+
</div>
|
| 391 |
+
</main>
|
| 392 |
+
|
| 393 |
+
<script>
|
| 394 |
+
// Sample flashcard data
|
| 395 |
+
const flashcards = [
|
| 396 |
+
{
|
| 397 |
+
id: 1,
|
| 398 |
+
topic: "Python Programming",
|
| 399 |
+
question: "What is the difference between a list and a tuple in Python?",
|
| 400 |
+
answer: `<p class="leading-relaxed"><strong>Lists:</strong> Mutable, ordered collections that can be modified after creation. Use square brackets []. Example: my_list = [1, 2, 3]</p><p class="leading-relaxed"><strong>Tuples:</strong> Immutable, ordered collections that cannot be modified after creation. Use parentheses (). Example: my_tuple = (1, 2, 3)</p><p class="text-sm opacity-90 mt-4"><i class="fas fa-lightbulb mr-2"></i><strong>Memory tip:</strong> Think "T" for Tuple = "T" for immutable (can't change)</p>`,
|
| 401 |
+
difficulty: null,
|
| 402 |
+
bookmarked: false
|
| 403 |
+
},
|
| 404 |
+
{
|
| 405 |
+
id: 2,
|
| 406 |
+
topic: "JavaScript",
|
| 407 |
+
question: "What is the difference between 'let', 'const', and 'var' in JavaScript?",
|
| 408 |
+
answer: `<p class="leading-relaxed"><strong>var:</strong> Function-scoped, can be redeclared and updated. Hoisted to the top.</p><p class="leading-relaxed"><strong>let:</strong> Block-scoped, can be updated but not redeclared in the same scope.</p><p class="leading-relaxed"><strong>const:</strong> Block-scoped, cannot be updated or redeclared. Must be initialized.</p><p class="text-sm opacity-90 mt-4"><i class="fas fa-lightbulb mr-2"></i><strong>Best practice:</strong> Use const by default, let when you need to reassign, avoid var.</p>`,
|
| 409 |
+
difficulty: null,
|
| 410 |
+
bookmarked: false
|
| 411 |
+
},
|
| 412 |
+
{
|
| 413 |
+
id: 3,
|
| 414 |
+
topic: "General Science",
|
| 415 |
+
question: "What is photosynthesis and why is it important?",
|
| 416 |
+
answer: `<p class="leading-relaxed"><strong>Definition:</strong> The process by which plants convert sunlight, carbon dioxide, and water into glucose and oxygen.</p><p class="leading-relaxed"><strong>Formula:</strong> 6CO₂ + 6H₂O + light energy → C₆H₁₂O₆ + 6O₂</p><p class="leading-relaxed"><strong>Importance:</strong> Produces oxygen for life on Earth and forms the base of most food chains.</p><p class="text-sm opacity-90 mt-4"><i class="fas fa-lightbulb mr-2"></i><strong>Fun fact:</strong> Photosynthesis occurs in chloroplasts, the "green engines" of plants!</p>`,
|
| 417 |
+
difficulty: null,
|
| 418 |
+
bookmarked: false
|
| 419 |
+
},
|
| 420 |
+
{
|
| 421 |
+
id: 4,
|
| 422 |
+
topic: "World History",
|
| 423 |
+
question: "What were the main causes of World War I?",
|
| 424 |
+
answer: `<p class="leading-relaxed"><strong>M.A.I.N. Causes:</strong></p><p class="leading-relaxed"><strong>Militarism:</strong> Arms race between European powers</p><p class="leading-relaxed"><strong>Alliances:</strong> Complex web of treaties (Triple Alliance vs Triple Entente)</p><p class="leading-relaxed"><strong>Imperialism:</strong> Competition for colonies and resources</p><p class="leading-relaxed"><strong>Nationalism:</strong> Ethnic tensions, especially in the Balkans</p><p class="text-sm opacity-90 mt-4"><i class="fas fa-lightbulb mr-2"></i><strong>Trigger:</strong> Assassination of Archduke Franz Ferdinand in 1914</p>`,
|
| 425 |
+
difficulty: null,
|
| 426 |
+
bookmarked: false
|
| 427 |
+
},
|
| 428 |
+
{
|
| 429 |
+
id: 5,
|
| 430 |
+
topic: "Mathematics",
|
| 431 |
+
question: "What is the Pythagorean Theorem and how is it used?",
|
| 432 |
+
answer: `<p class="leading-relaxed"><strong>Theorem:</strong> In a right triangle, a² + b² = c² (where c is the hypotenuse)</p><p class="leading-relaxed"><strong>Applications:</strong> Finding distances, navigation, construction, computer graphics</p><p class="leading-relaxed"><strong>Example:</strong> If sides are 3 and 4, hypotenuse = √(3² + 4²) = √25 = 5</p><p class="text-sm opacity-90 mt-4"><i class="fas fa-lightbulb mr-2"></i><strong>Memory trick:</strong> 3-4-5 and 5-12-13 are common Pythagorean triples!</p>`,
|
| 433 |
+
difficulty: null,
|
| 434 |
+
bookmarked: false
|
| 435 |
+
}
|
| 436 |
+
];
|
| 437 |
+
|
| 438 |
+
let currentCardIndex = 0;
|
| 439 |
+
let isFlipped = false;
|
| 440 |
+
let cardsStudied = 0;
|
| 441 |
+
let correctAnswers = 0;
|
| 442 |
+
|
| 443 |
+
// DOM elements
|
| 444 |
+
const flashcard = document.getElementById('flashcard');
|
| 445 |
+
const cardQuestion = document.getElementById('cardQuestion');
|
| 446 |
+
const cardAnswer = document.getElementById('cardAnswer');
|
| 447 |
+
const flipCard = document.getElementById('flipCard');
|
| 448 |
+
const resetCard = document.getElementById('resetCard');
|
| 449 |
+
const nextCard = document.getElementById('nextCard');
|
| 450 |
+
const prevCard = document.getElementById('prevCard');
|
| 451 |
+
const difficultyBtns = document.querySelectorAll('.difficulty-btn');
|
| 452 |
+
const audioBtn = document.getElementById('audioBtn');
|
| 453 |
+
const bookmarkBtn = document.getElementById('bookmarkBtn');
|
| 454 |
+
const cardsRemaining = document.getElementById('cardsRemaining');
|
| 455 |
+
const masteryLevel = document.getElementById('masteryLevel');
|
| 456 |
+
const studyStreak = document.getElementById('studyStreak');
|
| 457 |
+
const progressText = document.getElementById('progressText');
|
| 458 |
+
|
| 459 |
+
// Mobile menu functionality
|
| 460 |
+
const mobileMenuBtn = document.getElementById('mobileMenuBtn');
|
| 461 |
+
const sidebar = document.getElementById('sidebar');
|
| 462 |
+
const mobileMenuOverlay = document.getElementById('mobileMenuOverlay');
|
| 463 |
+
const closeSidebar = document.getElementById('closeSidebar');
|
| 464 |
+
|
| 465 |
+
// Initialize
|
| 466 |
+
function init() {
|
| 467 |
+
loadCard();
|
| 468 |
+
updateProgress();
|
| 469 |
+
updateStats();
|
| 470 |
+
}
|
| 471 |
+
|
| 472 |
+
// Load current card
|
| 473 |
+
function loadCard() {
|
| 474 |
+
const card = flashcards[currentCardIndex];
|
| 475 |
+
const topicBadge = flashcard.querySelector('.flashcard-front span');
|
| 476 |
+
|
| 477 |
+
topicBadge.textContent = card.topic;
|
| 478 |
+
cardQuestion.textContent = card.question;
|
| 479 |
+
cardAnswer.innerHTML = card.answer;
|
| 480 |
+
|
| 481 |
+
// Update bookmark button
|
| 482 |
+
bookmarkBtn.innerHTML = card.bookmarked
|
| 483 |
+
? '<i class="fas fa-bookmark mr-2"></i>Bookmarked'
|
| 484 |
+
: '<i class="far fa-bookmark mr-2"></i>Bookmark';
|
| 485 |
+
|
| 486 |
+
// Reset flip state
|
| 487 |
+
isFlipped = false;
|
| 488 |
+
flashcard.classList.remove('flipped');
|
| 489 |
+
|
| 490 |
+
// Update navigation buttons
|
| 491 |
+
prevCard.disabled = currentCardIndex === 0;
|
| 492 |
+
nextCard.disabled = currentCardIndex === flashcards.length - 1;
|
| 493 |
+
|
| 494 |
+
// Add animation
|
| 495 |
+
flashcard.classList.add('card-animate');
|
| 496 |
+
setTimeout(() => flashcard.classList.remove('card-animate'), 300);
|
| 497 |
+
}
|
| 498 |
+
|
| 499 |
+
// Update progress indicators
|
| 500 |
+
function updateProgress() {
|
| 501 |
+
const progress = ((currentCardIndex + 1) / flashcards.length) * 100;
|
| 502 |
+
const circumference = 2 * Math.PI * 36;
|
| 503 |
+
const offset = circumference - (progress / 100) * circumference;
|
| 504 |
+
|
| 505 |
+
document.querySelector('.progress-bar-circle').style.strokeDashoffset = offset;
|
| 506 |
+
progressText.textContent = `${currentCardIndex + 1}/${flashcards.length}`;
|
| 507 |
+
cardsRemaining.textContent = flashcards.length - currentCardIndex - 1;
|
| 508 |
+
}
|
| 509 |
+
|
| 510 |
+
// Update statistics
|
| 511 |
+
function updateStats() {
|
| 512 |
+
const completedCards = flashcards.filter(card => card.difficulty !== null).length;
|
| 513 |
+
const mastery = completedCards > 0 ? Math.round((correctAnswers / completedCards) * 100) : 85;
|
| 514 |
+
|
| 515 |
+
masteryLevel.textContent = `${mastery}%`;
|
| 516 |
+
studyStreak.textContent = Math.floor(Math.random() * 10) + 5; // Simulated streak
|
| 517 |
+
}
|
| 518 |
+
|
| 519 |
+
// Flip card functionality
|
| 520 |
+
function handleFlip() {
|
| 521 |
+
isFlipped = !isFlipped;
|
| 522 |
+
flashcard.classList.toggle('flipped');
|
| 523 |
+
}
|
| 524 |
+
|
| 525 |
+
// Handle difficulty rating
|
| 526 |
+
function handleDifficulty(difficulty) {
|
| 527 |
+
flashcards[currentCardIndex].difficulty = difficulty;
|
| 528 |
+
|
| 529 |
+
if (difficulty === 'easy') {
|
| 530 |
+
correctAnswers++;
|
| 531 |
+
}
|
| 532 |
+
|
| 533 |
+
cardsStudied++;
|
| 534 |
+
updateStats();
|
| 535 |
+
|
| 536 |
+
// Auto-advance to next card
|
| 537 |
+
setTimeout(() => {
|
| 538 |
+
if (currentCardIndex < flashcards.length - 1) {
|
| 539 |
+
currentCardIndex++;
|
| 540 |
+
loadCard();
|
| 541 |
+
updateProgress();
|
| 542 |
+
}
|
| 543 |
+
}, 500);
|
| 544 |
+
}
|
| 545 |
+
|
| 546 |
+
// Handle navigation
|
| 547 |
+
function handleNext() {
|
| 548 |
+
if (currentCardIndex < flashcards.length - 1) {
|
| 549 |
+
currentCardIndex++;
|
| 550 |
+
loadCard();
|
| 551 |
+
updateProgress();
|
| 552 |
+
}
|
| 553 |
+
}
|
| 554 |
+
|
| 555 |
+
function handlePrev() {
|
| 556 |
+
if (currentCardIndex > 0) {
|
| 557 |
+
currentCardIndex--;
|
| 558 |
+
loadCard();
|
| 559 |
+
updateProgress();
|
| 560 |
+
}
|
| 561 |
+
}
|
| 562 |
+
|
| 563 |
+
// Handle bookmark
|
| 564 |
+
function handleBookmark() {
|
| 565 |
+
flashcards[currentCardIndex].bookmarked = !flashcards[currentCardIndex].bookmarked;
|
| 566 |
+
const card = flashcards[currentCardIndex];
|
| 567 |
+
|
| 568 |
+
bookmarkBtn.innerHTML = card.bookmarked
|
| 569 |
+
? '<i class="fas fa-bookmark mr-2"></i>Bookmarked'
|
| 570 |
+
: '<i class="far fa-bookmark mr-2"></i>Bookmark';
|
| 571 |
+
|
| 572 |
+
bookmarkBtn.classList.add('bg-accent', 'text-white');
|
| 573 |
+
setTimeout(() => {
|
| 574 |
+
bookmarkBtn.classList.remove('bg-accent', 'text-white');
|
| 575 |
+
}, 200);
|
| 576 |
+
}
|
| 577 |
+
|
| 578 |
+
// Handle audio (simulated)
|
| 579 |
+
function handleAudio() {
|
| 580 |
+
audioBtn.innerHTML = '<i class="fas fa-volume-up mr-2"></i>Playing...';
|
| 581 |
+
audioBtn.disabled = true;
|
| 582 |
+
|
| 583 |
+
// Simulate audio playback
|
| 584 |
+
setTimeout(() => {
|
| 585 |
+
audioBtn.innerHTML = '<i class="fas fa-volume-up mr-2"></i>Pronounce';
|
| 586 |
+
audioBtn.disabled = false;
|
| 587 |
+
}, 2000);
|
| 588 |
+
}
|
| 589 |
+
|
| 590 |
+
// Event listeners
|
| 591 |
+
flashcard.addEventListener('click', handleFlip);
|
| 592 |
+
flipCard.addEventListener('click', handleFlip);
|
| 593 |
+
resetCard.addEventListener('click', () => {
|
| 594 |
+
isFlipped = false;
|
| 595 |
+
flashcard.classList.remove('flipped');
|
| 596 |
+
});
|
| 597 |
+
nextCard.addEventListener('click', handleNext);
|
| 598 |
+
prevCard.addEventListener('click', handlePrev);
|
| 599 |
+
bookmarkBtn.addEventListener('click', (e) => {
|
| 600 |
+
e.stopPropagation();
|
| 601 |
+
handleBookmark();
|
| 602 |
+
});
|
| 603 |
+
audioBtn.addEventListener('click', (e) => {
|
| 604 |
+
e.stopPropagation();
|
| 605 |
+
handleAudio();
|
| 606 |
+
});
|
| 607 |
+
|
| 608 |
+
// Difficulty button events
|
| 609 |
+
difficultyBtns.forEach(btn => {
|
| 610 |
+
btn.addEventListener('click', () => {
|
| 611 |
+
const difficulty = btn.dataset.difficulty;
|
| 612 |
+
handleDifficulty(difficulty);
|
| 613 |
+
});
|
| 614 |
+
});
|
| 615 |
+
|
| 616 |
+
// Mobile menu events
|
| 617 |
+
mobileMenuBtn.addEventListener('click', () => {
|
| 618 |
+
sidebar.classList.remove('-translate-x-full');
|
| 619 |
+
mobileMenuOverlay.classList.remove('hidden');
|
| 620 |
+
});
|
| 621 |
+
|
| 622 |
+
closeSidebar.addEventListener('click', () => {
|
| 623 |
+
sidebar.classList.add('-translate-x-full');
|
| 624 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 625 |
+
});
|
| 626 |
+
|
| 627 |
+
mobileMenuOverlay.addEventListener('click', () => {
|
| 628 |
+
sidebar.classList.add('-translate-x-full');
|
| 629 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 630 |
+
});
|
| 631 |
+
|
| 632 |
+
// Theme toggle functionality
|
| 633 |
+
const themeToggle = document.getElementById('themeToggle');
|
| 634 |
+
const html = document.documentElement;
|
| 635 |
+
|
| 636 |
+
themeToggle.addEventListener('click', () => {
|
| 637 |
+
html.classList.toggle('dark');
|
| 638 |
+
const isDark = html.classList.contains('dark');
|
| 639 |
+
|
| 640 |
+
const toggleSpan = themeToggle.querySelector('span');
|
| 641 |
+
if (isDark) {
|
| 642 |
+
toggleSpan.classList.add('translate-x-6');
|
| 643 |
+
toggleSpan.classList.remove('translate-x-1');
|
| 644 |
+
} else {
|
| 645 |
+
toggleSpan.classList.add('translate-x-1');
|
| 646 |
+
toggleSpan.classList.remove('translate-x-6');
|
| 647 |
+
}
|
| 648 |
+
|
| 649 |
+
localStorage.setItem('theme', isDark ? 'dark' : 'light');
|
| 650 |
+
});
|
| 651 |
+
|
| 652 |
+
// Audio toggle functionality
|
| 653 |
+
const audioToggle = document.getElementById('audioToggle');
|
| 654 |
+
let audioEnabled = true;
|
| 655 |
+
|
| 656 |
+
audioToggle.addEventListener('click', () => {
|
| 657 |
+
audioEnabled = !audioEnabled;
|
| 658 |
+
const toggleSpan = audioToggle.querySelector('span');
|
| 659 |
+
|
| 660 |
+
if (audioEnabled) {
|
| 661 |
+
toggleSpan.classList.add('translate-x-6');
|
| 662 |
+
toggleSpan.classList.remove('translate-x-1');
|
| 663 |
+
audioToggle.classList.add('bg-primary');
|
| 664 |
+
audioToggle.classList.remove('bg-gray-300');
|
| 665 |
+
} else {
|
| 666 |
+
toggleSpan.classList.add('translate-x-1');
|
| 667 |
+
toggleSpan.classList.remove('translate-x-6');
|
| 668 |
+
audioToggle.classList.remove('bg-primary');
|
| 669 |
+
audioToggle.classList.add('bg-gray-300');
|
| 670 |
+
}
|
| 671 |
+
});
|
| 672 |
+
|
| 673 |
+
// Language selection
|
| 674 |
+
const languageSelect = document.getElementById('languageSelect');
|
| 675 |
+
languageSelect.addEventListener('change', (e) => {
|
| 676 |
+
localStorage.setItem('selectedLanguage', e.target.value);
|
| 677 |
+
console.log('Language changed to:', e.target.value);
|
| 678 |
+
});
|
| 679 |
+
|
| 680 |
+
// Keyboard shortcuts
|
| 681 |
+
document.addEventListener('keydown', (e) => {
|
| 682 |
+
switch(e.key) {
|
| 683 |
+
case ' ':
|
| 684 |
+
case 'Enter':
|
| 685 |
+
e.preventDefault();
|
| 686 |
+
handleFlip();
|
| 687 |
+
break;
|
| 688 |
+
case 'ArrowLeft':
|
| 689 |
+
e.preventDefault();
|
| 690 |
+
handlePrev();
|
| 691 |
+
break;
|
| 692 |
+
case 'ArrowRight':
|
| 693 |
+
e.preventDefault();
|
| 694 |
+
handleNext();
|
| 695 |
+
break;
|
| 696 |
+
case '1':
|
| 697 |
+
e.preventDefault();
|
| 698 |
+
handleDifficulty('easy');
|
| 699 |
+
break;
|
| 700 |
+
case '2':
|
| 701 |
+
e.preventDefault();
|
| 702 |
+
handleDifficulty('medium');
|
| 703 |
+
break;
|
| 704 |
+
case '3':
|
| 705 |
+
e.preventDefault();
|
| 706 |
+
handleDifficulty('hard');
|
| 707 |
+
break;
|
| 708 |
+
case 'b':
|
| 709 |
+
e.preventDefault();
|
| 710 |
+
handleBookmark();
|
| 711 |
+
break;
|
| 712 |
+
}
|
| 713 |
+
});
|
| 714 |
+
|
| 715 |
+
// Load saved preferences
|
| 716 |
+
const savedTheme = localStorage.getItem('theme');
|
| 717 |
+
if (savedTheme) {
|
| 718 |
+
html.classList.toggle('dark', savedTheme === 'dark');
|
| 719 |
+
const toggleSpan = themeToggle.querySelector('span');
|
| 720 |
+
if (savedTheme === 'dark') {
|
| 721 |
+
toggleSpan.classList.add('translate-x-6');
|
| 722 |
+
toggleSpan.classList.remove('translate-x-1');
|
| 723 |
+
}
|
| 724 |
+
}
|
| 725 |
+
|
| 726 |
+
const savedLanguage = localStorage.getItem('selectedLanguage');
|
| 727 |
+
if (savedLanguage) {
|
| 728 |
+
languageSelect.value = savedLanguage;
|
| 729 |
+
}
|
| 730 |
+
|
| 731 |
+
// Initialize the app
|
| 732 |
+
init();
|
| 733 |
+
</script>
|
| 734 |
+
</body>
|
| 735 |
+
</html>
|
pages/quiz_dashboard.html
ADDED
|
@@ -0,0 +1,409 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en" class="dark">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>Quiz Dashboard - TriviaVerse Quiz</title>
|
| 7 |
+
<link rel="stylesheet" href="../css/main.css" />
|
| 8 |
+
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet" />
|
| 9 |
+
<script type="module" src="https://static.rocket.new/rocket-web.js?_cfg=https%3A%2F%2Ftriviavers2501back.builtwithrocket.new&_be=https%3A%2F%2Fapplication.rocket.new&_v=0.1.5"></script>
|
| 10 |
+
</head>
|
| 11 |
+
<body class="bg-background text-text-primary transition-theme">
|
| 12 |
+
<!-- Mobile Menu Overlay -->
|
| 13 |
+
<div id="mobileMenuOverlay" class="fixed inset-0 bg-black bg-opacity-50 z-40 hidden lg:hidden"></div>
|
| 14 |
+
|
| 15 |
+
<!-- Sidebar -->
|
| 16 |
+
<aside id="sidebar" class="fixed left-0 top-0 h-full w-80 bg-surface border-r border-border transform -translate-x-full lg:translate-x-0 transition-transform duration-300 z-50 lg:z-auto">
|
| 17 |
+
<div class="p-6 border-b border-border">
|
| 18 |
+
<!-- Logo -->
|
| 19 |
+
<div class="flex items-center space-x-3 mb-6">
|
| 20 |
+
<div class="w-10 h-10 bg-gradient-to-br from-primary to-secondary rounded-lg flex items-center justify-center">
|
| 21 |
+
<i class="fas fa-brain text-white text-lg"></i>
|
| 22 |
+
</div>
|
| 23 |
+
<div>
|
| 24 |
+
<h1 class="text-xl font-bold text-text-primary">TriviaVerse</h1>
|
| 25 |
+
<p class="text-sm text-text-secondary">Quiz Platform</p>
|
| 26 |
+
</div>
|
| 27 |
+
</div>
|
| 28 |
+
|
| 29 |
+
<!-- Close button for mobile -->
|
| 30 |
+
<button id="closeSidebar" class="absolute top-4 right-4 lg:hidden text-text-secondary hover:text-text-primary">
|
| 31 |
+
<i class="fas fa-times text-xl"></i>
|
| 32 |
+
</button>
|
| 33 |
+
</div>
|
| 34 |
+
|
| 35 |
+
<!-- Navigation -->
|
| 36 |
+
<nav class="p-6 space-y-2">
|
| 37 |
+
<a href="quiz_dashboard.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg bg-primary text-white">
|
| 38 |
+
<i class="fas fa-home"></i>
|
| 39 |
+
<span>Dashboard</span>
|
| 40 |
+
</a>
|
| 41 |
+
<a href="active_quiz_interface.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 42 |
+
<i class="fas fa-play-circle"></i>
|
| 43 |
+
<span>Active Quiz</span>
|
| 44 |
+
</a>
|
| 45 |
+
<a href="quiz_results_statistics.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 46 |
+
<i class="fas fa-chart-bar"></i>
|
| 47 |
+
<span>Statistics</span>
|
| 48 |
+
</a>
|
| 49 |
+
<a href="topic_selection_browse.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 50 |
+
<i class="fas fa-book"></i>
|
| 51 |
+
<span>Browse Topics</span>
|
| 52 |
+
</a>
|
| 53 |
+
<a href="settings_preferences.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 54 |
+
<i class="fas fa-cog"></i>
|
| 55 |
+
<span>Settings</span>
|
| 56 |
+
</a>
|
| 57 |
+
</nav>
|
| 58 |
+
|
| 59 |
+
<!-- Game Settings -->
|
| 60 |
+
<div class="p-6 border-t border-border">
|
| 61 |
+
<h3 class="text-sm font-semibold text-text-primary mb-4">Game Settings</h3>
|
| 62 |
+
|
| 63 |
+
<!-- Language Switcher -->
|
| 64 |
+
<div class="mb-4">
|
| 65 |
+
<label class="block text-sm text-text-secondary mb-2">Language</label>
|
| 66 |
+
<select id="languageSelect" class="w-full bg-background border border-border rounded-lg px-3 py-2 text-text-primary focus:outline-none focus:ring-2 focus:ring-primary">
|
| 67 |
+
<option value="en">English</option>
|
| 68 |
+
<option value="te">తెలుగు (Telugu)</option>
|
| 69 |
+
<option value="hi">हिंदी (Hindi)</option>
|
| 70 |
+
<option value="kn">ಕನ್ನಡ (Kannada)</option>
|
| 71 |
+
</select>
|
| 72 |
+
</div>
|
| 73 |
+
|
| 74 |
+
<!-- Theme Toggle -->
|
| 75 |
+
<div class="flex items-center justify-between">
|
| 76 |
+
<span class="text-sm text-text-secondary">Dark Theme</span>
|
| 77 |
+
<button id="themeToggle" class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 78 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 79 |
+
</button>
|
| 80 |
+
</div>
|
| 81 |
+
</div>
|
| 82 |
+
</aside>
|
| 83 |
+
|
| 84 |
+
<!-- Main Content -->
|
| 85 |
+
<main class="lg:ml-80 min-h-screen">
|
| 86 |
+
<!-- Header -->
|
| 87 |
+
<header class="bg-surface border-b border-border p-4 lg:p-6">
|
| 88 |
+
<div class="flex items-center justify-between">
|
| 89 |
+
<!-- Mobile Menu Button -->
|
| 90 |
+
<button id="mobileMenuBtn" class="lg:hidden text-text-primary hover:text-primary">
|
| 91 |
+
<i class="fas fa-bars text-xl"></i>
|
| 92 |
+
</button>
|
| 93 |
+
|
| 94 |
+
<!-- Welcome Message -->
|
| 95 |
+
<div class="flex-1 lg:flex-none">
|
| 96 |
+
<h2 class="text-2xl font-bold text-text-primary">Welcome back, Quiz Master!</h2>
|
| 97 |
+
<p class="text-text-secondary mt-1">Ready to challenge your knowledge today?</p>
|
| 98 |
+
</div>
|
| 99 |
+
|
| 100 |
+
<!-- User Avatar -->
|
| 101 |
+
<div class="hidden lg:flex items-center space-x-3">
|
| 102 |
+
<img src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="User Avatar" class="w-10 h-10 rounded-full object-cover" onerror="this.src='https://images.unsplash.com/photo-1584824486509-112e4181ff6b?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'; this.onerror=null;" />
|
| 103 |
+
<div>
|
| 104 |
+
<p class="text-sm font-medium text-text-primary">John Doe</p>
|
| 105 |
+
<p class="text-xs text-text-secondary">Level 5 Quizzer</p>
|
| 106 |
+
</div>
|
| 107 |
+
</div>
|
| 108 |
+
</div>
|
| 109 |
+
</header>
|
| 110 |
+
|
| 111 |
+
<!-- Dashboard Content -->
|
| 112 |
+
<div class="p-4 lg:p-6 space-y-6">
|
| 113 |
+
<!-- Quick Stats -->
|
| 114 |
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
| 115 |
+
<!-- Current Streak -->
|
| 116 |
+
<div class="card p-6">
|
| 117 |
+
<div class="flex items-center justify-between">
|
| 118 |
+
<div>
|
| 119 |
+
<p class="text-text-secondary text-sm">Current Streak</p>
|
| 120 |
+
<p class="text-3xl font-bold text-primary">12</p>
|
| 121 |
+
</div>
|
| 122 |
+
<div class="w-12 h-12 bg-primary-100 rounded-lg flex items-center justify-center">
|
| 123 |
+
<i class="fas fa-fire text-primary text-xl"></i>
|
| 124 |
+
</div>
|
| 125 |
+
</div>
|
| 126 |
+
<div class="mt-4">
|
| 127 |
+
<div class="progress-bar h-2">
|
| 128 |
+
<div class="progress-fill" style="width: 80%"></div>
|
| 129 |
+
</div>
|
| 130 |
+
<p class="text-xs text-text-secondary mt-1">8 more to beat your record!</p>
|
| 131 |
+
</div>
|
| 132 |
+
</div>
|
| 133 |
+
|
| 134 |
+
<!-- Best Streak -->
|
| 135 |
+
<div class="card p-6">
|
| 136 |
+
<div class="flex items-center justify-between">
|
| 137 |
+
<div>
|
| 138 |
+
<p class="text-text-secondary text-sm">Best Streak</p>
|
| 139 |
+
<p class="text-3xl font-bold text-accent">20</p>
|
| 140 |
+
</div>
|
| 141 |
+
<div class="w-12 h-12 bg-accent-100 rounded-lg flex items-center justify-center">
|
| 142 |
+
<i class="fas fa-trophy text-accent text-xl"></i>
|
| 143 |
+
</div>
|
| 144 |
+
</div>
|
| 145 |
+
<div class="mt-4">
|
| 146 |
+
<p class="text-xs text-success">Personal Best!</p>
|
| 147 |
+
</div>
|
| 148 |
+
</div>
|
| 149 |
+
|
| 150 |
+
<!-- Recent Performance -->
|
| 151 |
+
<div class="card p-6">
|
| 152 |
+
<div class="flex items-center justify-between">
|
| 153 |
+
<div>
|
| 154 |
+
<p class="text-text-secondary text-sm">Avg. Score</p>
|
| 155 |
+
<p class="text-3xl font-bold text-secondary">85%</p>
|
| 156 |
+
</div>
|
| 157 |
+
<div class="w-12 h-12 bg-secondary-100 rounded-lg flex items-center justify-center">
|
| 158 |
+
<i class="fas fa-chart-line text-secondary text-xl"></i>
|
| 159 |
+
</div>
|
| 160 |
+
</div>
|
| 161 |
+
<div class="mt-4">
|
| 162 |
+
<p class="text-xs text-success">+5% from last week</p>
|
| 163 |
+
</div>
|
| 164 |
+
</div>
|
| 165 |
+
</div>
|
| 166 |
+
|
| 167 |
+
<!-- Game Mode Selection -->
|
| 168 |
+
<div class="card p-6">
|
| 169 |
+
<h3 class="text-xl font-semibold text-text-primary mb-4">Choose Your Game Mode</h3>
|
| 170 |
+
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
| 171 |
+
<!-- Multiple Choice Quiz -->
|
| 172 |
+
<div class="border-2 border-primary bg-primary-50 rounded-lg p-6 cursor-pointer hover:shadow-lg transition-all">
|
| 173 |
+
<div class="text-center">
|
| 174 |
+
<div class="w-16 h-16 bg-primary rounded-full flex items-center justify-center mx-auto mb-4">
|
| 175 |
+
<i class="fas fa-list-ul text-white text-2xl"></i>
|
| 176 |
+
</div>
|
| 177 |
+
<h4 class="text-lg font-semibold text-primary mb-2">Multiple Choice</h4>
|
| 178 |
+
<p class="text-sm text-text-secondary">Classic quiz format with 4 options</p>
|
| 179 |
+
<div class="mt-4">
|
| 180 |
+
<span class="inline-block bg-primary text-white text-xs px-2 py-1 rounded-full">Most Popular</span>
|
| 181 |
+
</div>
|
| 182 |
+
</div>
|
| 183 |
+
</div>
|
| 184 |
+
|
| 185 |
+
<!-- True/False -->
|
| 186 |
+
<div class="border border-border rounded-lg p-6 cursor-pointer hover:shadow-lg transition-all hover:border-secondary">
|
| 187 |
+
<div class="text-center">
|
| 188 |
+
<div class="w-16 h-16 bg-secondary-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 189 |
+
<i class="fas fa-check-double text-secondary text-2xl"></i>
|
| 190 |
+
</div>
|
| 191 |
+
<h4 class="text-lg font-semibold text-text-primary mb-2">True/False</h4>
|
| 192 |
+
<p class="text-sm text-text-secondary">Quick binary choice questions</p>
|
| 193 |
+
<div class="mt-4">
|
| 194 |
+
<span class="inline-block bg-secondary-100 text-secondary text-xs px-2 py-1 rounded-full">Coming Soon</span>
|
| 195 |
+
</div>
|
| 196 |
+
</div>
|
| 197 |
+
</div>
|
| 198 |
+
|
| 199 |
+
<!-- Timed Challenge -->
|
| 200 |
+
<div class="border border-border rounded-lg p-6 cursor-pointer hover:shadow-lg transition-all hover:border-accent">
|
| 201 |
+
<div class="text-center">
|
| 202 |
+
<div class="w-16 h-16 bg-accent-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 203 |
+
<i class="fas fa-stopwatch text-accent text-2xl"></i>
|
| 204 |
+
</div>
|
| 205 |
+
<h4 class="text-lg font-semibold text-text-primary mb-2">Timed Challenge</h4>
|
| 206 |
+
<p class="text-sm text-text-secondary">Race against the clock</p>
|
| 207 |
+
<div class="mt-4">
|
| 208 |
+
<span class="inline-block bg-accent-100 text-accent text-xs px-2 py-1 rounded-full">Coming Soon</span>
|
| 209 |
+
</div>
|
| 210 |
+
</div>
|
| 211 |
+
</div>
|
| 212 |
+
</div>
|
| 213 |
+
</div>
|
| 214 |
+
|
| 215 |
+
<!-- Topic Selection -->
|
| 216 |
+
<div class="card p-6">
|
| 217 |
+
<h3 class="text-xl font-semibold text-text-primary mb-4">Select Your Topic</h3>
|
| 218 |
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
| 219 |
+
<!-- Topic Dropdown -->
|
| 220 |
+
<div>
|
| 221 |
+
<label class="block text-sm font-medium text-text-secondary mb-2">Choose Topic</label>
|
| 222 |
+
<select id="topicSelect" class="w-full bg-background border border-border rounded-lg px-4 py-3 text-text-primary focus:outline-none focus:ring-2 focus:ring-primary">
|
| 223 |
+
<option value>Select a topic...</option>
|
| 224 |
+
<option value="python">🐍 Python Programming</option>
|
| 225 |
+
<option value="javascript">⚡ JavaScript</option>
|
| 226 |
+
<option value="science">🔬 General Science</option>
|
| 227 |
+
<option value="history">📚 World History</option>
|
| 228 |
+
<option value="geography">🌍 Geography</option>
|
| 229 |
+
<option value="literature">📖 Literature</option>
|
| 230 |
+
<option value="mathematics">🔢 Mathematics</option>
|
| 231 |
+
<option value="technology">💻 Technology</option>
|
| 232 |
+
</select>
|
| 233 |
+
</div>
|
| 234 |
+
|
| 235 |
+
<!-- Trending Topics -->
|
| 236 |
+
<div>
|
| 237 |
+
<h4 class="text-sm font-medium text-text-secondary mb-3">🔥 Trending Topics</h4>
|
| 238 |
+
<div class="space-y-2">
|
| 239 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg border border-border hover:border-primary cursor-pointer transition-colors">
|
| 240 |
+
<div class="flex items-center space-x-3">
|
| 241 |
+
<div class="w-8 h-8 bg-primary-100 rounded-full flex items-center justify-center">
|
| 242 |
+
<i class="fab fa-python text-primary text-sm"></i>
|
| 243 |
+
</div>
|
| 244 |
+
<div>
|
| 245 |
+
<p class="text-sm font-medium text-text-primary">Python Programming</p>
|
| 246 |
+
<p class="text-xs text-text-secondary">Featured Topic</p>
|
| 247 |
+
</div>
|
| 248 |
+
</div>
|
| 249 |
+
<span class="text-xs bg-primary text-white px-2 py-1 rounded-full">Hot</span>
|
| 250 |
+
</div>
|
| 251 |
+
|
| 252 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg border border-border hover:border-secondary cursor-pointer transition-colors">
|
| 253 |
+
<div class="flex items-center space-x-3">
|
| 254 |
+
<div class="w-8 h-8 bg-secondary-100 rounded-full flex items-center justify-center">
|
| 255 |
+
<i class="fas fa-atom text-secondary text-sm"></i>
|
| 256 |
+
</div>
|
| 257 |
+
<div>
|
| 258 |
+
<p class="text-sm font-medium text-text-primary">Quantum Physics</p>
|
| 259 |
+
<p class="text-xs text-text-secondary">Advanced Science</p>
|
| 260 |
+
</div>
|
| 261 |
+
</div>
|
| 262 |
+
<span class="text-xs bg-secondary text-white px-2 py-1 rounded-full">New</span>
|
| 263 |
+
</div>
|
| 264 |
+
|
| 265 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg border border-border hover:border-accent cursor-pointer transition-colors">
|
| 266 |
+
<div class="flex items-center space-x-3">
|
| 267 |
+
<div class="w-8 h-8 bg-accent-100 rounded-full flex items-center justify-center">
|
| 268 |
+
<i class="fas fa-globe text-accent text-sm"></i>
|
| 269 |
+
</div>
|
| 270 |
+
<div>
|
| 271 |
+
<p class="text-sm font-medium text-text-primary">World Geography</p>
|
| 272 |
+
<p class="text-xs text-text-secondary">Popular Choice</p>
|
| 273 |
+
</div>
|
| 274 |
+
</div>
|
| 275 |
+
<span class="text-xs bg-accent text-white px-2 py-1 rounded-full">Top</span>
|
| 276 |
+
</div>
|
| 277 |
+
</div>
|
| 278 |
+
</div>
|
| 279 |
+
</div>
|
| 280 |
+
</div>
|
| 281 |
+
|
| 282 |
+
<!-- Start Quiz Button -->
|
| 283 |
+
<div class="text-center">
|
| 284 |
+
<button id="startQuizBtn" class="btn btn-primary text-lg px-8 py-4 rounded-xl shadow-lg hover:shadow-xl transform hover:scale-105 transition-all duration-200">
|
| 285 |
+
<i class="fas fa-play mr-2"></i>
|
| 286 |
+
Start Quiz Adventure
|
| 287 |
+
</button>
|
| 288 |
+
<p class="text-sm text-text-secondary mt-2">Select a topic above to begin your quiz journey</p>
|
| 289 |
+
</div>
|
| 290 |
+
</div>
|
| 291 |
+
</main>
|
| 292 |
+
|
| 293 |
+
<script>
|
| 294 |
+
// Mobile menu functionality
|
| 295 |
+
const mobileMenuBtn = document.getElementById('mobileMenuBtn');
|
| 296 |
+
const sidebar = document.getElementById('sidebar');
|
| 297 |
+
const mobileMenuOverlay = document.getElementById('mobileMenuOverlay');
|
| 298 |
+
const closeSidebar = document.getElementById('closeSidebar');
|
| 299 |
+
|
| 300 |
+
mobileMenuBtn.addEventListener('click', () => {
|
| 301 |
+
sidebar.classList.remove('-translate-x-full');
|
| 302 |
+
mobileMenuOverlay.classList.remove('hidden');
|
| 303 |
+
});
|
| 304 |
+
|
| 305 |
+
closeSidebar.addEventListener('click', () => {
|
| 306 |
+
sidebar.classList.add('-translate-x-full');
|
| 307 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 308 |
+
});
|
| 309 |
+
|
| 310 |
+
mobileMenuOverlay.addEventListener('click', () => {
|
| 311 |
+
sidebar.classList.add('-translate-x-full');
|
| 312 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 313 |
+
});
|
| 314 |
+
|
| 315 |
+
// Theme toggle functionality
|
| 316 |
+
const themeToggle = document.getElementById('themeToggle');
|
| 317 |
+
const html = document.documentElement;
|
| 318 |
+
|
| 319 |
+
themeToggle.addEventListener('click', () => {
|
| 320 |
+
html.classList.toggle('dark');
|
| 321 |
+
const isDark = html.classList.contains('dark');
|
| 322 |
+
|
| 323 |
+
// Update toggle button
|
| 324 |
+
const toggleSpan = themeToggle.querySelector('span');
|
| 325 |
+
if (isDark) {
|
| 326 |
+
toggleSpan.classList.add('translate-x-6');
|
| 327 |
+
toggleSpan.classList.remove('translate-x-1');
|
| 328 |
+
} else {
|
| 329 |
+
toggleSpan.classList.add('translate-x-1');
|
| 330 |
+
toggleSpan.classList.remove('translate-x-6');
|
| 331 |
+
}
|
| 332 |
+
|
| 333 |
+
// Save preference
|
| 334 |
+
localStorage.setItem('theme', isDark ? 'dark' : 'light');
|
| 335 |
+
});
|
| 336 |
+
|
| 337 |
+
// Load saved theme
|
| 338 |
+
const savedTheme = localStorage.getItem('theme');
|
| 339 |
+
if (savedTheme) {
|
| 340 |
+
html.classList.toggle('dark', savedTheme === 'dark');
|
| 341 |
+
const toggleSpan = themeToggle.querySelector('span');
|
| 342 |
+
if (savedTheme === 'dark') {
|
| 343 |
+
toggleSpan.classList.add('translate-x-6');
|
| 344 |
+
toggleSpan.classList.remove('translate-x-1');
|
| 345 |
+
} else {
|
| 346 |
+
toggleSpan.classList.add('translate-x-1');
|
| 347 |
+
toggleSpan.classList.remove('translate-x-6');
|
| 348 |
+
}
|
| 349 |
+
}
|
| 350 |
+
|
| 351 |
+
// Language selection
|
| 352 |
+
const languageSelect = document.getElementById('languageSelect');
|
| 353 |
+
languageSelect.addEventListener('change', (e) => {
|
| 354 |
+
localStorage.setItem('selectedLanguage', e.target.value);
|
| 355 |
+
// Here you would implement language switching logic
|
| 356 |
+
console.log('Language changed to:', e.target.value);
|
| 357 |
+
});
|
| 358 |
+
|
| 359 |
+
// Load saved language
|
| 360 |
+
const savedLanguage = localStorage.getItem('selectedLanguage');
|
| 361 |
+
if (savedLanguage) {
|
| 362 |
+
languageSelect.value = savedLanguage;
|
| 363 |
+
}
|
| 364 |
+
|
| 365 |
+
// Topic selection
|
| 366 |
+
const topicSelect = document.getElementById('topicSelect');
|
| 367 |
+
const startQuizBtn = document.getElementById('startQuizBtn');
|
| 368 |
+
|
| 369 |
+
topicSelect.addEventListener('change', (e) => {
|
| 370 |
+
if (e.target.value) {
|
| 371 |
+
startQuizBtn.disabled = false;
|
| 372 |
+
startQuizBtn.classList.remove('opacity-50', 'cursor-not-allowed');
|
| 373 |
+
} else {
|
| 374 |
+
startQuizBtn.disabled = true;
|
| 375 |
+
startQuizBtn.classList.add('opacity-50', 'cursor-not-allowed');
|
| 376 |
+
}
|
| 377 |
+
});
|
| 378 |
+
|
| 379 |
+
// Start quiz functionality
|
| 380 |
+
startQuizBtn.addEventListener('click', () => {
|
| 381 |
+
const selectedTopic = topicSelect.value;
|
| 382 |
+
if (selectedTopic) {
|
| 383 |
+
localStorage.setItem('selectedTopic', selectedTopic);
|
| 384 |
+
window.location.href = 'active_quiz_interface.html';
|
| 385 |
+
} else {
|
| 386 |
+
alert('Please select a topic first!');
|
| 387 |
+
}
|
| 388 |
+
});
|
| 389 |
+
|
| 390 |
+
// Trending topic clicks
|
| 391 |
+
document.querySelectorAll('[data-topic]').forEach(topic => {
|
| 392 |
+
topic.addEventListener('click', (e) => {
|
| 393 |
+
const topicValue = e.currentTarget.dataset.topic;
|
| 394 |
+
topicSelect.value = topicValue;
|
| 395 |
+
topicSelect.dispatchEvent(new Event('change'));
|
| 396 |
+
});
|
| 397 |
+
});
|
| 398 |
+
|
| 399 |
+
// Initialize
|
| 400 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 401 |
+
// Set initial state of start button
|
| 402 |
+
if (!topicSelect.value) {
|
| 403 |
+
startQuizBtn.disabled = true;
|
| 404 |
+
startQuizBtn.classList.add('opacity-50', 'cursor-not-allowed');
|
| 405 |
+
}
|
| 406 |
+
});
|
| 407 |
+
</script>
|
| 408 |
+
</body>
|
| 409 |
+
</html>
|
pages/quiz_results_statistics.html
ADDED
|
@@ -0,0 +1,543 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en" class="dark">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>Quiz Results & Statistics - TriviaVerse Quiz</title>
|
| 7 |
+
<link rel="stylesheet" href="../css/main.css" />
|
| 8 |
+
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet" />
|
| 9 |
+
<script type="module" src="https://static.rocket.new/rocket-web.js?_cfg=https%3A%2F%2Ftriviavers2501back.builtwithrocket.new&_be=https%3A%2F%2Fapplication.rocket.new&_v=0.1.5"></script>
|
| 10 |
+
</head>
|
| 11 |
+
<body class="bg-background text-text-primary transition-theme">
|
| 12 |
+
<!-- Mobile Menu Overlay -->
|
| 13 |
+
<div id="mobileMenuOverlay" class="fixed inset-0 bg-black bg-opacity-50 z-40 hidden lg:hidden"></div>
|
| 14 |
+
|
| 15 |
+
<!-- Sidebar -->
|
| 16 |
+
<aside id="sidebar" class="fixed left-0 top-0 h-full w-80 bg-surface border-r border-border transform -translate-x-full lg:translate-x-0 transition-transform duration-300 z-50 lg:z-auto">
|
| 17 |
+
<div class="p-6 border-b border-border">
|
| 18 |
+
<!-- Logo -->
|
| 19 |
+
<div class="flex items-center space-x-3 mb-6">
|
| 20 |
+
<div class="w-10 h-10 bg-gradient-to-br from-primary to-secondary rounded-lg flex items-center justify-center">
|
| 21 |
+
<i class="fas fa-brain text-white text-lg"></i>
|
| 22 |
+
</div>
|
| 23 |
+
<div>
|
| 24 |
+
<h1 class="text-xl font-bold text-text-primary">TriviaVerse</h1>
|
| 25 |
+
<p class="text-sm text-text-secondary">Quiz Platform</p>
|
| 26 |
+
</div>
|
| 27 |
+
</div>
|
| 28 |
+
|
| 29 |
+
<!-- Close button for mobile -->
|
| 30 |
+
<button id="closeSidebar" class="absolute top-4 right-4 lg:hidden text-text-secondary hover:text-text-primary">
|
| 31 |
+
<i class="fas fa-times text-xl"></i>
|
| 32 |
+
</button>
|
| 33 |
+
</div>
|
| 34 |
+
|
| 35 |
+
<!-- Navigation -->
|
| 36 |
+
<nav class="p-6 space-y-2">
|
| 37 |
+
<a href="quiz_dashboard.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 38 |
+
<i class="fas fa-home"></i>
|
| 39 |
+
<span>Dashboard</span>
|
| 40 |
+
</a>
|
| 41 |
+
<a href="active_quiz_interface.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 42 |
+
<i class="fas fa-play-circle"></i>
|
| 43 |
+
<span>Active Quiz</span>
|
| 44 |
+
</a>
|
| 45 |
+
<a href="quiz_results_statistics.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg bg-primary text-white">
|
| 46 |
+
<i class="fas fa-chart-bar"></i>
|
| 47 |
+
<span>Statistics</span>
|
| 48 |
+
</a>
|
| 49 |
+
<a href="topic_selection_browse.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 50 |
+
<i class="fas fa-book"></i>
|
| 51 |
+
<span>Browse Topics</span>
|
| 52 |
+
</a>
|
| 53 |
+
<a href="settings_preferences.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 54 |
+
<i class="fas fa-cog"></i>
|
| 55 |
+
<span>Settings</span>
|
| 56 |
+
</a>
|
| 57 |
+
</nav>
|
| 58 |
+
|
| 59 |
+
<!-- Game Settings -->
|
| 60 |
+
<div class="p-6 border-t border-border">
|
| 61 |
+
<h3 class="text-sm font-semibold text-text-primary mb-4">Game Settings</h3>
|
| 62 |
+
|
| 63 |
+
<!-- Language Switcher -->
|
| 64 |
+
<div class="mb-4">
|
| 65 |
+
<label class="block text-sm text-text-secondary mb-2">Language</label>
|
| 66 |
+
<select id="languageSelect" class="w-full bg-background border border-border rounded-lg px-3 py-2 text-text-primary focus:outline-none focus:ring-2 focus:ring-primary">
|
| 67 |
+
<option value="en">English</option>
|
| 68 |
+
<option value="te">తెలుగు (Telugu)</option>
|
| 69 |
+
<option value="hi">हिंदी (Hindi)</option>
|
| 70 |
+
<option value="kn">ಕನ್ನಡ (Kannada)</option>
|
| 71 |
+
</select>
|
| 72 |
+
</div>
|
| 73 |
+
|
| 74 |
+
<!-- Theme Toggle -->
|
| 75 |
+
<div class="flex items-center justify-between">
|
| 76 |
+
<span class="text-sm text-text-secondary">Dark Theme</span>
|
| 77 |
+
<button id="themeToggle" class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 78 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 79 |
+
</button>
|
| 80 |
+
</div>
|
| 81 |
+
</div>
|
| 82 |
+
</aside>
|
| 83 |
+
|
| 84 |
+
<!-- Main Content -->
|
| 85 |
+
<main class="lg:ml-80 min-h-screen">
|
| 86 |
+
<!-- Header -->
|
| 87 |
+
<header class="bg-surface border-b border-border p-4 lg:p-6">
|
| 88 |
+
<div class="flex items-center justify-between">
|
| 89 |
+
<!-- Mobile Menu Button -->
|
| 90 |
+
<button id="mobileMenuBtn" class="lg:hidden text-text-primary hover:text-primary">
|
| 91 |
+
<i class="fas fa-bars text-xl"></i>
|
| 92 |
+
</button>
|
| 93 |
+
|
| 94 |
+
<!-- Page Title -->
|
| 95 |
+
<div class="flex-1 lg:flex-none">
|
| 96 |
+
<h2 class="text-2xl font-bold text-text-primary">Quiz Results & Statistics</h2>
|
| 97 |
+
<p class="text-text-secondary mt-1">Your performance analysis and progress tracking</p>
|
| 98 |
+
</div>
|
| 99 |
+
|
| 100 |
+
<!-- User Avatar -->
|
| 101 |
+
<div class="hidden lg:flex items-center space-x-3">
|
| 102 |
+
<img src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="User Avatar" class="w-10 h-10 rounded-full object-cover" onerror="this.src='https://images.unsplash.com/photo-1584824486509-112e4181ff6b?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'; this.onerror=null;" />
|
| 103 |
+
<div>
|
| 104 |
+
<p class="text-sm font-medium text-text-primary">John Doe</p>
|
| 105 |
+
<p class="text-xs text-text-secondary">Level 5 Quizzer</p>
|
| 106 |
+
</div>
|
| 107 |
+
</div>
|
| 108 |
+
</div>
|
| 109 |
+
</header>
|
| 110 |
+
|
| 111 |
+
<!-- Results Content -->
|
| 112 |
+
<div class="p-4 lg:p-6 space-y-6">
|
| 113 |
+
<!-- Completion Celebration -->
|
| 114 |
+
<div class="card p-6 lg:p-8 text-center bg-gradient-to-br from-primary-50 to-secondary-50 border-primary-100">
|
| 115 |
+
<div class="mb-6">
|
| 116 |
+
<div class="w-20 h-20 bg-gradient-to-br from-primary to-secondary rounded-full flex items-center justify-center mx-auto mb-4">
|
| 117 |
+
<i class="fas fa-trophy text-white text-3xl"></i>
|
| 118 |
+
</div>
|
| 119 |
+
<h3 class="text-3xl font-bold text-primary mb-2">Quiz Completed!</h3>
|
| 120 |
+
<p class="text-text-secondary">Congratulations on finishing the Python Programming quiz</p>
|
| 121 |
+
</div>
|
| 122 |
+
|
| 123 |
+
<!-- Final Score Display -->
|
| 124 |
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-6">
|
| 125 |
+
<div class="text-center">
|
| 126 |
+
<div class="text-4xl font-bold text-primary mb-2">85%</div>
|
| 127 |
+
<p class="text-sm text-text-secondary">Final Score</p>
|
| 128 |
+
</div>
|
| 129 |
+
<div class="text-center">
|
| 130 |
+
<div class="text-4xl font-bold text-secondary mb-2">17/20</div>
|
| 131 |
+
<p class="text-sm text-text-secondary">Correct Answers</p>
|
| 132 |
+
</div>
|
| 133 |
+
<div class="text-center">
|
| 134 |
+
<div class="text-4xl font-bold text-accent mb-2">8:45</div>
|
| 135 |
+
<p class="text-sm text-text-secondary">Time Taken</p>
|
| 136 |
+
</div>
|
| 137 |
+
</div>
|
| 138 |
+
|
| 139 |
+
<!-- Progress Ring -->
|
| 140 |
+
<div class="relative w-32 h-32 mx-auto mb-6">
|
| 141 |
+
<svg class="w-32 h-32 transform -rotate-90" viewBox="0 0 120 120">
|
| 142 |
+
<circle cx="60" cy="60" r="50" stroke="currentColor" stroke-width="8" fill="none" class="text-border opacity-20"/>
|
| 143 |
+
<circle cx="60" cy="60" r="50" stroke="currentColor" stroke-width="8" fill="none" class="text-primary" stroke-dasharray="314" stroke-dashoffset="47" stroke-linecap="round"/>
|
| 144 |
+
</svg>
|
| 145 |
+
<div class="absolute inset-0 flex items-center justify-center">
|
| 146 |
+
<span class="text-2xl font-bold text-primary">85%</span>
|
| 147 |
+
</div>
|
| 148 |
+
</div>
|
| 149 |
+
|
| 150 |
+
<!-- Social Sharing -->
|
| 151 |
+
<div class="flex justify-center space-x-3 mb-6">
|
| 152 |
+
<button class="btn bg-blue-600 text-white hover:bg-blue-700 px-4 py-2 rounded-lg">
|
| 153 |
+
<i class="fab fa-twitter mr-2"></i>Share
|
| 154 |
+
</button>
|
| 155 |
+
<button class="btn bg-blue-800 text-white hover:bg-blue-900 px-4 py-2 rounded-lg">
|
| 156 |
+
<i class="fab fa-facebook mr-2"></i>Share
|
| 157 |
+
</button>
|
| 158 |
+
<button class="btn bg-green-600 text-white hover:bg-green-700 px-4 py-2 rounded-lg">
|
| 159 |
+
<i class="fab fa-whatsapp mr-2"></i>Share
|
| 160 |
+
</button>
|
| 161 |
+
</div>
|
| 162 |
+
</div>
|
| 163 |
+
|
| 164 |
+
<!-- Desktop Two-Column Layout -->
|
| 165 |
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
| 166 |
+
<!-- Left Column - Summary Metrics -->
|
| 167 |
+
<div class="space-y-6">
|
| 168 |
+
<!-- Current Session Stats -->
|
| 169 |
+
<div class="card p-6">
|
| 170 |
+
<h3 class="text-lg font-semibold text-text-primary mb-4 flex items-center">
|
| 171 |
+
<i class="fas fa-chart-line text-primary mr-2"></i>
|
| 172 |
+
Session Summary
|
| 173 |
+
</h3>
|
| 174 |
+
<div class="space-y-4">
|
| 175 |
+
<div class="flex justify-between items-center">
|
| 176 |
+
<span class="text-text-secondary">Questions Attempted</span>
|
| 177 |
+
<span class="font-semibold text-text-primary">20/20</span>
|
| 178 |
+
</div>
|
| 179 |
+
<div class="flex justify-between items-center">
|
| 180 |
+
<span class="text-text-secondary">Correct Answers</span>
|
| 181 |
+
<span class="font-semibold text-success">17</span>
|
| 182 |
+
</div>
|
| 183 |
+
<div class="flex justify-between items-center">
|
| 184 |
+
<span class="text-text-secondary">Incorrect Answers</span>
|
| 185 |
+
<span class="font-semibold text-error">3</span>
|
| 186 |
+
</div>
|
| 187 |
+
<div class="flex justify-between items-center">
|
| 188 |
+
<span class="text-text-secondary">Accuracy Rate</span>
|
| 189 |
+
<span class="font-semibold text-primary">85%</span>
|
| 190 |
+
</div>
|
| 191 |
+
<div class="flex justify-between items-center">
|
| 192 |
+
<span class="text-text-secondary">Average Time per Question</span>
|
| 193 |
+
<span class="font-semibold text-text-primary">26s</span>
|
| 194 |
+
</div>
|
| 195 |
+
</div>
|
| 196 |
+
</div>
|
| 197 |
+
|
| 198 |
+
<!-- Historical Performance -->
|
| 199 |
+
<div class="card p-6">
|
| 200 |
+
<h3 class="text-lg font-semibold text-text-primary mb-4 flex items-center">
|
| 201 |
+
<i class="fas fa-history text-secondary mr-2"></i>
|
| 202 |
+
Historical Performance
|
| 203 |
+
</h3>
|
| 204 |
+
<div class="space-y-4">
|
| 205 |
+
<div class="flex justify-between items-center">
|
| 206 |
+
<span class="text-text-secondary">Total Quizzes Taken</span>
|
| 207 |
+
<span class="font-semibold text-text-primary">47</span>
|
| 208 |
+
</div>
|
| 209 |
+
<div class="flex justify-between items-center">
|
| 210 |
+
<span class="text-text-secondary">Average Score</span>
|
| 211 |
+
<span class="font-semibold text-primary">78%</span>
|
| 212 |
+
</div>
|
| 213 |
+
<div class="flex justify-between items-center">
|
| 214 |
+
<span class="text-text-secondary">Best Score</span>
|
| 215 |
+
<span class="font-semibold text-success">95%</span>
|
| 216 |
+
</div>
|
| 217 |
+
<div class="flex justify-between items-center">
|
| 218 |
+
<span class="text-text-secondary">Current Streak</span>
|
| 219 |
+
<span class="font-semibold text-accent">12 quizzes</span>
|
| 220 |
+
</div>
|
| 221 |
+
<div class="flex justify-between items-center">
|
| 222 |
+
<span class="text-text-secondary">Best Streak</span>
|
| 223 |
+
<span class="font-semibold text-accent">20 quizzes</span>
|
| 224 |
+
</div>
|
| 225 |
+
</div>
|
| 226 |
+
|
| 227 |
+
<!-- Improvement Trend -->
|
| 228 |
+
<div class="mt-6">
|
| 229 |
+
<h4 class="text-sm font-medium text-text-secondary mb-3">Performance Trend (Last 7 Days)</h4>
|
| 230 |
+
<div class="h-32 bg-background rounded-lg p-4 flex items-end justify-between space-x-1">
|
| 231 |
+
<div class="bg-primary h-16 w-6 rounded-t"></div>
|
| 232 |
+
<div class="bg-primary h-20 w-6 rounded-t"></div>
|
| 233 |
+
<div class="bg-primary h-12 w-6 rounded-t"></div>
|
| 234 |
+
<div class="bg-primary h-24 w-6 rounded-t"></div>
|
| 235 |
+
<div class="bg-primary h-18 w-6 rounded-t"></div>
|
| 236 |
+
<div class="bg-primary h-22 w-6 rounded-t"></div>
|
| 237 |
+
<div class="bg-primary h-28 w-6 rounded-t"></div>
|
| 238 |
+
</div>
|
| 239 |
+
<div class="flex justify-between text-xs text-text-secondary mt-2">
|
| 240 |
+
<span>Mon</span>
|
| 241 |
+
<span>Tue</span>
|
| 242 |
+
<span>Wed</span>
|
| 243 |
+
<span>Thu</span>
|
| 244 |
+
<span>Fri</span>
|
| 245 |
+
<span>Sat</span>
|
| 246 |
+
<span>Sun</span>
|
| 247 |
+
</div>
|
| 248 |
+
</div>
|
| 249 |
+
</div>
|
| 250 |
+
|
| 251 |
+
<!-- Topic Performance -->
|
| 252 |
+
<div class="card p-6">
|
| 253 |
+
<h3 class="text-lg font-semibold text-text-primary mb-4 flex items-center">
|
| 254 |
+
<i class="fas fa-book text-accent mr-2"></i>
|
| 255 |
+
Topic Performance
|
| 256 |
+
</h3>
|
| 257 |
+
<div class="space-y-4">
|
| 258 |
+
<div>
|
| 259 |
+
<div class="flex justify-between items-center mb-2">
|
| 260 |
+
<span class="text-sm text-text-secondary">Python Basics</span>
|
| 261 |
+
<span class="text-sm font-semibold text-success">90%</span>
|
| 262 |
+
</div>
|
| 263 |
+
<div class="progress-bar h-2">
|
| 264 |
+
<div class="progress-fill bg-success" style="width: 90%"></div>
|
| 265 |
+
</div>
|
| 266 |
+
</div>
|
| 267 |
+
<div>
|
| 268 |
+
<div class="flex justify-between items-center mb-2">
|
| 269 |
+
<span class="text-sm text-text-secondary">Data Structures</span>
|
| 270 |
+
<span class="text-sm font-semibold text-primary">85%</span>
|
| 271 |
+
</div>
|
| 272 |
+
<div class="progress-bar h-2">
|
| 273 |
+
<div class="progress-fill" style="width: 85%"></div>
|
| 274 |
+
</div>
|
| 275 |
+
</div>
|
| 276 |
+
<div>
|
| 277 |
+
<div class="flex justify-between items-center mb-2">
|
| 278 |
+
<span class="text-sm text-text-secondary">Object-Oriented Programming</span>
|
| 279 |
+
<span class="text-sm font-semibold text-warning">75%</span>
|
| 280 |
+
</div>
|
| 281 |
+
<div class="progress-bar h-2">
|
| 282 |
+
<div class="progress-fill bg-warning" style="width: 75%"></div>
|
| 283 |
+
</div>
|
| 284 |
+
</div>
|
| 285 |
+
<div>
|
| 286 |
+
<div class="flex justify-between items-center mb-2">
|
| 287 |
+
<span class="text-sm text-text-secondary">Advanced Concepts</span>
|
| 288 |
+
<span class="text-sm font-semibold text-error">65%</span>
|
| 289 |
+
</div>
|
| 290 |
+
<div class="progress-bar h-2">
|
| 291 |
+
<div class="progress-fill bg-error" style="width: 65%"></div>
|
| 292 |
+
</div>
|
| 293 |
+
</div>
|
| 294 |
+
</div>
|
| 295 |
+
</div>
|
| 296 |
+
</div>
|
| 297 |
+
|
| 298 |
+
<!-- Right Column - Detailed Breakdown -->
|
| 299 |
+
<div class="space-y-6">
|
| 300 |
+
<!-- Question-by-Question Analysis -->
|
| 301 |
+
<div class="card p-6">
|
| 302 |
+
<h3 class="text-lg font-semibold text-text-primary mb-4 flex items-center">
|
| 303 |
+
<i class="fas fa-list-check text-primary mr-2"></i>
|
| 304 |
+
Question Analysis
|
| 305 |
+
</h3>
|
| 306 |
+
<div class="space-y-4 max-h-96 overflow-y-auto">
|
| 307 |
+
<!-- Correct Answer -->
|
| 308 |
+
<div class="border border-success-100 bg-success-50 rounded-lg p-4">
|
| 309 |
+
<div class="flex items-start space-x-3">
|
| 310 |
+
<div class="w-8 h-8 bg-success rounded-full flex items-center justify-center flex-shrink-0">
|
| 311 |
+
<i class="fas fa-check text-white text-sm"></i>
|
| 312 |
+
</div>
|
| 313 |
+
<div class="flex-1">
|
| 314 |
+
<p class="text-sm font-medium text-text-primary mb-1">Question 1</p>
|
| 315 |
+
<p class="text-sm text-text-secondary mb-2">What is the output of print(type([]))?</p>
|
| 316 |
+
<p class="text-xs text-success font-medium">Correct: <class 'list'></p>
|
| 317 |
+
</div>
|
| 318 |
+
</div>
|
| 319 |
+
</div>
|
| 320 |
+
|
| 321 |
+
<!-- Incorrect Answer -->
|
| 322 |
+
<div class="border border-error-100 bg-error-50 rounded-lg p-4">
|
| 323 |
+
<div class="flex items-start space-x-3">
|
| 324 |
+
<div class="w-8 h-8 bg-error rounded-full flex items-center justify-center flex-shrink-0">
|
| 325 |
+
<i class="fas fa-times text-white text-sm"></i>
|
| 326 |
+
</div>
|
| 327 |
+
<div class="flex-1">
|
| 328 |
+
<p class="text-sm font-medium text-text-primary mb-1">Question 5</p>
|
| 329 |
+
<p class="text-sm text-text-secondary mb-2">Which method is used to add an element to a set?</p>
|
| 330 |
+
<p class="text-xs text-error font-medium mb-1">Your answer: append()</p>
|
| 331 |
+
<p class="text-xs text-success font-medium mb-2">Correct: add()</p>
|
| 332 |
+
<p class="text-xs text-text-secondary">Explanation: Sets use the add() method to insert elements, while lists use append().</p>
|
| 333 |
+
</div>
|
| 334 |
+
</div>
|
| 335 |
+
</div>
|
| 336 |
+
|
| 337 |
+
<!-- More questions... -->
|
| 338 |
+
<div class="border border-success-100 bg-success-50 rounded-lg p-4">
|
| 339 |
+
<div class="flex items-start space-x-3">
|
| 340 |
+
<div class="w-8 h-8 bg-success rounded-full flex items-center justify-center flex-shrink-0">
|
| 341 |
+
<i class="fas fa-check text-white text-sm"></i>
|
| 342 |
+
</div>
|
| 343 |
+
<div class="flex-1">
|
| 344 |
+
<p class="text-sm font-medium text-text-primary mb-1">Question 8</p>
|
| 345 |
+
<p class="text-sm text-text-secondary mb-2">What does the len() function return?</p>
|
| 346 |
+
<p class="text-xs text-success font-medium">Correct: The number of items in an object</p>
|
| 347 |
+
</div>
|
| 348 |
+
</div>
|
| 349 |
+
</div>
|
| 350 |
+
|
| 351 |
+
<div class="border border-error-100 bg-error-50 rounded-lg p-4">
|
| 352 |
+
<div class="flex items-start space-x-3">
|
| 353 |
+
<div class="w-8 h-8 bg-error rounded-full flex items-center justify-center flex-shrink-0">
|
| 354 |
+
<i class="fas fa-times text-white text-sm"></i>
|
| 355 |
+
</div>
|
| 356 |
+
<div class="flex-1">
|
| 357 |
+
<p class="text-sm font-medium text-text-primary mb-1">Question 12</p>
|
| 358 |
+
<p class="text-sm text-text-secondary mb-2">Which keyword is used to define a function in Python?</p>
|
| 359 |
+
<p class="text-xs text-error font-medium mb-1">Your answer: function</p>
|
| 360 |
+
<p class="text-xs text-success font-medium mb-2">Correct: def</p>
|
| 361 |
+
<p class="text-xs text-text-secondary">Explanation: Python uses 'def' keyword to define functions, not 'function'.</p>
|
| 362 |
+
</div>
|
| 363 |
+
</div>
|
| 364 |
+
</div>
|
| 365 |
+
</div>
|
| 366 |
+
</div>
|
| 367 |
+
|
| 368 |
+
<!-- Knowledge Gaps -->
|
| 369 |
+
<div class="card p-6">
|
| 370 |
+
<h3 class="text-lg font-semibold text-text-primary mb-4 flex items-center">
|
| 371 |
+
<i class="fas fa-lightbulb text-warning mr-2"></i>
|
| 372 |
+
Areas for Improvement
|
| 373 |
+
</h3>
|
| 374 |
+
<div class="space-y-3">
|
| 375 |
+
<div class="flex items-center space-x-3 p-3 bg-warning-50 border border-warning-100 rounded-lg">
|
| 376 |
+
<i class="fas fa-exclamation-triangle text-warning"></i>
|
| 377 |
+
<div>
|
| 378 |
+
<p class="text-sm font-medium text-text-primary">Set Operations</p>
|
| 379 |
+
<p class="text-xs text-text-secondary">Review add(), remove(), and discard() methods</p>
|
| 380 |
+
</div>
|
| 381 |
+
</div>
|
| 382 |
+
<div class="flex items-center space-x-3 p-3 bg-warning-50 border border-warning-100 rounded-lg">
|
| 383 |
+
<i class="fas fa-exclamation-triangle text-warning"></i>
|
| 384 |
+
<div>
|
| 385 |
+
<p class="text-sm font-medium text-text-primary">Function Definition</p>
|
| 386 |
+
<p class="text-xs text-text-secondary">Practice function syntax and parameters</p>
|
| 387 |
+
</div>
|
| 388 |
+
</div>
|
| 389 |
+
<div class="flex items-center space-x-3 p-3 bg-warning-50 border border-warning-100 rounded-lg">
|
| 390 |
+
<i class="fas fa-exclamation-triangle text-warning"></i>
|
| 391 |
+
<div>
|
| 392 |
+
<p class="text-sm font-medium text-text-primary">Exception Handling</p>
|
| 393 |
+
<p class="text-xs text-text-secondary">Study try-except blocks and error types</p>
|
| 394 |
+
</div>
|
| 395 |
+
</div>
|
| 396 |
+
</div>
|
| 397 |
+
</div>
|
| 398 |
+
</div>
|
| 399 |
+
</div>
|
| 400 |
+
|
| 401 |
+
<!-- Action Buttons -->
|
| 402 |
+
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
| 403 |
+
<button onclick="window.location.href='active_quiz_interface.html'" class="btn btn-primary px-6 py-3 rounded-lg text-lg">
|
| 404 |
+
<i class="fas fa-redo mr-2"></i>
|
| 405 |
+
Retake Quiz
|
| 406 |
+
</button>
|
| 407 |
+
<button onclick="window.location.href='topic_selection_browse.html'" class="btn btn-secondary px-6 py-3 rounded-lg text-lg">
|
| 408 |
+
<i class="fas fa-book mr-2"></i>
|
| 409 |
+
Try New Topic
|
| 410 |
+
</button>
|
| 411 |
+
<button onclick="window.location.href='quiz_dashboard.html'" class="btn bg-surface border border-border text-text-primary hover:bg-surface-hover px-6 py-3 rounded-lg text-lg">
|
| 412 |
+
<i class="fas fa-home mr-2"></i>
|
| 413 |
+
Return to Dashboard
|
| 414 |
+
</button>
|
| 415 |
+
</div>
|
| 416 |
+
</div>
|
| 417 |
+
</main>
|
| 418 |
+
|
| 419 |
+
<script>
|
| 420 |
+
// Mobile menu functionality
|
| 421 |
+
const mobileMenuBtn = document.getElementById('mobileMenuBtn');
|
| 422 |
+
const sidebar = document.getElementById('sidebar');
|
| 423 |
+
const mobileMenuOverlay = document.getElementById('mobileMenuOverlay');
|
| 424 |
+
const closeSidebar = document.getElementById('closeSidebar');
|
| 425 |
+
|
| 426 |
+
mobileMenuBtn.addEventListener('click', () => {
|
| 427 |
+
sidebar.classList.remove('-translate-x-full');
|
| 428 |
+
mobileMenuOverlay.classList.remove('hidden');
|
| 429 |
+
});
|
| 430 |
+
|
| 431 |
+
closeSidebar.addEventListener('click', () => {
|
| 432 |
+
sidebar.classList.add('-translate-x-full');
|
| 433 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 434 |
+
});
|
| 435 |
+
|
| 436 |
+
mobileMenuOverlay.addEventListener('click', () => {
|
| 437 |
+
sidebar.classList.add('-translate-x-full');
|
| 438 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 439 |
+
});
|
| 440 |
+
|
| 441 |
+
// Theme toggle functionality
|
| 442 |
+
const themeToggle = document.getElementById('themeToggle');
|
| 443 |
+
const html = document.documentElement;
|
| 444 |
+
|
| 445 |
+
themeToggle.addEventListener('click', () => {
|
| 446 |
+
html.classList.toggle('dark');
|
| 447 |
+
const isDark = html.classList.contains('dark');
|
| 448 |
+
|
| 449 |
+
// Update toggle button
|
| 450 |
+
const toggleSpan = themeToggle.querySelector('span');
|
| 451 |
+
if (isDark) {
|
| 452 |
+
toggleSpan.classList.add('translate-x-6');
|
| 453 |
+
toggleSpan.classList.remove('translate-x-1');
|
| 454 |
+
} else {
|
| 455 |
+
toggleSpan.classList.add('translate-x-1');
|
| 456 |
+
toggleSpan.classList.remove('translate-x-6');
|
| 457 |
+
}
|
| 458 |
+
|
| 459 |
+
// Save preference
|
| 460 |
+
localStorage.setItem('theme', isDark ? 'dark' : 'light');
|
| 461 |
+
});
|
| 462 |
+
|
| 463 |
+
// Load saved theme
|
| 464 |
+
const savedTheme = localStorage.getItem('theme');
|
| 465 |
+
if (savedTheme) {
|
| 466 |
+
html.classList.toggle('dark', savedTheme === 'dark');
|
| 467 |
+
const toggleSpan = themeToggle.querySelector('span');
|
| 468 |
+
if (savedTheme === 'dark') {
|
| 469 |
+
toggleSpan.classList.add('translate-x-6');
|
| 470 |
+
toggleSpan.classList.remove('translate-x-1');
|
| 471 |
+
} else {
|
| 472 |
+
toggleSpan.classList.add('translate-x-1');
|
| 473 |
+
toggleSpan.classList.remove('translate-x-6');
|
| 474 |
+
}
|
| 475 |
+
}
|
| 476 |
+
|
| 477 |
+
// Language selection
|
| 478 |
+
const languageSelect = document.getElementById('languageSelect');
|
| 479 |
+
languageSelect.addEventListener('change', (e) => {
|
| 480 |
+
localStorage.setItem('selectedLanguage', e.target.value);
|
| 481 |
+
console.log('Language changed to:', e.target.value);
|
| 482 |
+
});
|
| 483 |
+
|
| 484 |
+
// Load saved language
|
| 485 |
+
const savedLanguage = localStorage.getItem('selectedLanguage');
|
| 486 |
+
if (savedLanguage) {
|
| 487 |
+
languageSelect.value = savedLanguage;
|
| 488 |
+
}
|
| 489 |
+
|
| 490 |
+
// Load quiz results from localStorage
|
| 491 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 492 |
+
const quizResults = JSON.parse(localStorage.getItem('quizResults') || '{}');
|
| 493 |
+
|
| 494 |
+
// Update results if available
|
| 495 |
+
if (quizResults.score) {
|
| 496 |
+
// Update score displays
|
| 497 |
+
document.querySelectorAll('.score-display').forEach(el => {
|
| 498 |
+
el.textContent = quizResults.score + '%';
|
| 499 |
+
});
|
| 500 |
+
}
|
| 501 |
+
|
| 502 |
+
// Animate progress ring
|
| 503 |
+
setTimeout(() => {
|
| 504 |
+
const progressRing = document.querySelector('circle[stroke-dashoffset]');
|
| 505 |
+
if (progressRing) {
|
| 506 |
+
const score = 85; // Current score
|
| 507 |
+
const circumference = 314;
|
| 508 |
+
const offset = circumference - (score / 100) * circumference;
|
| 509 |
+
progressRing.style.strokeDashoffset = offset;
|
| 510 |
+
}
|
| 511 |
+
}, 500);
|
| 512 |
+
});
|
| 513 |
+
|
| 514 |
+
// Social sharing functionality
|
| 515 |
+
document.querySelectorAll('[class*="fa-twitter"], [class*="fa-facebook"], [class*="fa-whatsapp"]').forEach(btn => {
|
| 516 |
+
btn.closest('button').addEventListener('click', (e) => {
|
| 517 |
+
const platform = e.currentTarget.querySelector('i').classList.contains('fa-twitter') ? 'twitter' :
|
| 518 |
+
e.currentTarget.querySelector('i').classList.contains('fa-facebook') ? 'facebook' : 'whatsapp';
|
| 519 |
+
|
| 520 |
+
const shareText = "I just scored 85% on a Python Programming quiz on TriviaVerse! 🎉";
|
| 521 |
+
const shareUrl = window.location.origin;
|
| 522 |
+
|
| 523 |
+
let url = '';
|
| 524 |
+
switch(platform) {
|
| 525 |
+
case 'twitter':
|
| 526 |
+
url = `https://twitter.com/intent/tweet?text=${encodeURIComponent(shareText)}&url=${encodeURIComponent(shareUrl)}`;
|
| 527 |
+
break;
|
| 528 |
+
case 'facebook':
|
| 529 |
+
url = `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(shareUrl)}"e=${encodeURIComponent(shareText)}`;
|
| 530 |
+
break;
|
| 531 |
+
case 'whatsapp':
|
| 532 |
+
url = `https://wa.me/?text=${encodeURIComponent(shareText + ' ' + shareUrl)}`;
|
| 533 |
+
break;
|
| 534 |
+
}
|
| 535 |
+
|
| 536 |
+
if (url) {
|
| 537 |
+
window.open(url, '_blank', 'width=600,height=400');
|
| 538 |
+
}
|
| 539 |
+
});
|
| 540 |
+
});
|
| 541 |
+
</script>
|
| 542 |
+
</body>
|
| 543 |
+
</html>
|
pages/settings_preferences.html
ADDED
|
@@ -0,0 +1,1015 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en" class="dark">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>Settings & Preferences - TriviaVerse Quiz</title>
|
| 7 |
+
<link rel="stylesheet" href="../css/main.css" />
|
| 8 |
+
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet" />
|
| 9 |
+
<script type="module" src="https://static.rocket.new/rocket-web.js?_cfg=https%3A%2F%2Ftriviavers2501back.builtwithrocket.new&_be=https%3A%2F%2Fapplication.rocket.new&_v=0.1.5"></script>
|
| 10 |
+
</head>
|
| 11 |
+
<body class="bg-background text-text-primary transition-theme">
|
| 12 |
+
<!-- Mobile Menu Overlay -->
|
| 13 |
+
<div id="mobileMenuOverlay" class="fixed inset-0 bg-black bg-opacity-50 z-40 hidden lg:hidden"></div>
|
| 14 |
+
|
| 15 |
+
<!-- Sidebar -->
|
| 16 |
+
<aside id="sidebar" class="fixed left-0 top-0 h-full w-80 bg-surface border-r border-border transform -translate-x-full lg:translate-x-0 transition-transform duration-300 z-50 lg:z-auto">
|
| 17 |
+
<div class="p-6 border-b border-border">
|
| 18 |
+
<!-- Logo -->
|
| 19 |
+
<div class="flex items-center space-x-3 mb-6">
|
| 20 |
+
<div class="w-10 h-10 bg-gradient-to-br from-primary to-secondary rounded-lg flex items-center justify-center">
|
| 21 |
+
<i class="fas fa-brain text-white text-lg"></i>
|
| 22 |
+
</div>
|
| 23 |
+
<div>
|
| 24 |
+
<h1 class="text-xl font-bold text-text-primary">TriviaVerse</h1>
|
| 25 |
+
<p class="text-sm text-text-secondary">Quiz Platform</p>
|
| 26 |
+
</div>
|
| 27 |
+
</div>
|
| 28 |
+
|
| 29 |
+
<!-- Close button for mobile -->
|
| 30 |
+
<button id="closeSidebar" class="absolute top-4 right-4 lg:hidden text-text-secondary hover:text-text-primary">
|
| 31 |
+
<i class="fas fa-times text-xl"></i>
|
| 32 |
+
</button>
|
| 33 |
+
</div>
|
| 34 |
+
|
| 35 |
+
<!-- Navigation -->
|
| 36 |
+
<nav class="p-6 space-y-2">
|
| 37 |
+
<a href="quiz_dashboard.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 38 |
+
<i class="fas fa-home"></i>
|
| 39 |
+
<span>Dashboard</span>
|
| 40 |
+
</a>
|
| 41 |
+
<a href="active_quiz_interface.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 42 |
+
<i class="fas fa-play-circle"></i>
|
| 43 |
+
<span>Active Quiz</span>
|
| 44 |
+
</a>
|
| 45 |
+
<a href="quiz_results_statistics.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 46 |
+
<i class="fas fa-chart-bar"></i>
|
| 47 |
+
<span>Statistics</span>
|
| 48 |
+
</a>
|
| 49 |
+
<a href="topic_selection_browse.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 50 |
+
<i class="fas fa-book"></i>
|
| 51 |
+
<span>Browse Topics</span>
|
| 52 |
+
</a>
|
| 53 |
+
<a href="settings_preferences.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg bg-primary text-white">
|
| 54 |
+
<i class="fas fa-cog"></i>
|
| 55 |
+
<span>Settings</span>
|
| 56 |
+
</a>
|
| 57 |
+
</nav>
|
| 58 |
+
|
| 59 |
+
<!-- Game Settings -->
|
| 60 |
+
<div class="p-6 border-t border-border">
|
| 61 |
+
<h3 class="text-sm font-semibold text-text-primary mb-4">Game Settings</h3>
|
| 62 |
+
|
| 63 |
+
<!-- Language Switcher -->
|
| 64 |
+
<div class="mb-4">
|
| 65 |
+
<label class="block text-sm text-text-secondary mb-2">Language</label>
|
| 66 |
+
<select id="languageSelect" class="w-full bg-background border border-border rounded-lg px-3 py-2 text-text-primary focus:outline-none focus:ring-2 focus:ring-primary">
|
| 67 |
+
<option value="en">English</option>
|
| 68 |
+
<option value="te">తెలుగు (Telugu)</option>
|
| 69 |
+
<option value="hi">हिंदी (Hindi)</option>
|
| 70 |
+
<option value="kn">ಕನ್ನಡ (Kannada)</option>
|
| 71 |
+
</select>
|
| 72 |
+
</div>
|
| 73 |
+
|
| 74 |
+
<!-- Theme Toggle -->
|
| 75 |
+
<div class="flex items-center justify-between">
|
| 76 |
+
<span class="text-sm text-text-secondary">Dark Theme</span>
|
| 77 |
+
<button id="themeToggle" class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 78 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 79 |
+
</button>
|
| 80 |
+
</div>
|
| 81 |
+
</div>
|
| 82 |
+
</aside>
|
| 83 |
+
|
| 84 |
+
<!-- Main Content -->
|
| 85 |
+
<main class="lg:ml-80 min-h-screen">
|
| 86 |
+
<!-- Header -->
|
| 87 |
+
<header class="bg-surface border-b border-border p-4 lg:p-6">
|
| 88 |
+
<div class="flex items-center justify-between">
|
| 89 |
+
<!-- Mobile Menu Button -->
|
| 90 |
+
<button id="mobileMenuBtn" class="lg:hidden text-text-primary hover:text-primary">
|
| 91 |
+
<i class="fas fa-bars text-xl"></i>
|
| 92 |
+
</button>
|
| 93 |
+
|
| 94 |
+
<!-- Page Title -->
|
| 95 |
+
<div class="flex-1 lg:flex-none">
|
| 96 |
+
<h2 class="text-2xl font-bold text-text-primary">Settings & Preferences</h2>
|
| 97 |
+
<p class="text-text-secondary mt-1">Customize your quiz experience</p>
|
| 98 |
+
</div>
|
| 99 |
+
|
| 100 |
+
<!-- User Avatar -->
|
| 101 |
+
<div class="hidden lg:flex items-center space-x-3">
|
| 102 |
+
<img src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="User Avatar" class="w-10 h-10 rounded-full object-cover" onerror="this.src='https://images.unsplash.com/photo-1584824486509-112e4181ff6b?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'; this.onerror=null;" />
|
| 103 |
+
<div>
|
| 104 |
+
<p class="text-sm font-medium text-text-primary">John Doe</p>
|
| 105 |
+
<p class="text-xs text-text-secondary">Level 5 Quizzer</p>
|
| 106 |
+
</div>
|
| 107 |
+
</div>
|
| 108 |
+
</div>
|
| 109 |
+
</header>
|
| 110 |
+
|
| 111 |
+
<!-- Settings Content -->
|
| 112 |
+
<div class="p-4 lg:p-6">
|
| 113 |
+
<!-- Desktop Layout: Two Panel -->
|
| 114 |
+
<div class="hidden lg:flex gap-6">
|
| 115 |
+
<!-- Settings Categories Sidebar -->
|
| 116 |
+
<div class="w-1/3">
|
| 117 |
+
<div class="card p-6 sticky top-6">
|
| 118 |
+
<h3 class="text-lg font-semibold text-text-primary mb-4">Settings Categories</h3>
|
| 119 |
+
<nav class="space-y-2">
|
| 120 |
+
<button class="settings-nav-btn active w-full text-left px-4 py-3 rounded-lg bg-primary text-white" data-section="language">
|
| 121 |
+
<i class="fas fa-language mr-3"></i>
|
| 122 |
+
Language Settings
|
| 123 |
+
</button>
|
| 124 |
+
<button class="settings-nav-btn w-full text-left px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors" data-section="theme">
|
| 125 |
+
<i class="fas fa-palette mr-3"></i>
|
| 126 |
+
Theme Preferences
|
| 127 |
+
</button>
|
| 128 |
+
<button class="settings-nav-btn w-full text-left px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors" data-section="quiz">
|
| 129 |
+
<i class="fas fa-gamepad mr-3"></i>
|
| 130 |
+
Quiz Configuration
|
| 131 |
+
</button>
|
| 132 |
+
<button class="settings-nav-btn w-full text-left px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors" data-section="notifications">
|
| 133 |
+
<i class="fas fa-bell mr-3"></i>
|
| 134 |
+
Notifications
|
| 135 |
+
</button>
|
| 136 |
+
<button class="settings-nav-btn w-full text-left px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors" data-section="data">
|
| 137 |
+
<i class="fas fa-database mr-3"></i>
|
| 138 |
+
Data Management
|
| 139 |
+
</button>
|
| 140 |
+
<button class="settings-nav-btn w-full text-left px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors" data-section="accessibility">
|
| 141 |
+
<i class="fas fa-universal-access mr-3"></i>
|
| 142 |
+
Accessibility
|
| 143 |
+
</button>
|
| 144 |
+
</nav>
|
| 145 |
+
</div>
|
| 146 |
+
</div>
|
| 147 |
+
|
| 148 |
+
<!-- Settings Content Area -->
|
| 149 |
+
<div class="flex-1">
|
| 150 |
+
<div id="settingsContent" class="space-y-6">
|
| 151 |
+
<!-- Language Settings Section -->
|
| 152 |
+
<div id="languageSection" class="settings-section">
|
| 153 |
+
<div class="card p-6">
|
| 154 |
+
<div class="flex items-center mb-6">
|
| 155 |
+
<div class="w-12 h-12 bg-primary-100 rounded-lg flex items-center justify-center mr-4">
|
| 156 |
+
<i class="fas fa-language text-primary text-xl"></i>
|
| 157 |
+
</div>
|
| 158 |
+
<div>
|
| 159 |
+
<h3 class="text-xl font-semibold text-text-primary">Language Settings</h3>
|
| 160 |
+
<p class="text-text-secondary">Configure your preferred language and regional settings</p>
|
| 161 |
+
</div>
|
| 162 |
+
</div>
|
| 163 |
+
|
| 164 |
+
<div class="space-y-6">
|
| 165 |
+
<!-- Interface Language -->
|
| 166 |
+
<div>
|
| 167 |
+
<label class="block text-sm font-medium text-text-primary mb-3">Interface Language</label>
|
| 168 |
+
<div class="grid grid-cols-2 gap-3">
|
| 169 |
+
<div class="language-option border-2 border-primary bg-primary-50 rounded-lg p-4 cursor-pointer">
|
| 170 |
+
<div class="flex items-center space-x-3">
|
| 171 |
+
<div class="w-8 h-8 bg-primary rounded-full flex items-center justify-center">
|
| 172 |
+
<span class="text-white text-sm font-bold">EN</span>
|
| 173 |
+
</div>
|
| 174 |
+
<div>
|
| 175 |
+
<p class="font-medium text-primary">English</p>
|
| 176 |
+
<p class="text-xs text-text-secondary">Default</p>
|
| 177 |
+
</div>
|
| 178 |
+
</div>
|
| 179 |
+
</div>
|
| 180 |
+
<div class="language-option border border-border rounded-lg p-4 cursor-pointer hover:border-secondary">
|
| 181 |
+
<div class="flex items-center space-x-3">
|
| 182 |
+
<div class="w-8 h-8 bg-secondary-100 rounded-full flex items-center justify-center">
|
| 183 |
+
<span class="text-secondary text-sm font-bold">తె</span>
|
| 184 |
+
</div>
|
| 185 |
+
<div>
|
| 186 |
+
<p class="font-medium text-text-primary">తెలుగు</p>
|
| 187 |
+
<p class="text-xs text-text-secondary">Telugu</p>
|
| 188 |
+
</div>
|
| 189 |
+
</div>
|
| 190 |
+
</div>
|
| 191 |
+
<div class="language-option border border-border rounded-lg p-4 cursor-pointer hover:border-accent">
|
| 192 |
+
<div class="flex items-center space-x-3">
|
| 193 |
+
<div class="w-8 h-8 bg-accent-100 rounded-full flex items-center justify-center">
|
| 194 |
+
<span class="text-accent text-sm font-bold">हि</span>
|
| 195 |
+
</div>
|
| 196 |
+
<div>
|
| 197 |
+
<p class="font-medium text-text-primary">हिंदी</p>
|
| 198 |
+
<p class="text-xs text-text-secondary">Hindi</p>
|
| 199 |
+
</div>
|
| 200 |
+
</div>
|
| 201 |
+
</div>
|
| 202 |
+
<div class="language-option border border-border rounded-lg p-4 cursor-pointer hover:border-secondary">
|
| 203 |
+
<div class="flex items-center space-x-3">
|
| 204 |
+
<div class="w-8 h-8 bg-secondary-100 rounded-full flex items-center justify-center">
|
| 205 |
+
<span class="text-secondary text-sm font-bold">ಕ</span>
|
| 206 |
+
</div>
|
| 207 |
+
<div>
|
| 208 |
+
<p class="font-medium text-text-primary">ಕನ್ನಡ</p>
|
| 209 |
+
<p class="text-xs text-text-secondary">Kannada</p>
|
| 210 |
+
</div>
|
| 211 |
+
</div>
|
| 212 |
+
</div>
|
| 213 |
+
</div>
|
| 214 |
+
</div>
|
| 215 |
+
|
| 216 |
+
<!-- Font Settings -->
|
| 217 |
+
<div>
|
| 218 |
+
<label class="block text-sm font-medium text-text-primary mb-3">Font Preferences</label>
|
| 219 |
+
<div class="space-y-4">
|
| 220 |
+
<div class="flex items-center justify-between">
|
| 221 |
+
<span class="text-text-secondary">Auto-load regional fonts</span>
|
| 222 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 223 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 224 |
+
</button>
|
| 225 |
+
</div>
|
| 226 |
+
<div class="flex items-center justify-between">
|
| 227 |
+
<span class="text-text-secondary">Unicode text rendering</span>
|
| 228 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 229 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 230 |
+
</button>
|
| 231 |
+
</div>
|
| 232 |
+
</div>
|
| 233 |
+
</div>
|
| 234 |
+
</div>
|
| 235 |
+
</div>
|
| 236 |
+
</div>
|
| 237 |
+
|
| 238 |
+
<!-- Theme Preferences Section -->
|
| 239 |
+
<div id="themeSection" class="settings-section hidden">
|
| 240 |
+
<div class="card p-6">
|
| 241 |
+
<div class="flex items-center mb-6">
|
| 242 |
+
<div class="w-12 h-12 bg-accent-100 rounded-lg flex items-center justify-center mr-4">
|
| 243 |
+
<i class="fas fa-palette text-accent text-xl"></i>
|
| 244 |
+
</div>
|
| 245 |
+
<div>
|
| 246 |
+
<h3 class="text-xl font-semibold text-text-primary">Theme Preferences</h3>
|
| 247 |
+
<p class="text-text-secondary">Customize the visual appearance of your interface</p>
|
| 248 |
+
</div>
|
| 249 |
+
</div>
|
| 250 |
+
|
| 251 |
+
<div class="space-y-6">
|
| 252 |
+
<!-- Theme Selection -->
|
| 253 |
+
<div>
|
| 254 |
+
<label class="block text-sm font-medium text-text-primary mb-3">Theme Mode</label>
|
| 255 |
+
<div class="grid grid-cols-2 gap-4">
|
| 256 |
+
<div class="theme-option border-2 border-primary bg-primary-50 rounded-lg p-4 cursor-pointer">
|
| 257 |
+
<div class="text-center">
|
| 258 |
+
<div class="w-16 h-12 bg-background rounded-lg mx-auto mb-3 border border-border"></div>
|
| 259 |
+
<p class="font-medium text-primary">Dark Theme</p>
|
| 260 |
+
<p class="text-xs text-text-secondary">Current</p>
|
| 261 |
+
</div>
|
| 262 |
+
</div>
|
| 263 |
+
<div class="theme-option border border-border rounded-lg p-4 cursor-pointer hover:border-secondary">
|
| 264 |
+
<div class="text-center">
|
| 265 |
+
<div class="w-16 h-12 bg-white rounded-lg mx-auto mb-3 border border-border"></div>
|
| 266 |
+
<p class="font-medium text-text-primary">Light Theme</p>
|
| 267 |
+
<p class="text-xs text-text-secondary">Alternative</p>
|
| 268 |
+
</div>
|
| 269 |
+
</div>
|
| 270 |
+
</div>
|
| 271 |
+
</div>
|
| 272 |
+
|
| 273 |
+
<!-- Color Customization -->
|
| 274 |
+
<div>
|
| 275 |
+
<label class="block text-sm font-medium text-text-primary mb-3">Accent Color</label>
|
| 276 |
+
<div class="flex space-x-3">
|
| 277 |
+
<div class="w-8 h-8 bg-primary rounded-full cursor-pointer border-2 border-white shadow-md"></div>
|
| 278 |
+
<div class="w-8 h-8 bg-secondary rounded-full cursor-pointer border-2 border-transparent hover:border-white shadow-md"></div>
|
| 279 |
+
<div class="w-8 h-8 bg-accent rounded-full cursor-pointer border-2 border-transparent hover:border-white shadow-md"></div>
|
| 280 |
+
<div class="w-8 h-8 bg-success rounded-full cursor-pointer border-2 border-transparent hover:border-white shadow-md"></div>
|
| 281 |
+
<div class="w-8 h-8 bg-error rounded-full cursor-pointer border-2 border-transparent hover:border-white shadow-md"></div>
|
| 282 |
+
</div>
|
| 283 |
+
</div>
|
| 284 |
+
|
| 285 |
+
<!-- Auto Theme -->
|
| 286 |
+
<div class="flex items-center justify-between">
|
| 287 |
+
<div>
|
| 288 |
+
<span class="text-text-primary">Auto theme switching</span>
|
| 289 |
+
<p class="text-xs text-text-secondary">Follow system preference</p>
|
| 290 |
+
</div>
|
| 291 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-gray-300 transition-colors">
|
| 292 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-1"></span>
|
| 293 |
+
</button>
|
| 294 |
+
</div>
|
| 295 |
+
</div>
|
| 296 |
+
</div>
|
| 297 |
+
</div>
|
| 298 |
+
|
| 299 |
+
<!-- Quiz Configuration Section -->
|
| 300 |
+
<div id="quizSection" class="settings-section hidden">
|
| 301 |
+
<div class="card p-6">
|
| 302 |
+
<div class="flex items-center mb-6">
|
| 303 |
+
<div class="w-12 h-12 bg-secondary-100 rounded-lg flex items-center justify-center mr-4">
|
| 304 |
+
<i class="fas fa-gamepad text-secondary text-xl"></i>
|
| 305 |
+
</div>
|
| 306 |
+
<div>
|
| 307 |
+
<h3 class="text-xl font-semibold text-text-primary">Quiz Configuration</h3>
|
| 308 |
+
<p class="text-text-secondary">Set your default quiz preferences and difficulty</p>
|
| 309 |
+
</div>
|
| 310 |
+
</div>
|
| 311 |
+
|
| 312 |
+
<div class="space-y-6">
|
| 313 |
+
<!-- Timer Settings -->
|
| 314 |
+
<div>
|
| 315 |
+
<label class="block text-sm font-medium text-text-primary mb-3">Default Timer (seconds)</label>
|
| 316 |
+
<div class="flex items-center space-x-4">
|
| 317 |
+
<input type="range" min="10" max="120" value="30" class="flex-1 h-2 bg-surface rounded-lg appearance-none cursor-pointer" />
|
| 318 |
+
<span class="text-text-primary font-medium w-12">30s</span>
|
| 319 |
+
</div>
|
| 320 |
+
<div class="flex justify-between text-xs text-text-secondary mt-1">
|
| 321 |
+
<span>10s</span>
|
| 322 |
+
<span>120s</span>
|
| 323 |
+
</div>
|
| 324 |
+
</div>
|
| 325 |
+
|
| 326 |
+
<!-- Difficulty Preference -->
|
| 327 |
+
<div>
|
| 328 |
+
<label class="block text-sm font-medium text-text-primary mb-3">Default Difficulty</label>
|
| 329 |
+
<div class="grid grid-cols-3 gap-3">
|
| 330 |
+
<div class="difficulty-option border border-border rounded-lg p-3 cursor-pointer hover:border-success text-center">
|
| 331 |
+
<i class="fas fa-seedling text-success text-lg mb-2"></i>
|
| 332 |
+
<p class="text-sm font-medium text-text-primary">Easy</p>
|
| 333 |
+
</div>
|
| 334 |
+
<div class="difficulty-option border-2 border-accent bg-accent-50 rounded-lg p-3 cursor-pointer text-center">
|
| 335 |
+
<i class="fas fa-fire text-accent text-lg mb-2"></i>
|
| 336 |
+
<p class="text-sm font-medium text-accent">Medium</p>
|
| 337 |
+
</div>
|
| 338 |
+
<div class="difficulty-option border border-border rounded-lg p-3 cursor-pointer hover:border-error text-center">
|
| 339 |
+
<i class="fas fa-skull text-error text-lg mb-2"></i>
|
| 340 |
+
<p class="text-sm font-medium text-text-primary">Hard</p>
|
| 341 |
+
</div>
|
| 342 |
+
</div>
|
| 343 |
+
</div>
|
| 344 |
+
|
| 345 |
+
<!-- Quiz Features -->
|
| 346 |
+
<div class="space-y-4">
|
| 347 |
+
<div class="flex items-center justify-between">
|
| 348 |
+
<div>
|
| 349 |
+
<span class="text-text-primary">Enable hints</span>
|
| 350 |
+
<p class="text-xs text-text-secondary">Show helpful hints during quiz</p>
|
| 351 |
+
</div>
|
| 352 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 353 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 354 |
+
</button>
|
| 355 |
+
</div>
|
| 356 |
+
<div class="flex items-center justify-between">
|
| 357 |
+
<div>
|
| 358 |
+
<span class="text-text-primary">Auto-advance questions</span>
|
| 359 |
+
<p class="text-xs text-text-secondary">Move to next question automatically</p>
|
| 360 |
+
</div>
|
| 361 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-gray-300 transition-colors">
|
| 362 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-1"></span>
|
| 363 |
+
</button>
|
| 364 |
+
</div>
|
| 365 |
+
<div class="flex items-center justify-between">
|
| 366 |
+
<div>
|
| 367 |
+
<span class="text-text-primary">Sound effects</span>
|
| 368 |
+
<p class="text-xs text-text-secondary">Play sounds for correct/incorrect answers</p>
|
| 369 |
+
</div>
|
| 370 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 371 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 372 |
+
</button>
|
| 373 |
+
</div>
|
| 374 |
+
</div>
|
| 375 |
+
</div>
|
| 376 |
+
</div>
|
| 377 |
+
</div>
|
| 378 |
+
|
| 379 |
+
<!-- Notifications Section -->
|
| 380 |
+
<div id="notificationsSection" class="settings-section hidden">
|
| 381 |
+
<div class="card p-6">
|
| 382 |
+
<div class="flex items-center mb-6">
|
| 383 |
+
<div class="w-12 h-12 bg-warning-100 rounded-lg flex items-center justify-center mr-4">
|
| 384 |
+
<i class="fas fa-bell text-warning text-xl"></i>
|
| 385 |
+
</div>
|
| 386 |
+
<div>
|
| 387 |
+
<h3 class="text-xl font-semibold text-text-primary">Notification Preferences</h3>
|
| 388 |
+
<p class="text-text-secondary">Manage your notification settings and reminders</p>
|
| 389 |
+
</div>
|
| 390 |
+
</div>
|
| 391 |
+
|
| 392 |
+
<div class="space-y-4">
|
| 393 |
+
<div class="flex items-center justify-between">
|
| 394 |
+
<div>
|
| 395 |
+
<span class="text-text-primary">Streak reminders</span>
|
| 396 |
+
<p class="text-xs text-text-secondary">Daily reminders to maintain your streak</p>
|
| 397 |
+
</div>
|
| 398 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 399 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 400 |
+
</button>
|
| 401 |
+
</div>
|
| 402 |
+
<div class="flex items-center justify-between">
|
| 403 |
+
<div>
|
| 404 |
+
<span class="text-text-primary">Achievement celebrations</span>
|
| 405 |
+
<p class="text-xs text-text-secondary">Notifications for milestones and achievements</p>
|
| 406 |
+
</div>
|
| 407 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 408 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 409 |
+
</button>
|
| 410 |
+
</div>
|
| 411 |
+
<div class="flex items-center justify-between">
|
| 412 |
+
<div>
|
| 413 |
+
<span class="text-text-primary">New topic alerts</span>
|
| 414 |
+
<p class="text-xs text-text-secondary">Notify when new quiz topics are available</p>
|
| 415 |
+
</div>
|
| 416 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-gray-300 transition-colors">
|
| 417 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-1"></span>
|
| 418 |
+
</button>
|
| 419 |
+
</div>
|
| 420 |
+
<div class="flex items-center justify-between">
|
| 421 |
+
<div>
|
| 422 |
+
<span class="text-text-primary">Weekly progress reports</span>
|
| 423 |
+
<p class="text-xs text-text-secondary">Summary of your weekly quiz performance</p>
|
| 424 |
+
</div>
|
| 425 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 426 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 427 |
+
</button>
|
| 428 |
+
</div>
|
| 429 |
+
</div>
|
| 430 |
+
</div>
|
| 431 |
+
</div>
|
| 432 |
+
|
| 433 |
+
<!-- Data Management Section -->
|
| 434 |
+
<div id="dataSection" class="settings-section hidden">
|
| 435 |
+
<div class="card p-6">
|
| 436 |
+
<div class="flex items-center mb-6">
|
| 437 |
+
<div class="w-12 h-12 bg-error-100 rounded-lg flex items-center justify-center mr-4">
|
| 438 |
+
<i class="fas fa-database text-error text-xl"></i>
|
| 439 |
+
</div>
|
| 440 |
+
<div>
|
| 441 |
+
<h3 class="text-xl font-semibold text-text-primary">Data Management</h3>
|
| 442 |
+
<p class="text-text-secondary">Manage your quiz data, statistics, and backups</p>
|
| 443 |
+
</div>
|
| 444 |
+
</div>
|
| 445 |
+
|
| 446 |
+
<div class="space-y-6">
|
| 447 |
+
<!-- Export Options -->
|
| 448 |
+
<div>
|
| 449 |
+
<h4 class="text-sm font-medium text-text-primary mb-3">Export Data</h4>
|
| 450 |
+
<div class="space-y-3">
|
| 451 |
+
<button class="w-full flex items-center justify-between p-4 border border-border rounded-lg hover:border-primary transition-colors">
|
| 452 |
+
<div class="flex items-center space-x-3">
|
| 453 |
+
<i class="fas fa-chart-bar text-primary"></i>
|
| 454 |
+
<div class="text-left">
|
| 455 |
+
<p class="text-sm font-medium text-text-primary">Export Statistics</p>
|
| 456 |
+
<p class="text-xs text-text-secondary">Download your quiz performance data</p>
|
| 457 |
+
</div>
|
| 458 |
+
</div>
|
| 459 |
+
<i class="fas fa-download text-text-secondary"></i>
|
| 460 |
+
</button>
|
| 461 |
+
<button class="w-full flex items-center justify-between p-4 border border-border rounded-lg hover:border-secondary transition-colors">
|
| 462 |
+
<div class="flex items-center space-x-3">
|
| 463 |
+
<i class="fas fa-history text-secondary"></i>
|
| 464 |
+
<div class="text-left">
|
| 465 |
+
<p class="text-sm font-medium text-text-primary">Export Progress</p>
|
| 466 |
+
<p class="text-xs text-text-secondary">Backup your learning progress</p>
|
| 467 |
+
</div>
|
| 468 |
+
</div>
|
| 469 |
+
<i class="fas fa-download text-text-secondary"></i>
|
| 470 |
+
</button>
|
| 471 |
+
</div>
|
| 472 |
+
</div>
|
| 473 |
+
|
| 474 |
+
<!-- Reset Options -->
|
| 475 |
+
<div>
|
| 476 |
+
<h4 class="text-sm font-medium text-text-primary mb-3">Reset Data</h4>
|
| 477 |
+
<div class="space-y-3">
|
| 478 |
+
<button class="w-full flex items-center justify-between p-4 border border-warning rounded-lg hover:bg-warning-50 transition-colors">
|
| 479 |
+
<div class="flex items-center space-x-3">
|
| 480 |
+
<i class="fas fa-undo text-warning"></i>
|
| 481 |
+
<div class="text-left">
|
| 482 |
+
<p class="text-sm font-medium text-warning">Reset Statistics</p>
|
| 483 |
+
<p class="text-xs text-text-secondary">Clear all quiz statistics and scores</p>
|
| 484 |
+
</div>
|
| 485 |
+
</div>
|
| 486 |
+
<i class="fas fa-exclamation-triangle text-warning"></i>
|
| 487 |
+
</button>
|
| 488 |
+
<button class="w-full flex items-center justify-between p-4 border border-error rounded-lg hover:bg-error-50 transition-colors">
|
| 489 |
+
<div class="flex items-center space-x-3">
|
| 490 |
+
<i class="fas fa-trash text-error"></i>
|
| 491 |
+
<div class="text-left">
|
| 492 |
+
<p class="text-sm font-medium text-error">Reset All Data</p>
|
| 493 |
+
<p class="text-xs text-text-secondary">Delete all data and start fresh</p>
|
| 494 |
+
</div>
|
| 495 |
+
</div>
|
| 496 |
+
<i class="fas fa-exclamation-triangle text-error"></i>
|
| 497 |
+
</button>
|
| 498 |
+
</div>
|
| 499 |
+
</div>
|
| 500 |
+
</div>
|
| 501 |
+
</div>
|
| 502 |
+
</div>
|
| 503 |
+
|
| 504 |
+
<!-- Accessibility Section -->
|
| 505 |
+
<div id="accessibilitySection" class="settings-section hidden">
|
| 506 |
+
<div class="card p-6">
|
| 507 |
+
<div class="flex items-center mb-6">
|
| 508 |
+
<div class="w-12 h-12 bg-success-100 rounded-lg flex items-center justify-center mr-4">
|
| 509 |
+
<i class="fas fa-universal-access text-success text-xl"></i>
|
| 510 |
+
</div>
|
| 511 |
+
<div>
|
| 512 |
+
<h3 class="text-xl font-semibold text-text-primary">Accessibility Settings</h3>
|
| 513 |
+
<p class="text-text-secondary">Customize accessibility features for better usability</p>
|
| 514 |
+
</div>
|
| 515 |
+
</div>
|
| 516 |
+
|
| 517 |
+
<div class="space-y-6">
|
| 518 |
+
<!-- Font Size -->
|
| 519 |
+
<div>
|
| 520 |
+
<label class="block text-sm font-medium text-text-primary mb-3">Font Size</label>
|
| 521 |
+
<div class="flex items-center space-x-4">
|
| 522 |
+
<span class="text-sm text-text-secondary">A</span>
|
| 523 |
+
<input type="range" min="12" max="24" value="16" class="flex-1 h-2 bg-surface rounded-lg appearance-none cursor-pointer" />
|
| 524 |
+
<span class="text-lg text-text-secondary">A</span>
|
| 525 |
+
</div>
|
| 526 |
+
<div class="flex justify-between text-xs text-text-secondary mt-1">
|
| 527 |
+
<span>Small</span>
|
| 528 |
+
<span>Large</span>
|
| 529 |
+
</div>
|
| 530 |
+
</div>
|
| 531 |
+
|
| 532 |
+
<!-- Contrast Options -->
|
| 533 |
+
<div>
|
| 534 |
+
<label class="block text-sm font-medium text-text-primary mb-3">Contrast Level</label>
|
| 535 |
+
<div class="grid grid-cols-3 gap-3">
|
| 536 |
+
<div class="contrast-option border border-border rounded-lg p-3 cursor-pointer hover:border-primary text-center">
|
| 537 |
+
<div class="w-8 h-8 bg-gray-300 rounded mx-auto mb-2"></div>
|
| 538 |
+
<p class="text-xs text-text-primary">Normal</p>
|
| 539 |
+
</div>
|
| 540 |
+
<div class="contrast-option border-2 border-primary bg-primary-50 rounded-lg p-3 cursor-pointer text-center">
|
| 541 |
+
<div class="w-8 h-8 bg-gray-600 rounded mx-auto mb-2"></div>
|
| 542 |
+
<p class="text-xs text-primary">High</p>
|
| 543 |
+
</div>
|
| 544 |
+
<div class="contrast-option border border-border rounded-lg p-3 cursor-pointer hover:border-primary text-center">
|
| 545 |
+
<div class="w-8 h-8 bg-black rounded mx-auto mb-2"></div>
|
| 546 |
+
<p class="text-xs text-text-primary">Maximum</p>
|
| 547 |
+
</div>
|
| 548 |
+
</div>
|
| 549 |
+
</div>
|
| 550 |
+
|
| 551 |
+
<!-- Accessibility Features -->
|
| 552 |
+
<div class="space-y-4">
|
| 553 |
+
<div class="flex items-center justify-between">
|
| 554 |
+
<div>
|
| 555 |
+
<span class="text-text-primary">Reduce motion</span>
|
| 556 |
+
<p class="text-xs text-text-secondary">Minimize animations and transitions</p>
|
| 557 |
+
</div>
|
| 558 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-gray-300 transition-colors">
|
| 559 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-1"></span>
|
| 560 |
+
</button>
|
| 561 |
+
</div>
|
| 562 |
+
<div class="flex items-center justify-between">
|
| 563 |
+
<div>
|
| 564 |
+
<span class="text-text-primary">Screen reader support</span>
|
| 565 |
+
<p class="text-xs text-text-secondary">Enhanced compatibility with screen readers</p>
|
| 566 |
+
</div>
|
| 567 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 568 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 569 |
+
</button>
|
| 570 |
+
</div>
|
| 571 |
+
<div class="flex items-center justify-between">
|
| 572 |
+
<div>
|
| 573 |
+
<span class="text-text-primary">Keyboard navigation</span>
|
| 574 |
+
<p class="text-xs text-text-secondary">Enhanced keyboard shortcuts and navigation</p>
|
| 575 |
+
</div>
|
| 576 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 577 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 578 |
+
</button>
|
| 579 |
+
</div>
|
| 580 |
+
</div>
|
| 581 |
+
</div>
|
| 582 |
+
</div>
|
| 583 |
+
</div>
|
| 584 |
+
</div>
|
| 585 |
+
</div>
|
| 586 |
+
</div>
|
| 587 |
+
|
| 588 |
+
<!-- Mobile Layout: Accordion Style -->
|
| 589 |
+
<div class="lg:hidden space-y-4">
|
| 590 |
+
<!-- Language Settings Accordion -->
|
| 591 |
+
<div class="card">
|
| 592 |
+
<button class="accordion-btn w-full flex items-center justify-between p-4 text-left" data-target="mobileLanguage">
|
| 593 |
+
<div class="flex items-center space-x-3">
|
| 594 |
+
<i class="fas fa-language text-primary"></i>
|
| 595 |
+
<span class="font-medium text-text-primary">Language Settings</span>
|
| 596 |
+
</div>
|
| 597 |
+
<i class="fas fa-chevron-down text-text-secondary transition-transform"></i>
|
| 598 |
+
</button>
|
| 599 |
+
<div id="mobileLanguage" class="accordion-content hidden p-4 border-t border-border">
|
| 600 |
+
<div class="space-y-4">
|
| 601 |
+
<div>
|
| 602 |
+
<label class="block text-sm font-medium text-text-primary mb-2">Interface Language</label>
|
| 603 |
+
<select class="w-full bg-background border border-border rounded-lg px-3 py-2 text-text-primary">
|
| 604 |
+
<option value="en">English</option>
|
| 605 |
+
<option value="te">తెలుగు (Telugu)</option>
|
| 606 |
+
<option value="hi">हिंदी (Hindi)</option>
|
| 607 |
+
<option value="kn">ಕನ್ನಡ (Kannada)</option>
|
| 608 |
+
</select>
|
| 609 |
+
</div>
|
| 610 |
+
<div class="flex items-center justify-between">
|
| 611 |
+
<span class="text-text-secondary">Auto-load regional fonts</span>
|
| 612 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 613 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 614 |
+
</button>
|
| 615 |
+
</div>
|
| 616 |
+
</div>
|
| 617 |
+
</div>
|
| 618 |
+
</div>
|
| 619 |
+
|
| 620 |
+
<!-- Theme Preferences Accordion -->
|
| 621 |
+
<div class="card">
|
| 622 |
+
<button class="accordion-btn w-full flex items-center justify-between p-4 text-left" data-target="mobileTheme">
|
| 623 |
+
<div class="flex items-center space-x-3">
|
| 624 |
+
<i class="fas fa-palette text-accent"></i>
|
| 625 |
+
<span class="font-medium text-text-primary">Theme Preferences</span>
|
| 626 |
+
</div>
|
| 627 |
+
<i class="fas fa-chevron-down text-text-secondary transition-transform"></i>
|
| 628 |
+
</button>
|
| 629 |
+
<div id="mobileTheme" class="accordion-content hidden p-4 border-t border-border">
|
| 630 |
+
<div class="space-y-4">
|
| 631 |
+
<div class="flex items-center justify-between">
|
| 632 |
+
<span class="text-text-primary">Dark Theme</span>
|
| 633 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 634 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 635 |
+
</button>
|
| 636 |
+
</div>
|
| 637 |
+
<div class="flex items-center justify-between">
|
| 638 |
+
<span class="text-text-secondary">Auto theme switching</span>
|
| 639 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-gray-300 transition-colors">
|
| 640 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-1"></span>
|
| 641 |
+
</button>
|
| 642 |
+
</div>
|
| 643 |
+
</div>
|
| 644 |
+
</div>
|
| 645 |
+
</div>
|
| 646 |
+
|
| 647 |
+
<!-- Quiz Configuration Accordion -->
|
| 648 |
+
<div class="card">
|
| 649 |
+
<button class="accordion-btn w-full flex items-center justify-between p-4 text-left" data-target="mobileQuiz">
|
| 650 |
+
<div class="flex items-center space-x-3">
|
| 651 |
+
<i class="fas fa-gamepad text-secondary"></i>
|
| 652 |
+
<span class="font-medium text-text-primary">Quiz Configuration</span>
|
| 653 |
+
</div>
|
| 654 |
+
<i class="fas fa-chevron-down text-text-secondary transition-transform"></i>
|
| 655 |
+
</button>
|
| 656 |
+
<div id="mobileQuiz" class="accordion-content hidden p-4 border-t border-border">
|
| 657 |
+
<div class="space-y-4">
|
| 658 |
+
<div>
|
| 659 |
+
<label class="block text-sm font-medium text-text-primary mb-2">Default Timer</label>
|
| 660 |
+
<input type="range" min="10" max="120" value="30" class="w-full h-2 bg-surface rounded-lg appearance-none cursor-pointer" />
|
| 661 |
+
</div>
|
| 662 |
+
<div class="flex items-center justify-between">
|
| 663 |
+
<span class="text-text-secondary">Enable hints</span>
|
| 664 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 665 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 666 |
+
</button>
|
| 667 |
+
</div>
|
| 668 |
+
</div>
|
| 669 |
+
</div>
|
| 670 |
+
</div>
|
| 671 |
+
|
| 672 |
+
<!-- Notifications Accordion -->
|
| 673 |
+
<div class="card">
|
| 674 |
+
<button class="accordion-btn w-full flex items-center justify-between p-4 text-left" data-target="mobileNotifications">
|
| 675 |
+
<div class="flex items-center space-x-3">
|
| 676 |
+
<i class="fas fa-bell text-warning"></i>
|
| 677 |
+
<span class="font-medium text-text-primary">Notifications</span>
|
| 678 |
+
</div>
|
| 679 |
+
<i class="fas fa-chevron-down text-text-secondary transition-transform"></i>
|
| 680 |
+
</button>
|
| 681 |
+
<div id="mobileNotifications" class="accordion-content hidden p-4 border-t border-border">
|
| 682 |
+
<div class="space-y-4">
|
| 683 |
+
<div class="flex items-center justify-between">
|
| 684 |
+
<span class="text-text-secondary">Streak reminders</span>
|
| 685 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 686 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 687 |
+
</button>
|
| 688 |
+
</div>
|
| 689 |
+
<div class="flex items-center justify-between">
|
| 690 |
+
<span class="text-text-secondary">Achievement celebrations</span>
|
| 691 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors">
|
| 692 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-6"></span>
|
| 693 |
+
</button>
|
| 694 |
+
</div>
|
| 695 |
+
</div>
|
| 696 |
+
</div>
|
| 697 |
+
</div>
|
| 698 |
+
|
| 699 |
+
<!-- Data Management Accordion -->
|
| 700 |
+
<div class="card">
|
| 701 |
+
<button class="accordion-btn w-full flex items-center justify-between p-4 text-left" data-target="mobileData">
|
| 702 |
+
<div class="flex items-center space-x-3">
|
| 703 |
+
<i class="fas fa-database text-error"></i>
|
| 704 |
+
<span class="font-medium text-text-primary">Data Management</span>
|
| 705 |
+
</div>
|
| 706 |
+
<i class="fas fa-chevron-down text-text-secondary transition-transform"></i>
|
| 707 |
+
</button>
|
| 708 |
+
<div id="mobileData" class="accordion-content hidden p-4 border-t border-border">
|
| 709 |
+
<div class="space-y-3">
|
| 710 |
+
<button class="w-full btn btn-primary">
|
| 711 |
+
<i class="fas fa-download mr-2"></i>
|
| 712 |
+
Export Data
|
| 713 |
+
</button>
|
| 714 |
+
<button class="w-full btn bg-warning text-white hover:bg-warning-600">
|
| 715 |
+
<i class="fas fa-undo mr-2"></i>
|
| 716 |
+
Reset Statistics
|
| 717 |
+
</button>
|
| 718 |
+
</div>
|
| 719 |
+
</div>
|
| 720 |
+
</div>
|
| 721 |
+
|
| 722 |
+
<!-- Accessibility Accordion -->
|
| 723 |
+
<div class="card">
|
| 724 |
+
<button class="accordion-btn w-full flex items-center justify-between p-4 text-left" data-target="mobileAccessibility">
|
| 725 |
+
<div class="flex items-center space-x-3">
|
| 726 |
+
<i class="fas fa-universal-access text-success"></i>
|
| 727 |
+
<span class="font-medium text-text-primary">Accessibility</span>
|
| 728 |
+
</div>
|
| 729 |
+
<i class="fas fa-chevron-down text-text-secondary transition-transform"></i>
|
| 730 |
+
</button>
|
| 731 |
+
<div id="mobileAccessibility" class="accordion-content hidden p-4 border-t border-border">
|
| 732 |
+
<div class="space-y-4">
|
| 733 |
+
<div>
|
| 734 |
+
<label class="block text-sm font-medium text-text-primary mb-2">Font Size</label>
|
| 735 |
+
<input type="range" min="12" max="24" value="16" class="w-full h-2 bg-surface rounded-lg appearance-none cursor-pointer" />
|
| 736 |
+
</div>
|
| 737 |
+
<div class="flex items-center justify-between">
|
| 738 |
+
<span class="text-text-secondary">Reduce motion</span>
|
| 739 |
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-gray-300 transition-colors">
|
| 740 |
+
<span class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform translate-x-1"></span>
|
| 741 |
+
</button>
|
| 742 |
+
</div>
|
| 743 |
+
</div>
|
| 744 |
+
</div>
|
| 745 |
+
</div>
|
| 746 |
+
</div>
|
| 747 |
+
|
| 748 |
+
<!-- Action Buttons -->
|
| 749 |
+
<div class="mt-8 flex flex-col sm:flex-row gap-4">
|
| 750 |
+
<button id="saveChangesBtn" class="btn btn-primary flex-1">
|
| 751 |
+
<i class="fas fa-save mr-2"></i>
|
| 752 |
+
Save Changes
|
| 753 |
+
</button>
|
| 754 |
+
<button id="resetDefaultsBtn" class="btn bg-warning text-white hover:bg-warning-600 flex-1">
|
| 755 |
+
<i class="fas fa-undo mr-2"></i>
|
| 756 |
+
Reset to Defaults
|
| 757 |
+
</button>
|
| 758 |
+
<button id="exportDataBtn" class="btn btn-secondary flex-1">
|
| 759 |
+
<i class="fas fa-download mr-2"></i>
|
| 760 |
+
Export Data
|
| 761 |
+
</button>
|
| 762 |
+
</div>
|
| 763 |
+
</div>
|
| 764 |
+
</main>
|
| 765 |
+
|
| 766 |
+
<!-- Confirmation Modal -->
|
| 767 |
+
<div id="confirmationModal" class="fixed inset-0 bg-black bg-opacity-50 z-50 hidden flex items-center justify-center p-4">
|
| 768 |
+
<div class="bg-surface rounded-lg p-6 max-w-md w-full">
|
| 769 |
+
<div class="text-center">
|
| 770 |
+
<div class="w-16 h-16 bg-warning-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 771 |
+
<i class="fas fa-exclamation-triangle text-warning text-2xl"></i>
|
| 772 |
+
</div>
|
| 773 |
+
<h3 class="text-lg font-semibold text-text-primary mb-2">Confirm Action</h3>
|
| 774 |
+
<p id="confirmationMessage" class="text-text-secondary mb-6">Are you sure you want to proceed with this action?</p>
|
| 775 |
+
<div class="flex space-x-3">
|
| 776 |
+
<button id="cancelBtn" class="btn bg-gray-300 text-gray-700 hover:bg-gray-400 flex-1">Cancel</button>
|
| 777 |
+
<button id="confirmBtn" class="btn btn-primary flex-1">Confirm</button>
|
| 778 |
+
</div>
|
| 779 |
+
</div>
|
| 780 |
+
</div>
|
| 781 |
+
</div>
|
| 782 |
+
|
| 783 |
+
<script>
|
| 784 |
+
// Mobile menu functionality
|
| 785 |
+
const mobileMenuBtn = document.getElementById('mobileMenuBtn');
|
| 786 |
+
const sidebar = document.getElementById('sidebar');
|
| 787 |
+
const mobileMenuOverlay = document.getElementById('mobileMenuOverlay');
|
| 788 |
+
const closeSidebar = document.getElementById('closeSidebar');
|
| 789 |
+
|
| 790 |
+
mobileMenuBtn.addEventListener('click', () => {
|
| 791 |
+
sidebar.classList.remove('-translate-x-full');
|
| 792 |
+
mobileMenuOverlay.classList.remove('hidden');
|
| 793 |
+
});
|
| 794 |
+
|
| 795 |
+
closeSidebar.addEventListener('click', () => {
|
| 796 |
+
sidebar.classList.add('-translate-x-full');
|
| 797 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 798 |
+
});
|
| 799 |
+
|
| 800 |
+
mobileMenuOverlay.addEventListener('click', () => {
|
| 801 |
+
sidebar.classList.add('-translate-x-full');
|
| 802 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 803 |
+
});
|
| 804 |
+
|
| 805 |
+
// Theme toggle functionality
|
| 806 |
+
const themeToggle = document.getElementById('themeToggle');
|
| 807 |
+
const html = document.documentElement;
|
| 808 |
+
|
| 809 |
+
themeToggle.addEventListener('click', () => {
|
| 810 |
+
html.classList.toggle('dark');
|
| 811 |
+
const isDark = html.classList.contains('dark');
|
| 812 |
+
|
| 813 |
+
// Update toggle button
|
| 814 |
+
const toggleSpan = themeToggle.querySelector('span');
|
| 815 |
+
if (isDark) {
|
| 816 |
+
toggleSpan.classList.add('translate-x-6');
|
| 817 |
+
toggleSpan.classList.remove('translate-x-1');
|
| 818 |
+
} else {
|
| 819 |
+
toggleSpan.classList.add('translate-x-1');
|
| 820 |
+
toggleSpan.classList.remove('translate-x-6');
|
| 821 |
+
}
|
| 822 |
+
|
| 823 |
+
// Save preference
|
| 824 |
+
localStorage.setItem('theme', isDark ? 'dark' : 'light');
|
| 825 |
+
});
|
| 826 |
+
|
| 827 |
+
// Load saved theme
|
| 828 |
+
const savedTheme = localStorage.getItem('theme');
|
| 829 |
+
if (savedTheme) {
|
| 830 |
+
html.classList.toggle('dark', savedTheme === 'dark');
|
| 831 |
+
const toggleSpan = themeToggle.querySelector('span');
|
| 832 |
+
if (savedTheme === 'dark') {
|
| 833 |
+
toggleSpan.classList.add('translate-x-6');
|
| 834 |
+
toggleSpan.classList.remove('translate-x-1');
|
| 835 |
+
} else {
|
| 836 |
+
toggleSpan.classList.add('translate-x-1');
|
| 837 |
+
toggleSpan.classList.remove('translate-x-6');
|
| 838 |
+
}
|
| 839 |
+
}
|
| 840 |
+
|
| 841 |
+
// Desktop settings navigation
|
| 842 |
+
const settingsNavBtns = document.querySelectorAll('.settings-nav-btn');
|
| 843 |
+
const settingsSections = document.querySelectorAll('.settings-section');
|
| 844 |
+
|
| 845 |
+
settingsNavBtns.forEach(btn => {
|
| 846 |
+
btn.addEventListener('click', () => {
|
| 847 |
+
const targetSection = btn.dataset.section;
|
| 848 |
+
|
| 849 |
+
// Update active nav button
|
| 850 |
+
settingsNavBtns.forEach(navBtn => {
|
| 851 |
+
navBtn.classList.remove('active', 'bg-primary', 'text-white');
|
| 852 |
+
navBtn.classList.add('text-text-secondary', 'hover:text-text-primary', 'hover:bg-surface-hover');
|
| 853 |
+
});
|
| 854 |
+
btn.classList.add('active', 'bg-primary', 'text-white');
|
| 855 |
+
btn.classList.remove('text-text-secondary', 'hover:text-text-primary', 'hover:bg-surface-hover');
|
| 856 |
+
|
| 857 |
+
// Show target section
|
| 858 |
+
settingsSections.forEach(section => {
|
| 859 |
+
section.classList.add('hidden');
|
| 860 |
+
});
|
| 861 |
+
document.getElementById(targetSection + 'Section').classList.remove('hidden');
|
| 862 |
+
});
|
| 863 |
+
});
|
| 864 |
+
|
| 865 |
+
// Mobile accordion functionality
|
| 866 |
+
const accordionBtns = document.querySelectorAll('.accordion-btn');
|
| 867 |
+
|
| 868 |
+
accordionBtns.forEach(btn => {
|
| 869 |
+
btn.addEventListener('click', () => {
|
| 870 |
+
const targetId = btn.dataset.target;
|
| 871 |
+
const targetContent = document.getElementById(targetId);
|
| 872 |
+
const chevron = btn.querySelector('.fa-chevron-down');
|
| 873 |
+
|
| 874 |
+
// Toggle content
|
| 875 |
+
targetContent.classList.toggle('hidden');
|
| 876 |
+
|
| 877 |
+
// Rotate chevron
|
| 878 |
+
if (targetContent.classList.contains('hidden')) {
|
| 879 |
+
chevron.style.transform = 'rotate(0deg)';
|
| 880 |
+
} else {
|
| 881 |
+
chevron.style.transform = 'rotate(180deg)';
|
| 882 |
+
}
|
| 883 |
+
});
|
| 884 |
+
});
|
| 885 |
+
|
| 886 |
+
// Language selection
|
| 887 |
+
const languageSelect = document.getElementById('languageSelect');
|
| 888 |
+
languageSelect.addEventListener('change', (e) => {
|
| 889 |
+
localStorage.setItem('selectedLanguage', e.target.value);
|
| 890 |
+
console.log('Language changed to:', e.target.value);
|
| 891 |
+
});
|
| 892 |
+
|
| 893 |
+
// Load saved language
|
| 894 |
+
const savedLanguage = localStorage.getItem('selectedLanguage');
|
| 895 |
+
if (savedLanguage) {
|
| 896 |
+
languageSelect.value = savedLanguage;
|
| 897 |
+
}
|
| 898 |
+
|
| 899 |
+
// Toggle switches functionality
|
| 900 |
+
document.querySelectorAll('button[class*="inline-flex"]').forEach(toggle => {
|
| 901 |
+
toggle.addEventListener('click', () => {
|
| 902 |
+
const span = toggle.querySelector('span');
|
| 903 |
+
const isActive = span.classList.contains('translate-x-6');
|
| 904 |
+
|
| 905 |
+
if (isActive) {
|
| 906 |
+
span.classList.remove('translate-x-6');
|
| 907 |
+
span.classList.add('translate-x-1');
|
| 908 |
+
toggle.classList.remove('bg-primary');
|
| 909 |
+
toggle.classList.add('bg-gray-300');
|
| 910 |
+
} else {
|
| 911 |
+
span.classList.remove('translate-x-1');
|
| 912 |
+
span.classList.add('translate-x-6');
|
| 913 |
+
toggle.classList.remove('bg-gray-300');
|
| 914 |
+
toggle.classList.add('bg-primary');
|
| 915 |
+
}
|
| 916 |
+
});
|
| 917 |
+
});
|
| 918 |
+
|
| 919 |
+
// Range sliders
|
| 920 |
+
document.querySelectorAll('input[type="range"]').forEach(slider => {
|
| 921 |
+
slider.addEventListener('input', (e) => {
|
| 922 |
+
const value = e.target.value;
|
| 923 |
+
const nextSibling = e.target.nextElementSibling;
|
| 924 |
+
if (nextSibling && nextSibling.tagName === 'SPAN') {
|
| 925 |
+
if (e.target.min === '10' && e.target.max === '120') {
|
| 926 |
+
nextSibling.textContent = value + 's';
|
| 927 |
+
} else {
|
| 928 |
+
nextSibling.textContent = value + 'px';
|
| 929 |
+
}
|
| 930 |
+
}
|
| 931 |
+
});
|
| 932 |
+
});
|
| 933 |
+
|
| 934 |
+
// Confirmation modal
|
| 935 |
+
const confirmationModal = document.getElementById('confirmationModal');
|
| 936 |
+
const confirmationMessage = document.getElementById('confirmationMessage');
|
| 937 |
+
const cancelBtn = document.getElementById('cancelBtn');
|
| 938 |
+
const confirmBtn = document.getElementById('confirmBtn');
|
| 939 |
+
|
| 940 |
+
function showConfirmation(message, onConfirm) {
|
| 941 |
+
confirmationMessage.textContent = message;
|
| 942 |
+
confirmationModal.classList.remove('hidden');
|
| 943 |
+
|
| 944 |
+
confirmBtn.onclick = () => {
|
| 945 |
+
confirmationModal.classList.add('hidden');
|
| 946 |
+
onConfirm();
|
| 947 |
+
};
|
| 948 |
+
}
|
| 949 |
+
|
| 950 |
+
cancelBtn.addEventListener('click', () => {
|
| 951 |
+
confirmationModal.classList.add('hidden');
|
| 952 |
+
});
|
| 953 |
+
|
| 954 |
+
// Action buttons
|
| 955 |
+
const saveChangesBtn = document.getElementById('saveChangesBtn');
|
| 956 |
+
const resetDefaultsBtn = document.getElementById('resetDefaultsBtn');
|
| 957 |
+
const exportDataBtn = document.getElementById('exportDataBtn');
|
| 958 |
+
|
| 959 |
+
saveChangesBtn.addEventListener('click', () => {
|
| 960 |
+
// Save all settings to localStorage
|
| 961 |
+
const settings = {
|
| 962 |
+
language: languageSelect.value,
|
| 963 |
+
theme: html.classList.contains('dark') ? 'dark' : 'light',
|
| 964 |
+
// Add other settings here
|
| 965 |
+
};
|
| 966 |
+
localStorage.setItem('userSettings', JSON.stringify(settings));
|
| 967 |
+
|
| 968 |
+
// Show success feedback
|
| 969 |
+
saveChangesBtn.innerHTML = '<i class="fas fa-check mr-2"></i>Saved!';
|
| 970 |
+
saveChangesBtn.classList.add('bg-success');
|
| 971 |
+
setTimeout(() => {
|
| 972 |
+
saveChangesBtn.innerHTML = '<i class="fas fa-save mr-2"></i>Save Changes';
|
| 973 |
+
saveChangesBtn.classList.remove('bg-success');
|
| 974 |
+
}, 2000);
|
| 975 |
+
});
|
| 976 |
+
|
| 977 |
+
resetDefaultsBtn.addEventListener('click', () => {
|
| 978 |
+
showConfirmation('This will reset all settings to their default values. Are you sure?', () => {
|
| 979 |
+
localStorage.removeItem('userSettings');
|
| 980 |
+
localStorage.removeItem('selectedLanguage');
|
| 981 |
+
localStorage.removeItem('theme');
|
| 982 |
+
location.reload();
|
| 983 |
+
});
|
| 984 |
+
});
|
| 985 |
+
|
| 986 |
+
exportDataBtn.addEventListener('click', () => {
|
| 987 |
+
const data = {
|
| 988 |
+
settings: JSON.parse(localStorage.getItem('userSettings') || '{}'),
|
| 989 |
+
language: localStorage.getItem('selectedLanguage'),
|
| 990 |
+
theme: localStorage.getItem('theme'),
|
| 991 |
+
// Add other data here
|
| 992 |
+
};
|
| 993 |
+
|
| 994 |
+
const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
|
| 995 |
+
const url = URL.createObjectURL(blob);
|
| 996 |
+
const a = document.createElement('a');
|
| 997 |
+
a.href = url;
|
| 998 |
+
a.download = 'triviaverse-settings.json';
|
| 999 |
+
a.click();
|
| 1000 |
+
URL.revokeObjectURL(url);
|
| 1001 |
+
});
|
| 1002 |
+
|
| 1003 |
+
// Initialize
|
| 1004 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 1005 |
+
// Load saved settings
|
| 1006 |
+
const savedSettings = localStorage.getItem('userSettings');
|
| 1007 |
+
if (savedSettings) {
|
| 1008 |
+
const settings = JSON.parse(savedSettings);
|
| 1009 |
+
// Apply saved settings
|
| 1010 |
+
console.log('Loaded settings:', settings);
|
| 1011 |
+
}
|
| 1012 |
+
});
|
| 1013 |
+
</script>
|
| 1014 |
+
</body>
|
| 1015 |
+
</html>
|
pages/topic_selection_browse.html
ADDED
|
@@ -0,0 +1,702 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en" class="dark">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>Topic Selection & Browse - TriviaVerse Quiz</title>
|
| 7 |
+
<link rel="stylesheet" href="../css/main.css" />
|
| 8 |
+
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet" />
|
| 9 |
+
<script type="module" src="https://static.rocket.new/rocket-web.js?_cfg=https%3A%2F%2Ftriviavers2501back.builtwithrocket.new&_be=https%3A%2F%2Fapplication.rocket.new&_v=0.1.5"></script>
|
| 10 |
+
</head>
|
| 11 |
+
<body class="bg-background text-text-primary transition-theme">
|
| 12 |
+
<!-- Mobile Menu Overlay -->
|
| 13 |
+
<div id="mobileMenuOverlay" class="fixed inset-0 bg-black bg-opacity-50 z-40 hidden lg:hidden"></div>
|
| 14 |
+
|
| 15 |
+
<!-- Sidebar -->
|
| 16 |
+
<aside id="sidebar" class="fixed left-0 top-0 h-full w-80 bg-surface border-r border-border transform -translate-x-full lg:translate-x-0 transition-transform duration-300 z-50 lg:z-auto">
|
| 17 |
+
<div class="p-6 border-b border-border">
|
| 18 |
+
<!-- Logo -->
|
| 19 |
+
<div class="flex items-center space-x-3 mb-6">
|
| 20 |
+
<div class="w-10 h-10 bg-gradient-to-br from-primary to-secondary rounded-lg flex items-center justify-center">
|
| 21 |
+
<i class="fas fa-brain text-white text-lg"></i>
|
| 22 |
+
</div>
|
| 23 |
+
<div>
|
| 24 |
+
<h1 class="text-xl font-bold text-text-primary">TriviaVerse</h1>
|
| 25 |
+
<p class="text-sm text-text-secondary">Quiz Platform</p>
|
| 26 |
+
</div>
|
| 27 |
+
</div>
|
| 28 |
+
|
| 29 |
+
<!-- Close button for mobile -->
|
| 30 |
+
<button id="closeSidebar" class="absolute top-4 right-4 lg:hidden text-text-secondary hover:text-text-primary">
|
| 31 |
+
<i class="fas fa-times text-xl"></i>
|
| 32 |
+
</button>
|
| 33 |
+
</div>
|
| 34 |
+
|
| 35 |
+
<!-- Navigation -->
|
| 36 |
+
<nav class="p-6 space-y-2">
|
| 37 |
+
<a href="quiz_dashboard.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 38 |
+
<i class="fas fa-home"></i>
|
| 39 |
+
<span>Dashboard</span>
|
| 40 |
+
</a>
|
| 41 |
+
<a href="active_quiz_interface.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 42 |
+
<i class="fas fa-play-circle"></i>
|
| 43 |
+
<span>Active Quiz</span>
|
| 44 |
+
</a>
|
| 45 |
+
<a href="quiz_results_statistics.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 46 |
+
<i class="fas fa-chart-bar"></i>
|
| 47 |
+
<span>Statistics</span>
|
| 48 |
+
</a>
|
| 49 |
+
<a href="topic_selection_browse.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg bg-primary text-white">
|
| 50 |
+
<i class="fas fa-book"></i>
|
| 51 |
+
<span>Browse Topics</span>
|
| 52 |
+
</a>
|
| 53 |
+
<a href="settings_preferences.html" class="flex items-center space-x-3 px-4 py-3 rounded-lg text-text-secondary hover:text-text-primary hover:bg-surface-hover transition-colors">
|
| 54 |
+
<i class="fas fa-cog"></i>
|
| 55 |
+
<span>Settings</span>
|
| 56 |
+
</a>
|
| 57 |
+
</nav>
|
| 58 |
+
|
| 59 |
+
<!-- Advanced Filters -->
|
| 60 |
+
<div class="p-6 border-t border-border">
|
| 61 |
+
<h3 class="text-sm font-semibold text-text-primary mb-4">Advanced Filters</h3>
|
| 62 |
+
|
| 63 |
+
<!-- Difficulty Level -->
|
| 64 |
+
<div class="mb-4">
|
| 65 |
+
<label class="block text-sm text-text-secondary mb-2">Difficulty Level</label>
|
| 66 |
+
<select id="difficultyFilter" class="w-full bg-background border border-border rounded-lg px-3 py-2 text-text-primary focus:outline-none focus:ring-2 focus:ring-primary">
|
| 67 |
+
<option value>All Levels</option>
|
| 68 |
+
<option value="beginner">🟢 Beginner</option>
|
| 69 |
+
<option value="intermediate">🟡 Intermediate</option>
|
| 70 |
+
<option value="advanced">🔴 Advanced</option>
|
| 71 |
+
<option value="expert">🟣 Expert</option>
|
| 72 |
+
</select>
|
| 73 |
+
</div>
|
| 74 |
+
|
| 75 |
+
<!-- Content Source -->
|
| 76 |
+
<div class="mb-4">
|
| 77 |
+
<label class="block text-sm text-text-secondary mb-2">Content Source</label>
|
| 78 |
+
<div class="space-y-2">
|
| 79 |
+
<label class="flex items-center">
|
| 80 |
+
<input type="checkbox" class="mr-2 text-primary" checked />
|
| 81 |
+
<span class="text-sm text-text-primary">Wikipedia</span>
|
| 82 |
+
</label>
|
| 83 |
+
<label class="flex items-center">
|
| 84 |
+
<input type="checkbox" class="mr-2 text-primary" checked />
|
| 85 |
+
<span class="text-sm text-text-primary">Wikidata</span>
|
| 86 |
+
</label>
|
| 87 |
+
<label class="flex items-center">
|
| 88 |
+
<input type="checkbox" class="mr-2 text-primary" />
|
| 89 |
+
<span class="text-sm text-text-primary">Wikibooks</span>
|
| 90 |
+
</label>
|
| 91 |
+
</div>
|
| 92 |
+
</div>
|
| 93 |
+
|
| 94 |
+
<!-- Language Availability -->
|
| 95 |
+
<div class="mb-4">
|
| 96 |
+
<label class="block text-sm text-text-secondary mb-2">Language</label>
|
| 97 |
+
<select id="languageFilter" class="w-full bg-background border border-border rounded-lg px-3 py-2 text-text-primary focus:outline-none focus:ring-2 focus:ring-primary">
|
| 98 |
+
<option value>All Languages</option>
|
| 99 |
+
<option value="en">English</option>
|
| 100 |
+
<option value="te">తెలుగు (Telugu)</option>
|
| 101 |
+
<option value="hi">हिंदी (Hindi)</option>
|
| 102 |
+
<option value="kn">ಕನ್ನಡ (Kannada)</option>
|
| 103 |
+
</select>
|
| 104 |
+
</div>
|
| 105 |
+
|
| 106 |
+
<!-- Reset Filters -->
|
| 107 |
+
<button id="resetFilters" class="w-full btn btn-secondary text-sm">
|
| 108 |
+
<i class="fas fa-refresh mr-2"></i>
|
| 109 |
+
Reset Filters
|
| 110 |
+
</button>
|
| 111 |
+
</div>
|
| 112 |
+
</aside>
|
| 113 |
+
|
| 114 |
+
<!-- Main Content -->
|
| 115 |
+
<main class="lg:ml-80 min-h-screen">
|
| 116 |
+
<!-- Header -->
|
| 117 |
+
<header class="bg-surface border-b border-border p-4 lg:p-6">
|
| 118 |
+
<div class="flex items-center justify-between">
|
| 119 |
+
<!-- Mobile Menu Button -->
|
| 120 |
+
<button id="mobileMenuBtn" class="lg:hidden text-text-primary hover:text-primary">
|
| 121 |
+
<i class="fas fa-bars text-xl"></i>
|
| 122 |
+
</button>
|
| 123 |
+
|
| 124 |
+
<!-- Page Title -->
|
| 125 |
+
<div class="flex-1 lg:flex-none">
|
| 126 |
+
<h2 class="text-2xl font-bold text-text-primary">Browse Topics</h2>
|
| 127 |
+
<p class="text-text-secondary mt-1">Discover and explore quiz topics from Wikipedia</p>
|
| 128 |
+
</div>
|
| 129 |
+
|
| 130 |
+
<!-- User Avatar -->
|
| 131 |
+
<div class="hidden lg:flex items-center space-x-3">
|
| 132 |
+
<img src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="User Avatar" class="w-10 h-10 rounded-full object-cover" onerror="this.src='https://images.unsplash.com/photo-1584824486509-112e4181ff6b?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'; this.onerror=null;" />
|
| 133 |
+
<div>
|
| 134 |
+
<p class="text-sm font-medium text-text-primary">John Doe</p>
|
| 135 |
+
<p class="text-xs text-text-secondary">Level 5 Quizzer</p>
|
| 136 |
+
</div>
|
| 137 |
+
</div>
|
| 138 |
+
</div>
|
| 139 |
+
</header>
|
| 140 |
+
|
| 141 |
+
<!-- Search Section -->
|
| 142 |
+
<div class="p-4 lg:p-6 border-b border-border bg-surface">
|
| 143 |
+
<div class="max-w-4xl mx-auto">
|
| 144 |
+
<div class="relative">
|
| 145 |
+
<div class="absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none">
|
| 146 |
+
<i class="fas fa-search text-text-secondary"></i>
|
| 147 |
+
</div>
|
| 148 |
+
<input type="text" id="topicSearch" placeholder="Search topics from Wikipedia..." class="w-full pl-12 pr-4 py-4 bg-background border border-border rounded-xl text-text-primary placeholder-text-secondary focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent" />
|
| 149 |
+
<div class="absolute inset-y-0 right-0 pr-4 flex items-center">
|
| 150 |
+
<button id="clearSearch" class="text-text-secondary hover:text-text-primary hidden">
|
| 151 |
+
<i class="fas fa-times"></i>
|
| 152 |
+
</button>
|
| 153 |
+
</div>
|
| 154 |
+
</div>
|
| 155 |
+
|
| 156 |
+
<!-- Search Suggestions -->
|
| 157 |
+
<div id="searchSuggestions" class="hidden mt-2 bg-background border border-border rounded-lg shadow-lg max-h-60 overflow-y-auto">
|
| 158 |
+
<!-- Dynamic suggestions will be populated here -->
|
| 159 |
+
</div>
|
| 160 |
+
</div>
|
| 161 |
+
</div>
|
| 162 |
+
|
| 163 |
+
<!-- Content Area -->
|
| 164 |
+
<div class="p-4 lg:p-6 space-y-8">
|
| 165 |
+
<!-- Trending Topics -->
|
| 166 |
+
<section>
|
| 167 |
+
<div class="flex items-center justify-between mb-6">
|
| 168 |
+
<h3 class="text-xl font-semibold text-text-primary">🔥 Trending Topics</h3>
|
| 169 |
+
<button class="text-primary hover:text-primary-700 text-sm font-medium">
|
| 170 |
+
View All <i class="fas fa-arrow-right ml-1"></i>
|
| 171 |
+
</button>
|
| 172 |
+
</div>
|
| 173 |
+
|
| 174 |
+
<div class="flex space-x-4 overflow-x-auto pb-4 scrollbar-hide">
|
| 175 |
+
<!-- Python Programming - Featured -->
|
| 176 |
+
<div class="flex-shrink-0 w-72 card p-6 border-2 border-primary bg-primary-50 cursor-pointer hover:shadow-lg transition-all">
|
| 177 |
+
<div class="flex items-start justify-between mb-4">
|
| 178 |
+
<div class="w-12 h-12 bg-primary rounded-lg flex items-center justify-center">
|
| 179 |
+
<i class="fab fa-python text-white text-xl"></i>
|
| 180 |
+
</div>
|
| 181 |
+
<div class="flex items-center space-x-2">
|
| 182 |
+
<span class="bg-primary text-white text-xs px-2 py-1 rounded-full">Featured</span>
|
| 183 |
+
<span class="bg-accent text-white text-xs px-2 py-1 rounded-full">Hot</span>
|
| 184 |
+
</div>
|
| 185 |
+
</div>
|
| 186 |
+
<h4 class="text-lg font-semibold text-primary mb-2">Python Programming</h4>
|
| 187 |
+
<p class="text-sm text-text-secondary mb-4">Master Python concepts with interactive quizzes</p>
|
| 188 |
+
<div class="flex items-center justify-between text-xs text-text-secondary mb-4">
|
| 189 |
+
<span><i class="fas fa-question-circle mr-1"></i>250+ Questions</span>
|
| 190 |
+
<span><i class="fas fa-signal mr-1"></i>Intermediate</span>
|
| 191 |
+
<span><i class="fas fa-users mr-1"></i>1.2k Active</span>
|
| 192 |
+
</div>
|
| 193 |
+
<button class="w-full btn btn-primary text-sm">
|
| 194 |
+
<i class="fas fa-play mr-2"></i>Start Quiz
|
| 195 |
+
</button>
|
| 196 |
+
</div>
|
| 197 |
+
|
| 198 |
+
<!-- Quantum Physics -->
|
| 199 |
+
<div class="flex-shrink-0 w-72 card p-6 cursor-pointer hover:shadow-lg transition-all">
|
| 200 |
+
<div class="flex items-start justify-between mb-4">
|
| 201 |
+
<div class="w-12 h-12 bg-secondary-100 rounded-lg flex items-center justify-center">
|
| 202 |
+
<i class="fas fa-atom text-secondary text-xl"></i>
|
| 203 |
+
</div>
|
| 204 |
+
<div class="flex items-center space-x-2">
|
| 205 |
+
<span class="bg-secondary text-white text-xs px-2 py-1 rounded-full">New</span>
|
| 206 |
+
<span class="bg-error text-white text-xs px-2 py-1 rounded-full">🔴 Advanced</span>
|
| 207 |
+
</div>
|
| 208 |
+
</div>
|
| 209 |
+
<h4 class="text-lg font-semibold text-text-primary mb-2">Quantum Physics</h4>
|
| 210 |
+
<p class="text-sm text-text-secondary mb-4">Explore the fascinating world of quantum mechanics</p>
|
| 211 |
+
<div class="flex items-center justify-between text-xs text-text-secondary mb-4">
|
| 212 |
+
<span><i class="fas fa-question-circle mr-1"></i>180+ Questions</span>
|
| 213 |
+
<span><i class="fas fa-signal mr-1"></i>Advanced</span>
|
| 214 |
+
<span><i class="fas fa-users mr-1"></i>890 Active</span>
|
| 215 |
+
</div>
|
| 216 |
+
<button class="w-full btn btn-secondary text-sm">
|
| 217 |
+
<i class="fas fa-play mr-2"></i>Start Quiz
|
| 218 |
+
</button>
|
| 219 |
+
</div>
|
| 220 |
+
|
| 221 |
+
<!-- World History -->
|
| 222 |
+
<div class="flex-shrink-0 w-72 card p-6 cursor-pointer hover:shadow-lg transition-all">
|
| 223 |
+
<div class="flex items-start justify-between mb-4">
|
| 224 |
+
<div class="w-12 h-12 bg-accent-100 rounded-lg flex items-center justify-center">
|
| 225 |
+
<i class="fas fa-globe-americas text-accent text-xl"></i>
|
| 226 |
+
</div>
|
| 227 |
+
<div class="flex items-center space-x-2">
|
| 228 |
+
<span class="bg-accent text-white text-xs px-2 py-1 rounded-full">Popular</span>
|
| 229 |
+
<span class="bg-warning text-white text-xs px-2 py-1 rounded-full">🟡 Intermediate</span>
|
| 230 |
+
</div>
|
| 231 |
+
</div>
|
| 232 |
+
<h4 class="text-lg font-semibold text-text-primary mb-2">World History</h4>
|
| 233 |
+
<p class="text-sm text-text-secondary mb-4">Journey through major historical events</p>
|
| 234 |
+
<div class="flex items-center justify-between text-xs text-text-secondary mb-4">
|
| 235 |
+
<span><i class="fas fa-question-circle mr-1"></i>320+ Questions</span>
|
| 236 |
+
<span><i class="fas fa-signal mr-1"></i>Intermediate</span>
|
| 237 |
+
<span><i class="fas fa-users mr-1"></i>2.1k Active</span>
|
| 238 |
+
</div>
|
| 239 |
+
<button class="w-full btn btn-accent text-sm">
|
| 240 |
+
<i class="fas fa-play mr-2"></i>Start Quiz
|
| 241 |
+
</button>
|
| 242 |
+
</div>
|
| 243 |
+
|
| 244 |
+
<!-- Machine Learning -->
|
| 245 |
+
<div class="flex-shrink-0 w-72 card p-6 cursor-pointer hover:shadow-lg transition-all">
|
| 246 |
+
<div class="flex items-start justify-between mb-4">
|
| 247 |
+
<div class="w-12 h-12 bg-primary-100 rounded-lg flex items-center justify-center">
|
| 248 |
+
<i class="fas fa-robot text-primary text-xl"></i>
|
| 249 |
+
</div>
|
| 250 |
+
<div class="flex items-center space-x-2">
|
| 251 |
+
<span class="bg-success text-white text-xs px-2 py-1 rounded-full">Trending</span>
|
| 252 |
+
<span class="bg-error text-white text-xs px-2 py-1 rounded-full">🔴 Advanced</span>
|
| 253 |
+
</div>
|
| 254 |
+
</div>
|
| 255 |
+
<h4 class="text-lg font-semibold text-text-primary mb-2">Machine Learning</h4>
|
| 256 |
+
<p class="text-sm text-text-secondary mb-4">Test your AI and ML knowledge</p>
|
| 257 |
+
<div class="flex items-center justify-between text-xs text-text-secondary mb-4">
|
| 258 |
+
<span><i class="fas fa-question-circle mr-1"></i>200+ Questions</span>
|
| 259 |
+
<span><i class="fas fa-signal mr-1"></i>Advanced</span>
|
| 260 |
+
<span><i class="fas fa-users mr-1"></i>1.5k Active</span>
|
| 261 |
+
</div>
|
| 262 |
+
<button class="w-full btn btn-primary text-sm">
|
| 263 |
+
<i class="fas fa-play mr-2"></i>Start Quiz
|
| 264 |
+
</button>
|
| 265 |
+
</div>
|
| 266 |
+
</div>
|
| 267 |
+
</section>
|
| 268 |
+
|
| 269 |
+
<!-- Featured Categories -->
|
| 270 |
+
<section>
|
| 271 |
+
<h3 class="text-xl font-semibold text-text-primary mb-6">📚 Featured Categories</h3>
|
| 272 |
+
|
| 273 |
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
| 274 |
+
<!-- Sciences Category -->
|
| 275 |
+
<div class="card p-6">
|
| 276 |
+
<div class="flex items-center justify-between mb-4">
|
| 277 |
+
<div class="flex items-center space-x-3">
|
| 278 |
+
<div class="w-12 h-12 bg-secondary-100 rounded-lg flex items-center justify-center">
|
| 279 |
+
<i class="fas fa-flask text-secondary text-xl"></i>
|
| 280 |
+
</div>
|
| 281 |
+
<div>
|
| 282 |
+
<h4 class="text-lg font-semibold text-text-primary">Sciences</h4>
|
| 283 |
+
<p class="text-sm text-text-secondary">Physics, Chemistry, Biology & More</p>
|
| 284 |
+
</div>
|
| 285 |
+
</div>
|
| 286 |
+
<button class="text-secondary hover:text-secondary-600">
|
| 287 |
+
<i class="fas fa-chevron-down"></i>
|
| 288 |
+
</button>
|
| 289 |
+
</div>
|
| 290 |
+
|
| 291 |
+
<div class="space-y-3">
|
| 292 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg hover:bg-surface-hover cursor-pointer transition-colors">
|
| 293 |
+
<div class="flex items-center space-x-3">
|
| 294 |
+
<i class="fas fa-atom text-secondary text-sm"></i>
|
| 295 |
+
<span class="text-sm text-text-primary">Physics</span>
|
| 296 |
+
</div>
|
| 297 |
+
<div class="flex items-center space-x-2">
|
| 298 |
+
<span class="text-xs text-text-secondary">150+ questions</span>
|
| 299 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 300 |
+
</div>
|
| 301 |
+
</div>
|
| 302 |
+
|
| 303 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg hover:bg-surface-hover cursor-pointer transition-colors">
|
| 304 |
+
<div class="flex items-center space-x-3">
|
| 305 |
+
<i class="fas fa-vial text-secondary text-sm"></i>
|
| 306 |
+
<span class="text-sm text-text-primary">Chemistry</span>
|
| 307 |
+
</div>
|
| 308 |
+
<div class="flex items-center space-x-2">
|
| 309 |
+
<span class="text-xs text-text-secondary">120+ questions</span>
|
| 310 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 311 |
+
</div>
|
| 312 |
+
</div>
|
| 313 |
+
|
| 314 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg hover:bg-surface-hover cursor-pointer transition-colors">
|
| 315 |
+
<div class="flex items-center space-x-3">
|
| 316 |
+
<i class="fas fa-dna text-secondary text-sm"></i>
|
| 317 |
+
<span class="text-sm text-text-primary">Biology</span>
|
| 318 |
+
</div>
|
| 319 |
+
<div class="flex items-center space-x-2">
|
| 320 |
+
<span class="text-xs text-text-secondary">200+ questions</span>
|
| 321 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 322 |
+
</div>
|
| 323 |
+
</div>
|
| 324 |
+
</div>
|
| 325 |
+
</div></div></section>
|
| 326 |
+
|
| 327 |
+
<!-- Technology Category -->
|
| 328 |
+
<div class="card p-6">
|
| 329 |
+
<div class="flex items-center justify-between mb-4">
|
| 330 |
+
<div class="flex items-center space-x-3">
|
| 331 |
+
<div class="w-12 h-12 bg-primary-100 rounded-lg flex items-center justify-center">
|
| 332 |
+
<i class="fas fa-laptop-code text-primary text-xl"></i>
|
| 333 |
+
</div>
|
| 334 |
+
<div>
|
| 335 |
+
<h4 class="text-lg font-semibold text-text-primary">Technology</h4>
|
| 336 |
+
<p class="text-sm text-text-secondary">Programming, AI, Web Development</p>
|
| 337 |
+
</div>
|
| 338 |
+
</div>
|
| 339 |
+
<button class="text-primary hover:text-primary-600">
|
| 340 |
+
<i class="fas fa-chevron-down"></i>
|
| 341 |
+
</button>
|
| 342 |
+
</div>
|
| 343 |
+
|
| 344 |
+
<div class="space-y-3">
|
| 345 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg hover:bg-surface-hover cursor-pointer transition-colors border-l-4 border-primary">
|
| 346 |
+
<div class="flex items-center space-x-3">
|
| 347 |
+
<i class="fab fa-python text-primary text-sm"></i>
|
| 348 |
+
<span class="text-sm text-text-primary font-medium">Python Programming</span>
|
| 349 |
+
</div>
|
| 350 |
+
<div class="flex items-center space-x-2">
|
| 351 |
+
<span class="text-xs bg-primary text-white px-2 py-1 rounded-full">Featured</span>
|
| 352 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 353 |
+
</div>
|
| 354 |
+
</div>
|
| 355 |
+
|
| 356 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg hover:bg-surface-hover cursor-pointer transition-colors">
|
| 357 |
+
<div class="flex items-center space-x-3">
|
| 358 |
+
<i class="fab fa-js-square text-primary text-sm"></i>
|
| 359 |
+
<span class="text-sm text-text-primary">JavaScript</span>
|
| 360 |
+
</div>
|
| 361 |
+
<div class="flex items-center space-x-2">
|
| 362 |
+
<span class="text-xs text-text-secondary">180+ questions</span>
|
| 363 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 364 |
+
</div>
|
| 365 |
+
</div>
|
| 366 |
+
|
| 367 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg hover:bg-surface-hover cursor-pointer transition-colors">
|
| 368 |
+
<div class="flex items-center space-x-3">
|
| 369 |
+
<i class="fas fa-robot text-primary text-sm"></i>
|
| 370 |
+
<span class="text-sm text-text-primary">Artificial Intelligence</span>
|
| 371 |
+
</div>
|
| 372 |
+
<div class="flex items-center space-x-2">
|
| 373 |
+
<span class="text-xs text-text-secondary">160+ questions</span>
|
| 374 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 375 |
+
</div>
|
| 376 |
+
</div>
|
| 377 |
+
</div>
|
| 378 |
+
</div>
|
| 379 |
+
|
| 380 |
+
<!-- History Category -->
|
| 381 |
+
<div class="card p-6">
|
| 382 |
+
<div class="flex items-center justify-between mb-4">
|
| 383 |
+
<div class="flex items-center space-x-3">
|
| 384 |
+
<div class="w-12 h-12 bg-accent-100 rounded-lg flex items-center justify-center">
|
| 385 |
+
<i class="fas fa-landmark text-accent text-xl"></i>
|
| 386 |
+
</div>
|
| 387 |
+
<div>
|
| 388 |
+
<h4 class="text-lg font-semibold text-text-primary">History</h4>
|
| 389 |
+
<p class="text-sm text-text-secondary">Ancient, Medieval, Modern History</p>
|
| 390 |
+
</div>
|
| 391 |
+
</div>
|
| 392 |
+
<button class="text-accent hover:text-accent-600">
|
| 393 |
+
<i class="fas fa-chevron-down"></i>
|
| 394 |
+
</button>
|
| 395 |
+
</div>
|
| 396 |
+
|
| 397 |
+
<div class="space-y-3">
|
| 398 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg hover:bg-surface-hover cursor-pointer transition-colors">
|
| 399 |
+
<div class="flex items-center space-x-3">
|
| 400 |
+
<i class="fas fa-crown text-accent text-sm"></i>
|
| 401 |
+
<span class="text-sm text-text-primary">Ancient Civilizations</span>
|
| 402 |
+
</div>
|
| 403 |
+
<div class="flex items-center space-x-2">
|
| 404 |
+
<span class="text-xs text-text-secondary">140+ questions</span>
|
| 405 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 406 |
+
</div>
|
| 407 |
+
</div>
|
| 408 |
+
|
| 409 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg hover:bg-surface-hover cursor-pointer transition-colors">
|
| 410 |
+
<div class="flex items-center space-x-3">
|
| 411 |
+
<i class="fas fa-globe-americas text-accent text-sm"></i>
|
| 412 |
+
<span class="text-sm text-text-primary">World Wars</span>
|
| 413 |
+
</div>
|
| 414 |
+
<div class="flex items-center space-x-2">
|
| 415 |
+
<span class="text-xs text-text-secondary">190+ questions</span>
|
| 416 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 417 |
+
</div>
|
| 418 |
+
</div>
|
| 419 |
+
|
| 420 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg hover:bg-surface-hover cursor-pointer transition-colors">
|
| 421 |
+
<div class="flex items-center space-x-3">
|
| 422 |
+
<i class="fas fa-flag text-accent text-sm"></i>
|
| 423 |
+
<span class="text-sm text-text-primary">Indian History</span>
|
| 424 |
+
</div>
|
| 425 |
+
<div class="flex items-center space-x-2">
|
| 426 |
+
<span class="text-xs text-text-secondary">220+ questions</span>
|
| 427 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 428 |
+
</div>
|
| 429 |
+
</div>
|
| 430 |
+
</div>
|
| 431 |
+
</div>
|
| 432 |
+
|
| 433 |
+
<!-- Literature Category -->
|
| 434 |
+
<div class="card p-6">
|
| 435 |
+
<div class="flex items-center justify-between mb-4">
|
| 436 |
+
<div class="flex items-center space-x-3">
|
| 437 |
+
<div class="w-12 h-12 bg-success-100 rounded-lg flex items-center justify-center">
|
| 438 |
+
<i class="fas fa-book-open text-success text-xl"></i>
|
| 439 |
+
</div>
|
| 440 |
+
<div>
|
| 441 |
+
<h4 class="text-lg font-semibold text-text-primary">Literature</h4>
|
| 442 |
+
<p class="text-sm text-text-secondary">Classic & Modern Literature</p>
|
| 443 |
+
</div>
|
| 444 |
+
</div>
|
| 445 |
+
<button class="text-success hover:text-success-600">
|
| 446 |
+
<i class="fas fa-chevron-down"></i>
|
| 447 |
+
</button>
|
| 448 |
+
</div>
|
| 449 |
+
|
| 450 |
+
<div class="space-y-3">
|
| 451 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg hover:bg-surface-hover cursor-pointer transition-colors">
|
| 452 |
+
<div class="flex items-center space-x-3">
|
| 453 |
+
<i class="fas fa-feather text-success text-sm"></i>
|
| 454 |
+
<span class="text-sm text-text-primary">Shakespeare</span>
|
| 455 |
+
</div>
|
| 456 |
+
<div class="flex items-center space-x-2">
|
| 457 |
+
<span class="text-xs text-text-secondary">100+ questions</span>
|
| 458 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 459 |
+
</div>
|
| 460 |
+
</div>
|
| 461 |
+
|
| 462 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg hover:bg-surface-hover cursor-pointer transition-colors">
|
| 463 |
+
<div class="flex items-center space-x-3">
|
| 464 |
+
<i class="fas fa-scroll text-success text-sm"></i>
|
| 465 |
+
<span class="text-sm text-text-primary">Poetry</span>
|
| 466 |
+
</div>
|
| 467 |
+
<div class="flex items-center space-x-2">
|
| 468 |
+
<span class="text-xs text-text-secondary">80+ questions</span>
|
| 469 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 470 |
+
</div>
|
| 471 |
+
</div>
|
| 472 |
+
|
| 473 |
+
<div class="flex items-center justify-between p-3 bg-background rounded-lg hover:bg-surface-hover cursor-pointer transition-colors">
|
| 474 |
+
<div class="flex items-center space-x-3">
|
| 475 |
+
<i class="fas fa-book text-success text-sm"></i>
|
| 476 |
+
<span class="text-sm text-text-primary">Modern Fiction</span>
|
| 477 |
+
</div>
|
| 478 |
+
<div class="flex items-center space-x-2">
|
| 479 |
+
<span class="text-xs text-text-secondary">120+ questions</span>
|
| 480 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 481 |
+
</div>
|
| 482 |
+
</div>
|
| 483 |
+
</div>
|
| 484 |
+
</div>
|
| 485 |
+
</div>
|
| 486 |
+
|
| 487 |
+
|
| 488 |
+
<!-- Quick Start Section -->
|
| 489 |
+
<section class="card p-8 text-center bg-gradient-to-r from-primary-50 to-secondary-50 border-2 border-primary">
|
| 490 |
+
<div class="max-w-2xl mx-auto">
|
| 491 |
+
<div class="w-16 h-16 bg-primary rounded-full flex items-center justify-center mx-auto mb-4">
|
| 492 |
+
<i class="fas fa-rocket text-white text-2xl"></i>
|
| 493 |
+
</div>
|
| 494 |
+
<h3 class="text-2xl font-bold text-text-primary mb-2">Ready to Start Your Quiz Journey?</h3>
|
| 495 |
+
<p class="text-text-secondary mb-6">Select any topic above or use our intelligent topic matching to find the perfect quiz for you.</p>
|
| 496 |
+
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
| 497 |
+
<button id="randomTopicBtn" class="btn btn-primary px-6 py-3">
|
| 498 |
+
<i class="fas fa-random mr-2"></i>
|
| 499 |
+
Surprise Me with a Topic
|
| 500 |
+
</button>
|
| 501 |
+
<button id="continueLastBtn" class="btn btn-secondary px-6 py-3">
|
| 502 |
+
<i class="fas fa-play mr-2"></i>
|
| 503 |
+
Continue Last Quiz
|
| 504 |
+
</button>
|
| 505 |
+
</div>
|
| 506 |
+
</div>
|
| 507 |
+
</section>
|
| 508 |
+
|
| 509 |
+
</main>
|
| 510 |
+
|
| 511 |
+
<script>
|
| 512 |
+
// Mobile menu functionality
|
| 513 |
+
const mobileMenuBtn = document.getElementById('mobileMenuBtn');
|
| 514 |
+
const sidebar = document.getElementById('sidebar');
|
| 515 |
+
const mobileMenuOverlay = document.getElementById('mobileMenuOverlay');
|
| 516 |
+
const closeSidebar = document.getElementById('closeSidebar');
|
| 517 |
+
|
| 518 |
+
mobileMenuBtn.addEventListener('click', () => {
|
| 519 |
+
sidebar.classList.remove('-translate-x-full');
|
| 520 |
+
mobileMenuOverlay.classList.remove('hidden');
|
| 521 |
+
});
|
| 522 |
+
|
| 523 |
+
closeSidebar.addEventListener('click', () => {
|
| 524 |
+
sidebar.classList.add('-translate-x-full');
|
| 525 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 526 |
+
});
|
| 527 |
+
|
| 528 |
+
mobileMenuOverlay.addEventListener('click', () => {
|
| 529 |
+
sidebar.classList.add('-translate-x-full');
|
| 530 |
+
mobileMenuOverlay.classList.add('hidden');
|
| 531 |
+
});
|
| 532 |
+
|
| 533 |
+
// Search functionality
|
| 534 |
+
const topicSearch = document.getElementById('topicSearch');
|
| 535 |
+
const clearSearch = document.getElementById('clearSearch');
|
| 536 |
+
const searchSuggestions = document.getElementById('searchSuggestions');
|
| 537 |
+
|
| 538 |
+
// Mock search suggestions
|
| 539 |
+
const mockSuggestions = [
|
| 540 |
+
{ title: 'Python Programming', category: 'Technology', questions: 250 },
|
| 541 |
+
{ title: 'Quantum Physics', category: 'Science', questions: 180 },
|
| 542 |
+
{ title: 'World History', category: 'History', questions: 320 },
|
| 543 |
+
{ title: 'Machine Learning', category: 'Technology', questions: 200 },
|
| 544 |
+
{ title: 'Shakespeare', category: 'Literature', questions: 100 },
|
| 545 |
+
{ title: 'Chemistry Basics', category: 'Science', questions: 150 },
|
| 546 |
+
{ title: 'Ancient Rome', category: 'History', questions: 140 },
|
| 547 |
+
{ title: 'JavaScript', category: 'Technology', questions: 180 }
|
| 548 |
+
];
|
| 549 |
+
|
| 550 |
+
topicSearch.addEventListener('input', (e) => {
|
| 551 |
+
const query = e.target.value.toLowerCase();
|
| 552 |
+
|
| 553 |
+
if (query.length > 0) {
|
| 554 |
+
clearSearch.classList.remove('hidden');
|
| 555 |
+
|
| 556 |
+
const filteredSuggestions = mockSuggestions.filter(item =>
|
| 557 |
+
item.title.toLowerCase().includes(query) ||
|
| 558 |
+
item.category.toLowerCase().includes(query)
|
| 559 |
+
);
|
| 560 |
+
|
| 561 |
+
if (filteredSuggestions.length > 0) {
|
| 562 |
+
searchSuggestions.innerHTML = filteredSuggestions.map(item => `
|
| 563 |
+
<div class="p-3 hover:bg-surface-hover cursor-pointer border-b border-border last:border-b-0" data-topic="${item.title}">
|
| 564 |
+
<div class="flex items-center justify-between">
|
| 565 |
+
<div>
|
| 566 |
+
<p class="text-sm font-medium text-text-primary">${item.title}</p>
|
| 567 |
+
<p class="text-xs text-text-secondary">${item.category} • ${item.questions}+ questions</p>
|
| 568 |
+
</div>
|
| 569 |
+
<i class="fas fa-arrow-right text-text-secondary text-xs"></i>
|
| 570 |
+
</div>
|
| 571 |
+
</div>
|
| 572 |
+
`).join('');
|
| 573 |
+
searchSuggestions.classList.remove('hidden');
|
| 574 |
+
} else {
|
| 575 |
+
searchSuggestions.innerHTML = `
|
| 576 |
+
<div class="p-4 text-center text-text-secondary">
|
| 577 |
+
<i class="fas fa-search mb-2"></i>
|
| 578 |
+
<p class="text-sm">No topics found for "${query}"</p>
|
| 579 |
+
</div>
|
| 580 |
+
`;
|
| 581 |
+
searchSuggestions.classList.remove('hidden');
|
| 582 |
+
}
|
| 583 |
+
} else {
|
| 584 |
+
clearSearch.classList.add('hidden');
|
| 585 |
+
searchSuggestions.classList.add('hidden');
|
| 586 |
+
}
|
| 587 |
+
});
|
| 588 |
+
|
| 589 |
+
clearSearch.addEventListener('click', () => {
|
| 590 |
+
topicSearch.value = '';
|
| 591 |
+
clearSearch.classList.add('hidden');
|
| 592 |
+
searchSuggestions.classList.add('hidden');
|
| 593 |
+
});
|
| 594 |
+
|
| 595 |
+
// Handle suggestion clicks
|
| 596 |
+
searchSuggestions.addEventListener('click', (e) => {
|
| 597 |
+
const suggestionItem = e.target.closest('[data-topic]');
|
| 598 |
+
if (suggestionItem) {
|
| 599 |
+
const topicName = suggestionItem.dataset.topic;
|
| 600 |
+
localStorage.setItem('selectedTopic', topicName.toLowerCase().replace(/\s+/g, '_'));
|
| 601 |
+
window.location.href = 'active_quiz_interface.html';
|
| 602 |
+
}
|
| 603 |
+
});
|
| 604 |
+
|
| 605 |
+
// Filter functionality
|
| 606 |
+
const difficultyFilter = document.getElementById('difficultyFilter');
|
| 607 |
+
const languageFilter = document.getElementById('languageFilter');
|
| 608 |
+
const resetFilters = document.getElementById('resetFilters');
|
| 609 |
+
|
| 610 |
+
difficultyFilter.addEventListener('change', applyFilters);
|
| 611 |
+
languageFilter.addEventListener('change', applyFilters);
|
| 612 |
+
|
| 613 |
+
function applyFilters() {
|
| 614 |
+
const difficulty = difficultyFilter.value;
|
| 615 |
+
const language = languageFilter.value;
|
| 616 |
+
|
| 617 |
+
// Here you would implement actual filtering logic
|
| 618 |
+
console.log('Applying filters:', { difficulty, language });
|
| 619 |
+
}
|
| 620 |
+
|
| 621 |
+
resetFilters.addEventListener('click', () => {
|
| 622 |
+
difficultyFilter.value = '';
|
| 623 |
+
languageFilter.value = '';
|
| 624 |
+
document.querySelectorAll('input[type="checkbox"]').forEach(cb => cb.checked = false);
|
| 625 |
+
document.querySelectorAll('input[type="checkbox"]')[0].checked = true; // Wikipedia
|
| 626 |
+
document.querySelectorAll('input[type="checkbox"]')[1].checked = true; // Wikidata
|
| 627 |
+
applyFilters();
|
| 628 |
+
});
|
| 629 |
+
|
| 630 |
+
// Topic card clicks
|
| 631 |
+
document.addEventListener('click', (e) => {
|
| 632 |
+
const topicCard = e.target.closest('.card');
|
| 633 |
+
if (topicCard && topicCard.querySelector('button')) {
|
| 634 |
+
const button = topicCard.querySelector('button');
|
| 635 |
+
if (e.target === button || button.contains(e.target)) {
|
| 636 |
+
// Get topic from card title
|
| 637 |
+
const topicTitle = topicCard.querySelector('h4');
|
| 638 |
+
if (topicTitle) {
|
| 639 |
+
const topicName = topicTitle.textContent.toLowerCase().replace(/\s+/g, '_');
|
| 640 |
+
localStorage.setItem('selectedTopic', topicName);
|
| 641 |
+
window.location.href = 'active_quiz_interface.html';
|
| 642 |
+
}
|
| 643 |
+
}
|
| 644 |
+
}
|
| 645 |
+
});
|
| 646 |
+
|
| 647 |
+
// Category item clicks
|
| 648 |
+
document.addEventListener('click', (e) => {
|
| 649 |
+
const categoryItem = e.target.closest('.cursor-pointer');
|
| 650 |
+
if (categoryItem && categoryItem.querySelector('span')) {
|
| 651 |
+
const topicSpan = categoryItem.querySelector('span');
|
| 652 |
+
const topicName = topicSpan.textContent.toLowerCase().replace(/\s+/g, '_');
|
| 653 |
+
localStorage.setItem('selectedTopic', topicName);
|
| 654 |
+
window.location.href = 'active_quiz_interface.html';
|
| 655 |
+
}
|
| 656 |
+
});
|
| 657 |
+
|
| 658 |
+
// Quick start buttons
|
| 659 |
+
const randomTopicBtn = document.getElementById('randomTopicBtn');
|
| 660 |
+
const continueLastBtn = document.getElementById('continueLastBtn');
|
| 661 |
+
|
| 662 |
+
randomTopicBtn.addEventListener('click', () => {
|
| 663 |
+
const randomTopics = ['python_programming', 'quantum_physics', 'world_history', 'machine_learning', 'chemistry', 'javascript'];
|
| 664 |
+
const randomTopic = randomTopics[Math.floor(Math.random() * randomTopics.length)];
|
| 665 |
+
localStorage.setItem('selectedTopic', randomTopic);
|
| 666 |
+
window.location.href = 'active_quiz_interface.html';
|
| 667 |
+
});
|
| 668 |
+
|
| 669 |
+
continueLastBtn.addEventListener('click', () => {
|
| 670 |
+
const lastTopic = localStorage.getItem('selectedTopic') || 'python_programming';
|
| 671 |
+
localStorage.setItem('selectedTopic', lastTopic);
|
| 672 |
+
window.location.href = 'active_quiz_interface.html';
|
| 673 |
+
});
|
| 674 |
+
|
| 675 |
+
// Hide search suggestions when clicking outside
|
| 676 |
+
document.addEventListener('click', (e) => {
|
| 677 |
+
if (!topicSearch.contains(e.target) && !searchSuggestions.contains(e.target)) {
|
| 678 |
+
searchSuggestions.classList.add('hidden');
|
| 679 |
+
}
|
| 680 |
+
});
|
| 681 |
+
|
| 682 |
+
// Category expand/collapse
|
| 683 |
+
document.querySelectorAll('.fa-chevron-down').forEach(chevron => {
|
| 684 |
+
chevron.addEventListener('click', (e) => {
|
| 685 |
+
e.preventDefault();
|
| 686 |
+
const card = e.target.closest('.card');
|
| 687 |
+
const content = card.querySelector('.space-y-3');
|
| 688 |
+
|
| 689 |
+
if (content.style.display === 'none') {
|
| 690 |
+
content.style.display = 'block';
|
| 691 |
+
e.target.classList.remove('fa-chevron-down');
|
| 692 |
+
e.target.classList.add('fa-chevron-up');
|
| 693 |
+
} else {
|
| 694 |
+
content.style.display = 'none';
|
| 695 |
+
e.target.classList.remove('fa-chevron-up');
|
| 696 |
+
e.target.classList.add('fa-chevron-down');
|
| 697 |
+
}
|
| 698 |
+
});
|
| 699 |
+
});
|
| 700 |
+
</script>
|
| 701 |
+
</body>
|
| 702 |
+
</html>
|
public/favicon.ico
ADDED
|
|
Git LFS Details
|
public/manifest.json
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"short_name": "triviaverse_quiz",
|
| 3 |
+
"name": "triviaverse_quiz",
|
| 4 |
+
"icons": [
|
| 5 |
+
{
|
| 6 |
+
"src": "favicon.ico",
|
| 7 |
+
"sizes": "64x64 32x32 24x24 16x16",
|
| 8 |
+
"type": "image/x-icon"
|
| 9 |
+
}
|
| 10 |
+
],
|
| 11 |
+
"start_url": ".",
|
| 12 |
+
"display": "standalone",
|
| 13 |
+
"theme_color": "#000000",
|
| 14 |
+
"background_color": "#ffffff"
|
| 15 |
+
}
|
streamlit_web_interface.html
ADDED
|
@@ -0,0 +1,1431 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>TriviaVerse - Streamlit Web Interface</title>
|
| 7 |
+
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
|
| 8 |
+
<style>
|
| 9 |
+
/* Streamlit-inspired design system */
|
| 10 |
+
:root {
|
| 11 |
+
--primary-color: #FF6B6B;
|
| 12 |
+
--secondary-color: #4ECDC4;
|
| 13 |
+
--accent-color: #45B7D1;
|
| 14 |
+
--success-color: #96CEB4;
|
| 15 |
+
--warning-color: #FFEAA7;
|
| 16 |
+
--error-color: #D63031;
|
| 17 |
+
--background-color: #0E1117;
|
| 18 |
+
--surface-color: #1F2937;
|
| 19 |
+
--text-primary: #FFFFFF;
|
| 20 |
+
--text-secondary: #94A3B8;
|
| 21 |
+
--border-color: #374151;
|
| 22 |
+
--sidebar-width: 21rem;
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
* {
|
| 26 |
+
margin: 0;
|
| 27 |
+
padding: 0;
|
| 28 |
+
box-sizing: border-box;
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
body {
|
| 32 |
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
| 33 |
+
background-color: var(--background-color);
|
| 34 |
+
color: var(--text-primary);
|
| 35 |
+
line-height: 1.6;
|
| 36 |
+
}
|
| 37 |
+
|
| 38 |
+
/* Streamlit-style sidebar */
|
| 39 |
+
.sidebar {
|
| 40 |
+
position: fixed;
|
| 41 |
+
left: 0;
|
| 42 |
+
top: 0;
|
| 43 |
+
width: var(--sidebar-width);
|
| 44 |
+
height: 100vh;
|
| 45 |
+
background-color: var(--surface-color);
|
| 46 |
+
border-right: 1px solid var(--border-color);
|
| 47 |
+
padding: 1.5rem;
|
| 48 |
+
overflow-y: auto;
|
| 49 |
+
z-index: 1000;
|
| 50 |
+
transition: transform 0.3s ease;
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
.sidebar.hidden {
|
| 54 |
+
transform: translateX(-100%);
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
.sidebar-header {
|
| 58 |
+
display: flex;
|
| 59 |
+
align-items: center;
|
| 60 |
+
gap: 0.75rem;
|
| 61 |
+
margin-bottom: 2rem;
|
| 62 |
+
padding-bottom: 1rem;
|
| 63 |
+
border-bottom: 1px solid var(--border-color);
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
.sidebar-logo {
|
| 67 |
+
width: 2.5rem;
|
| 68 |
+
height: 2.5rem;
|
| 69 |
+
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
|
| 70 |
+
border-radius: 0.5rem;
|
| 71 |
+
display: flex;
|
| 72 |
+
align-items: center;
|
| 73 |
+
justify-content: center;
|
| 74 |
+
color: white;
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
.sidebar-title {
|
| 78 |
+
font-size: 1.5rem;
|
| 79 |
+
font-weight: 700;
|
| 80 |
+
color: var(--text-primary);
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
.sidebar-subtitle {
|
| 84 |
+
font-size: 0.875rem;
|
| 85 |
+
color: var(--text-secondary);
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
/* Main content area */
|
| 89 |
+
.main-content {
|
| 90 |
+
margin-left: var(--sidebar-width);
|
| 91 |
+
padding: 2rem;
|
| 92 |
+
transition: margin-left 0.3s ease;
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
.main-content.full-width {
|
| 96 |
+
margin-left: 0;
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
/* Streamlit-style components */
|
| 100 |
+
.st-container {
|
| 101 |
+
max-width: 1200px;
|
| 102 |
+
margin: 0 auto;
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
.st-header {
|
| 106 |
+
text-align: center;
|
| 107 |
+
margin-bottom: 3rem;
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
.st-title {
|
| 111 |
+
font-size: 3rem;
|
| 112 |
+
font-weight: 800;
|
| 113 |
+
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
|
| 114 |
+
-webkit-background-clip: text;
|
| 115 |
+
-webkit-text-fill-color: transparent;
|
| 116 |
+
background-clip: text;
|
| 117 |
+
margin-bottom: 1rem;
|
| 118 |
+
}
|
| 119 |
+
|
| 120 |
+
.st-subtitle {
|
| 121 |
+
font-size: 1.25rem;
|
| 122 |
+
color: var(--text-secondary);
|
| 123 |
+
margin-bottom: 2rem;
|
| 124 |
+
}
|
| 125 |
+
|
| 126 |
+
/* Streamlit metrics */
|
| 127 |
+
.st-metrics {
|
| 128 |
+
display: grid;
|
| 129 |
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
| 130 |
+
gap: 1.5rem;
|
| 131 |
+
margin-bottom: 3rem;
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
.st-metric {
|
| 135 |
+
background: var(--surface-color);
|
| 136 |
+
border: 1px solid var(--border-color);
|
| 137 |
+
border-radius: 0.75rem;
|
| 138 |
+
padding: 1.5rem;
|
| 139 |
+
text-align: center;
|
| 140 |
+
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
+
.st-metric:hover {
|
| 144 |
+
transform: translateY(-2px);
|
| 145 |
+
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
|
| 146 |
+
}
|
| 147 |
+
|
| 148 |
+
.st-metric-value {
|
| 149 |
+
font-size: 2.5rem;
|
| 150 |
+
font-weight: 700;
|
| 151 |
+
margin-bottom: 0.5rem;
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
.st-metric-label {
|
| 155 |
+
font-size: 0.875rem;
|
| 156 |
+
color: var(--text-secondary);
|
| 157 |
+
text-transform: uppercase;
|
| 158 |
+
letter-spacing: 0.05em;
|
| 159 |
+
}
|
| 160 |
+
|
| 161 |
+
/* Streamlit columns */
|
| 162 |
+
.st-columns {
|
| 163 |
+
display: grid;
|
| 164 |
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
| 165 |
+
gap: 2rem;
|
| 166 |
+
margin-bottom: 3rem;
|
| 167 |
+
}
|
| 168 |
+
|
| 169 |
+
.st-column {
|
| 170 |
+
background: var(--surface-color);
|
| 171 |
+
border: 1px solid var(--border-color);
|
| 172 |
+
border-radius: 0.75rem;
|
| 173 |
+
padding: 2rem;
|
| 174 |
+
}
|
| 175 |
+
|
| 176 |
+
/* Streamlit form elements */
|
| 177 |
+
.st-selectbox, .st-radio-group, .st-slider {
|
| 178 |
+
margin-bottom: 1.5rem;
|
| 179 |
+
}
|
| 180 |
+
|
| 181 |
+
.st-label {
|
| 182 |
+
display: block;
|
| 183 |
+
font-size: 0.875rem;
|
| 184 |
+
font-weight: 600;
|
| 185 |
+
color: var(--text-primary);
|
| 186 |
+
margin-bottom: 0.5rem;
|
| 187 |
+
}
|
| 188 |
+
|
| 189 |
+
.st-select {
|
| 190 |
+
width: 100%;
|
| 191 |
+
padding: 0.75rem;
|
| 192 |
+
background: var(--background-color);
|
| 193 |
+
border: 1px solid var(--border-color);
|
| 194 |
+
border-radius: 0.5rem;
|
| 195 |
+
color: var(--text-primary);
|
| 196 |
+
font-size: 1rem;
|
| 197 |
+
transition: border-color 0.2s ease;
|
| 198 |
+
}
|
| 199 |
+
|
| 200 |
+
.st-select:focus {
|
| 201 |
+
outline: none;
|
| 202 |
+
border-color: var(--primary-color);
|
| 203 |
+
}
|
| 204 |
+
|
| 205 |
+
.st-radio-options {
|
| 206 |
+
display: flex;
|
| 207 |
+
flex-direction: column;
|
| 208 |
+
gap: 0.75rem;
|
| 209 |
+
}
|
| 210 |
+
|
| 211 |
+
.st-radio-option {
|
| 212 |
+
display: flex;
|
| 213 |
+
align-items: center;
|
| 214 |
+
gap: 0.5rem;
|
| 215 |
+
padding: 0.75rem;
|
| 216 |
+
background: var(--background-color);
|
| 217 |
+
border: 1px solid var(--border-color);
|
| 218 |
+
border-radius: 0.5rem;
|
| 219 |
+
cursor: pointer;
|
| 220 |
+
transition: all 0.2s ease;
|
| 221 |
+
}
|
| 222 |
+
|
| 223 |
+
.st-radio-option:hover {
|
| 224 |
+
border-color: var(--primary-color);
|
| 225 |
+
background: rgba(255, 107, 107, 0.1);
|
| 226 |
+
}
|
| 227 |
+
|
| 228 |
+
.st-radio-option.selected {
|
| 229 |
+
border-color: var(--primary-color);
|
| 230 |
+
background: rgba(255, 107, 107, 0.2);
|
| 231 |
+
}
|
| 232 |
+
|
| 233 |
+
.st-radio-input {
|
| 234 |
+
width: 1rem;
|
| 235 |
+
height: 1rem;
|
| 236 |
+
margin-right: 0.5rem;
|
| 237 |
+
}
|
| 238 |
+
|
| 239 |
+
/* Streamlit buttons */
|
| 240 |
+
.st-button {
|
| 241 |
+
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
|
| 242 |
+
color: white;
|
| 243 |
+
border: none;
|
| 244 |
+
border-radius: 0.5rem;
|
| 245 |
+
padding: 0.75rem 1.5rem;
|
| 246 |
+
font-size: 1rem;
|
| 247 |
+
font-weight: 600;
|
| 248 |
+
cursor: pointer;
|
| 249 |
+
transition: all 0.2s ease;
|
| 250 |
+
display: inline-flex;
|
| 251 |
+
align-items: center;
|
| 252 |
+
gap: 0.5rem;
|
| 253 |
+
}
|
| 254 |
+
|
| 255 |
+
.st-button:hover {
|
| 256 |
+
transform: translateY(-1px);
|
| 257 |
+
box-shadow: 0 4px 12px rgba(255, 107, 107, 0.4);
|
| 258 |
+
}
|
| 259 |
+
|
| 260 |
+
.st-button:disabled {
|
| 261 |
+
opacity: 0.5;
|
| 262 |
+
cursor: not-allowed;
|
| 263 |
+
transform: none;
|
| 264 |
+
}
|
| 265 |
+
|
| 266 |
+
.st-button-secondary {
|
| 267 |
+
background: var(--surface-color);
|
| 268 |
+
color: var(--text-primary);
|
| 269 |
+
border: 1px solid var(--border-color);
|
| 270 |
+
}
|
| 271 |
+
|
| 272 |
+
.st-button-secondary:hover {
|
| 273 |
+
background: var(--border-color);
|
| 274 |
+
box-shadow: 0 4px 12px rgba(255, 255, 255, 0.1);
|
| 275 |
+
}
|
| 276 |
+
|
| 277 |
+
/* Streamlit progress bar */
|
| 278 |
+
.st-progress {
|
| 279 |
+
width: 100%;
|
| 280 |
+
height: 0.5rem;
|
| 281 |
+
background: var(--border-color);
|
| 282 |
+
border-radius: 0.25rem;
|
| 283 |
+
overflow: hidden;
|
| 284 |
+
margin-bottom: 1rem;
|
| 285 |
+
}
|
| 286 |
+
|
| 287 |
+
.st-progress-bar {
|
| 288 |
+
height: 100%;
|
| 289 |
+
background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
|
| 290 |
+
transition: width 0.3s ease;
|
| 291 |
+
border-radius: 0.25rem;
|
| 292 |
+
}
|
| 293 |
+
|
| 294 |
+
/* Quiz interface */
|
| 295 |
+
.quiz-container {
|
| 296 |
+
display: none;
|
| 297 |
+
background: var(--surface-color);
|
| 298 |
+
border: 1px solid var(--border-color);
|
| 299 |
+
border-radius: 0.75rem;
|
| 300 |
+
padding: 2rem;
|
| 301 |
+
margin-bottom: 2rem;
|
| 302 |
+
}
|
| 303 |
+
|
| 304 |
+
.quiz-container.active {
|
| 305 |
+
display: block;
|
| 306 |
+
}
|
| 307 |
+
|
| 308 |
+
.quiz-header {
|
| 309 |
+
display: flex;
|
| 310 |
+
justify-content: space-between;
|
| 311 |
+
align-items: center;
|
| 312 |
+
margin-bottom: 2rem;
|
| 313 |
+
padding-bottom: 1rem;
|
| 314 |
+
border-bottom: 1px solid var(--border-color);
|
| 315 |
+
}
|
| 316 |
+
|
| 317 |
+
.quiz-timer {
|
| 318 |
+
display: flex;
|
| 319 |
+
align-items: center;
|
| 320 |
+
gap: 0.5rem;
|
| 321 |
+
font-size: 1.25rem;
|
| 322 |
+
font-weight: 700;
|
| 323 |
+
color: var(--accent-color);
|
| 324 |
+
}
|
| 325 |
+
|
| 326 |
+
.quiz-question {
|
| 327 |
+
font-size: 1.5rem;
|
| 328 |
+
font-weight: 600;
|
| 329 |
+
margin-bottom: 2rem;
|
| 330 |
+
line-height: 1.4;
|
| 331 |
+
}
|
| 332 |
+
|
| 333 |
+
.quiz-options {
|
| 334 |
+
display: grid;
|
| 335 |
+
gap: 1rem;
|
| 336 |
+
margin-bottom: 2rem;
|
| 337 |
+
}
|
| 338 |
+
|
| 339 |
+
.quiz-option {
|
| 340 |
+
display: flex;
|
| 341 |
+
align-items: center;
|
| 342 |
+
gap: 1rem;
|
| 343 |
+
padding: 1rem;
|
| 344 |
+
background: var(--background-color);
|
| 345 |
+
border: 1px solid var(--border-color);
|
| 346 |
+
border-radius: 0.5rem;
|
| 347 |
+
cursor: pointer;
|
| 348 |
+
transition: all 0.2s ease;
|
| 349 |
+
}
|
| 350 |
+
|
| 351 |
+
.quiz-option:hover {
|
| 352 |
+
border-color: var(--primary-color);
|
| 353 |
+
background: rgba(255, 107, 107, 0.1);
|
| 354 |
+
}
|
| 355 |
+
|
| 356 |
+
.quiz-option.selected {
|
| 357 |
+
border-color: var(--primary-color);
|
| 358 |
+
background: rgba(255, 107, 107, 0.2);
|
| 359 |
+
}
|
| 360 |
+
|
| 361 |
+
.quiz-option.correct {
|
| 362 |
+
border-color: var(--success-color);
|
| 363 |
+
background: rgba(150, 206, 180, 0.2);
|
| 364 |
+
}
|
| 365 |
+
|
| 366 |
+
.quiz-option.incorrect {
|
| 367 |
+
border-color: var(--error-color);
|
| 368 |
+
background: rgba(214, 48, 49, 0.2);
|
| 369 |
+
}
|
| 370 |
+
|
| 371 |
+
.option-letter {
|
| 372 |
+
display: flex;
|
| 373 |
+
align-items: center;
|
| 374 |
+
justify-content: center;
|
| 375 |
+
width: 2rem;
|
| 376 |
+
height: 2rem;
|
| 377 |
+
background: var(--primary-color);
|
| 378 |
+
color: white;
|
| 379 |
+
border-radius: 50%;
|
| 380 |
+
font-weight: 700;
|
| 381 |
+
flex-shrink: 0;
|
| 382 |
+
}
|
| 383 |
+
|
| 384 |
+
/* Results display */
|
| 385 |
+
.results-container {
|
| 386 |
+
display: none;
|
| 387 |
+
text-align: center;
|
| 388 |
+
}
|
| 389 |
+
|
| 390 |
+
.results-container.active {
|
| 391 |
+
display: block;
|
| 392 |
+
}
|
| 393 |
+
|
| 394 |
+
.results-score {
|
| 395 |
+
font-size: 4rem;
|
| 396 |
+
font-weight: 800;
|
| 397 |
+
color: var(--primary-color);
|
| 398 |
+
margin-bottom: 1rem;
|
| 399 |
+
}
|
| 400 |
+
|
| 401 |
+
.results-message {
|
| 402 |
+
font-size: 1.25rem;
|
| 403 |
+
color: var(--text-secondary);
|
| 404 |
+
margin-bottom: 2rem;
|
| 405 |
+
}
|
| 406 |
+
|
| 407 |
+
/* Expandable sections */
|
| 408 |
+
.st-expander {
|
| 409 |
+
border: 1px solid var(--border-color);
|
| 410 |
+
border-radius: 0.5rem;
|
| 411 |
+
margin-bottom: 1rem;
|
| 412 |
+
overflow: hidden;
|
| 413 |
+
}
|
| 414 |
+
|
| 415 |
+
.st-expander-header {
|
| 416 |
+
display: flex;
|
| 417 |
+
justify-content: space-between;
|
| 418 |
+
align-items: center;
|
| 419 |
+
padding: 1rem;
|
| 420 |
+
background: var(--surface-color);
|
| 421 |
+
cursor: pointer;
|
| 422 |
+
transition: background-color 0.2s ease;
|
| 423 |
+
}
|
| 424 |
+
|
| 425 |
+
.st-expander-header:hover {
|
| 426 |
+
background: var(--border-color);
|
| 427 |
+
}
|
| 428 |
+
|
| 429 |
+
.st-expander-content {
|
| 430 |
+
padding: 1rem;
|
| 431 |
+
background: var(--background-color);
|
| 432 |
+
border-top: 1px solid var(--border-color);
|
| 433 |
+
display: none;
|
| 434 |
+
}
|
| 435 |
+
|
| 436 |
+
.st-expander-content.expanded {
|
| 437 |
+
display: block;
|
| 438 |
+
}
|
| 439 |
+
|
| 440 |
+
.st-expander-arrow {
|
| 441 |
+
transition: transform 0.2s ease;
|
| 442 |
+
}
|
| 443 |
+
|
| 444 |
+
.st-expander-arrow.expanded {
|
| 445 |
+
transform: rotate(180deg);
|
| 446 |
+
}
|
| 447 |
+
|
| 448 |
+
/* Language switcher */
|
| 449 |
+
.language-switcher {
|
| 450 |
+
display: flex;
|
| 451 |
+
gap: 0.5rem;
|
| 452 |
+
margin-bottom: 1rem;
|
| 453 |
+
}
|
| 454 |
+
|
| 455 |
+
.language-option {
|
| 456 |
+
padding: 0.5rem 1rem;
|
| 457 |
+
background: var(--background-color);
|
| 458 |
+
border: 1px solid var(--border-color);
|
| 459 |
+
border-radius: 0.25rem;
|
| 460 |
+
cursor: pointer;
|
| 461 |
+
transition: all 0.2s ease;
|
| 462 |
+
}
|
| 463 |
+
|
| 464 |
+
.language-option:hover {
|
| 465 |
+
border-color: var(--primary-color);
|
| 466 |
+
}
|
| 467 |
+
|
| 468 |
+
.language-option.active {
|
| 469 |
+
background: var(--primary-color);
|
| 470 |
+
color: white;
|
| 471 |
+
border-color: var(--primary-color);
|
| 472 |
+
}
|
| 473 |
+
|
| 474 |
+
/* Theme toggle */
|
| 475 |
+
.theme-toggle {
|
| 476 |
+
display: flex;
|
| 477 |
+
align-items: center;
|
| 478 |
+
gap: 0.5rem;
|
| 479 |
+
margin-bottom: 1rem;
|
| 480 |
+
}
|
| 481 |
+
|
| 482 |
+
.toggle-switch {
|
| 483 |
+
position: relative;
|
| 484 |
+
width: 3rem;
|
| 485 |
+
height: 1.5rem;
|
| 486 |
+
background: var(--border-color);
|
| 487 |
+
border-radius: 0.75rem;
|
| 488 |
+
cursor: pointer;
|
| 489 |
+
transition: background-color 0.2s ease;
|
| 490 |
+
}
|
| 491 |
+
|
| 492 |
+
.toggle-switch.active {
|
| 493 |
+
background: var(--primary-color);
|
| 494 |
+
}
|
| 495 |
+
|
| 496 |
+
.toggle-slider {
|
| 497 |
+
position: absolute;
|
| 498 |
+
top: 0.125rem;
|
| 499 |
+
left: 0.125rem;
|
| 500 |
+
width: 1.25rem;
|
| 501 |
+
height: 1.25rem;
|
| 502 |
+
background: white;
|
| 503 |
+
border-radius: 50%;
|
| 504 |
+
transition: transform 0.2s ease;
|
| 505 |
+
}
|
| 506 |
+
|
| 507 |
+
.toggle-switch.active .toggle-slider {
|
| 508 |
+
transform: translateX(1.5rem);
|
| 509 |
+
}
|
| 510 |
+
|
| 511 |
+
/* Responsive design */
|
| 512 |
+
@media (max-width: 768px) {
|
| 513 |
+
.sidebar {
|
| 514 |
+
transform: translateX(-100%);
|
| 515 |
+
}
|
| 516 |
+
|
| 517 |
+
.main-content {
|
| 518 |
+
margin-left: 0;
|
| 519 |
+
}
|
| 520 |
+
|
| 521 |
+
.st-title {
|
| 522 |
+
font-size: 2rem;
|
| 523 |
+
}
|
| 524 |
+
|
| 525 |
+
.st-metrics {
|
| 526 |
+
grid-template-columns: 1fr;
|
| 527 |
+
}
|
| 528 |
+
|
| 529 |
+
.st-columns {
|
| 530 |
+
grid-template-columns: 1fr;
|
| 531 |
+
}
|
| 532 |
+
}
|
| 533 |
+
|
| 534 |
+
/* Animations */
|
| 535 |
+
@keyframes fadeIn {
|
| 536 |
+
from { opacity: 0; transform: translateY(20px); }
|
| 537 |
+
to { opacity: 1; transform: translateY(0); }
|
| 538 |
+
}
|
| 539 |
+
|
| 540 |
+
.fade-in {
|
| 541 |
+
animation: fadeIn 0.5s ease;
|
| 542 |
+
}
|
| 543 |
+
|
| 544 |
+
/* Chart styles */
|
| 545 |
+
.chart-container {
|
| 546 |
+
background: var(--surface-color);
|
| 547 |
+
border: 1px solid var(--border-color);
|
| 548 |
+
border-radius: 0.75rem;
|
| 549 |
+
padding: 1.5rem;
|
| 550 |
+
margin-bottom: 2rem;
|
| 551 |
+
}
|
| 552 |
+
|
| 553 |
+
.chart-title {
|
| 554 |
+
font-size: 1.25rem;
|
| 555 |
+
font-weight: 600;
|
| 556 |
+
margin-bottom: 1rem;
|
| 557 |
+
color: var(--text-primary);
|
| 558 |
+
}
|
| 559 |
+
|
| 560 |
+
/* Success/Error messages */
|
| 561 |
+
.st-success, .st-error, .st-warning, .st-info {
|
| 562 |
+
padding: 1rem;
|
| 563 |
+
border-radius: 0.5rem;
|
| 564 |
+
margin-bottom: 1rem;
|
| 565 |
+
display: flex;
|
| 566 |
+
align-items: center;
|
| 567 |
+
gap: 0.5rem;
|
| 568 |
+
}
|
| 569 |
+
|
| 570 |
+
.st-success {
|
| 571 |
+
background: rgba(150, 206, 180, 0.2);
|
| 572 |
+
border: 1px solid var(--success-color);
|
| 573 |
+
color: var(--success-color);
|
| 574 |
+
}
|
| 575 |
+
|
| 576 |
+
.st-error {
|
| 577 |
+
background: rgba(214, 48, 49, 0.2);
|
| 578 |
+
border: 1px solid var(--error-color);
|
| 579 |
+
color: var(--error-color);
|
| 580 |
+
}
|
| 581 |
+
|
| 582 |
+
.st-warning {
|
| 583 |
+
background: rgba(255, 234, 167, 0.2);
|
| 584 |
+
border: 1px solid var(--warning-color);
|
| 585 |
+
color: var(--warning-color);
|
| 586 |
+
}
|
| 587 |
+
|
| 588 |
+
.st-info {
|
| 589 |
+
background: rgba(69, 183, 209, 0.2);
|
| 590 |
+
border: 1px solid var(--accent-color);
|
| 591 |
+
color: var(--accent-color);
|
| 592 |
+
}
|
| 593 |
+
</style>
|
| 594 |
+
</head>
|
| 595 |
+
<body>
|
| 596 |
+
<!-- Streamlit-style sidebar -->
|
| 597 |
+
<div class="sidebar" id="sidebar">
|
| 598 |
+
<div class="sidebar-header">
|
| 599 |
+
<div class="sidebar-logo">
|
| 600 |
+
<i class="fas fa-brain"></i>
|
| 601 |
+
</div>
|
| 602 |
+
<div>
|
| 603 |
+
<div class="sidebar-title">TriviaVerse</div>
|
| 604 |
+
<div class="sidebar-subtitle">Quiz Platform</div>
|
| 605 |
+
</div>
|
| 606 |
+
</div>
|
| 607 |
+
|
| 608 |
+
<!-- Theme toggle -->
|
| 609 |
+
<div class="theme-toggle">
|
| 610 |
+
<span class="st-label">Dark Theme</span>
|
| 611 |
+
<div class="toggle-switch active" id="themeToggle">
|
| 612 |
+
<div class="toggle-slider"></div>
|
| 613 |
+
</div>
|
| 614 |
+
</div>
|
| 615 |
+
|
| 616 |
+
<!-- Language switcher -->
|
| 617 |
+
<div class="st-label">Language</div>
|
| 618 |
+
<div class="language-switcher">
|
| 619 |
+
<div class="language-option active" data-lang="en">EN</div>
|
| 620 |
+
<div class="language-option" data-lang="te">తె</div>
|
| 621 |
+
<div class="language-option" data-lang="hi">हि</div>
|
| 622 |
+
<div class="language-option" data-lang="kn">ಕನ್</div>
|
| 623 |
+
</div>
|
| 624 |
+
|
| 625 |
+
<!-- Quiz History -->
|
| 626 |
+
<div class="st-expander">
|
| 627 |
+
<div class="st-expander-header">
|
| 628 |
+
<span><i class="fas fa-history"></i> Quiz History</span>
|
| 629 |
+
<i class="fas fa-chevron-down st-expander-arrow"></i>
|
| 630 |
+
</div>
|
| 631 |
+
<div class="st-expander-content">
|
| 632 |
+
<div class="st-info">
|
| 633 |
+
<i class="fas fa-info-circle"></i>
|
| 634 |
+
<span>No quiz history available yet.</span>
|
| 635 |
+
</div>
|
| 636 |
+
</div>
|
| 637 |
+
</div>
|
| 638 |
+
|
| 639 |
+
<!-- Settings -->
|
| 640 |
+
<div class="st-expander">
|
| 641 |
+
<div class="st-expander-header">
|
| 642 |
+
<span><i class="fas fa-cog"></i> Settings</span>
|
| 643 |
+
<i class="fas fa-chevron-down st-expander-arrow"></i>
|
| 644 |
+
</div>
|
| 645 |
+
<div class="st-expander-content">
|
| 646 |
+
<div class="st-selectbox">
|
| 647 |
+
<label class="st-label">Sound Effects</label>
|
| 648 |
+
<select class="st-select">
|
| 649 |
+
<option value="on">On</option>
|
| 650 |
+
<option value="off">Off</option>
|
| 651 |
+
</select>
|
| 652 |
+
</div>
|
| 653 |
+
<div class="st-selectbox">
|
| 654 |
+
<label class="st-label">Difficulty Level</label>
|
| 655 |
+
<select class="st-select" id="difficultySelect">
|
| 656 |
+
<option value="easy">Easy</option>
|
| 657 |
+
<option value="medium">Medium</option>
|
| 658 |
+
<option value="hard">Hard</option>
|
| 659 |
+
</select>
|
| 660 |
+
</div>
|
| 661 |
+
</div>
|
| 662 |
+
</div>
|
| 663 |
+
</div>
|
| 664 |
+
|
| 665 |
+
<!-- Main content area -->
|
| 666 |
+
<div class="main-content" id="mainContent">
|
| 667 |
+
<div class="st-container">
|
| 668 |
+
<!-- Welcome section -->
|
| 669 |
+
<div class="st-header">
|
| 670 |
+
<h1 class="st-title">TriviaVerse</h1>
|
| 671 |
+
<p class="st-subtitle">Welcome to the ultimate quiz experience on Hugging Face Spaces!</p>
|
| 672 |
+
</div>
|
| 673 |
+
|
| 674 |
+
<!-- User statistics -->
|
| 675 |
+
<div class="st-metrics">
|
| 676 |
+
<div class="st-metric">
|
| 677 |
+
<div class="st-metric-value" style="color: var(--primary-color);" id="totalQuizzes">0</div>
|
| 678 |
+
<div class="st-metric-label">Total Quizzes</div>
|
| 679 |
+
</div>
|
| 680 |
+
<div class="st-metric">
|
| 681 |
+
<div class="st-metric-value" style="color: var(--success-color);" id="averageScore">0%</div>
|
| 682 |
+
<div class="st-metric-label">Average Score</div>
|
| 683 |
+
</div>
|
| 684 |
+
<div class="st-metric">
|
| 685 |
+
<div class="st-metric-value" style="color: var(--accent-color);" id="bestStreak">0</div>
|
| 686 |
+
<div class="st-metric-label">Best Streak</div>
|
| 687 |
+
</div>
|
| 688 |
+
<div class="st-metric">
|
| 689 |
+
<div class="st-metric-value" style="color: var(--secondary-color);" id="favoriteTopicDisplay">None</div>
|
| 690 |
+
<div class="st-metric-label">Favorite Topic</div>
|
| 691 |
+
</div>
|
| 692 |
+
</div>
|
| 693 |
+
|
| 694 |
+
<!-- Quiz configuration -->
|
| 695 |
+
<div class="st-columns">
|
| 696 |
+
<div class="st-column">
|
| 697 |
+
<h3 style="margin-bottom: 1.5rem; color: var(--text-primary);">
|
| 698 |
+
<i class="fas fa-play-circle"></i> Start New Quiz
|
| 699 |
+
</h3>
|
| 700 |
+
|
| 701 |
+
<div class="st-selectbox">
|
| 702 |
+
<label class="st-label">Select Topic</label>
|
| 703 |
+
<select class="st-select" id="topicSelect">
|
| 704 |
+
<option value="">Choose a topic...</option>
|
| 705 |
+
<option value="python">🐍 Python Programming</option>
|
| 706 |
+
<option value="javascript">⚡ JavaScript</option>
|
| 707 |
+
<option value="science">🔬 General Science</option>
|
| 708 |
+
<option value="history">📚 World History</option>
|
| 709 |
+
<option value="geography">🌍 Geography</option>
|
| 710 |
+
<option value="literature">📖 Literature</option>
|
| 711 |
+
<option value="mathematics">🔢 Mathematics</option>
|
| 712 |
+
<option value="technology">💻 Technology</option>
|
| 713 |
+
</select>
|
| 714 |
+
</div>
|
| 715 |
+
|
| 716 |
+
<div class="st-radio-group">
|
| 717 |
+
<label class="st-label">Number of Questions</label>
|
| 718 |
+
<div class="st-radio-options">
|
| 719 |
+
<div class="st-radio-option selected" data-questions="5">
|
| 720 |
+
<input type="radio" class="st-radio-input" name="questions" value="5" checked>
|
| 721 |
+
<span>5 Questions (Quick)</span>
|
| 722 |
+
</div>
|
| 723 |
+
<div class="st-radio-option" data-questions="10">
|
| 724 |
+
<input type="radio" class="st-radio-input" name="questions" value="10">
|
| 725 |
+
<span>10 Questions (Standard)</span>
|
| 726 |
+
</div>
|
| 727 |
+
<div class="st-radio-option" data-questions="15">
|
| 728 |
+
<input type="radio" class="st-radio-input" name="questions" value="15">
|
| 729 |
+
<span>15 Questions (Extended)</span>
|
| 730 |
+
</div>
|
| 731 |
+
</div>
|
| 732 |
+
</div>
|
| 733 |
+
|
| 734 |
+
<button class="st-button" id="startQuizBtn" disabled>
|
| 735 |
+
<i class="fas fa-play"></i>
|
| 736 |
+
Start Quiz
|
| 737 |
+
</button>
|
| 738 |
+
</div>
|
| 739 |
+
|
| 740 |
+
<div class="st-column">
|
| 741 |
+
<h3 style="margin-bottom: 1.5rem; color: var(--text-primary);">
|
| 742 |
+
<i class="fas fa-fire"></i> Trending Topics
|
| 743 |
+
</h3>
|
| 744 |
+
|
| 745 |
+
<div class="quiz-option" data-topic="python" style="margin-bottom: 1rem;">
|
| 746 |
+
<div class="option-letter">🐍</div>
|
| 747 |
+
<div>
|
| 748 |
+
<div style="font-weight: 600;">Python Programming</div>
|
| 749 |
+
<div style="font-size: 0.875rem; color: var(--text-secondary);">Most Popular</div>
|
| 750 |
+
</div>
|
| 751 |
+
</div>
|
| 752 |
+
|
| 753 |
+
<div class="quiz-option" data-topic="science" style="margin-bottom: 1rem;">
|
| 754 |
+
<div class="option-letter">🔬</div>
|
| 755 |
+
<div>
|
| 756 |
+
<div style="font-weight: 600;">General Science</div>
|
| 757 |
+
<div style="font-size: 0.875rem; color: var(--text-secondary);">High Engagement</div>
|
| 758 |
+
</div>
|
| 759 |
+
</div>
|
| 760 |
+
|
| 761 |
+
<div class="quiz-option" data-topic="history" style="margin-bottom: 1rem;">
|
| 762 |
+
<div class="option-letter">📚</div>
|
| 763 |
+
<div>
|
| 764 |
+
<div style="font-weight: 600;">World History</div>
|
| 765 |
+
<div style="font-size: 0.875rem; color: var(--text-secondary);">Trending Now</div>
|
| 766 |
+
</div>
|
| 767 |
+
</div>
|
| 768 |
+
</div>
|
| 769 |
+
</div>
|
| 770 |
+
|
| 771 |
+
<!-- Active quiz interface -->
|
| 772 |
+
<div class="quiz-container" id="quizContainer">
|
| 773 |
+
<div class="quiz-header">
|
| 774 |
+
<div>
|
| 775 |
+
<h3 style="color: var(--text-primary);">Question <span id="currentQuestionNum">1</span> of <span id="totalQuestions">10</span></h3>
|
| 776 |
+
<div class="st-progress">
|
| 777 |
+
<div class="st-progress-bar" id="quizProgress" style="width: 10%;"></div>
|
| 778 |
+
</div>
|
| 779 |
+
</div>
|
| 780 |
+
<div class="quiz-timer">
|
| 781 |
+
<i class="fas fa-clock"></i>
|
| 782 |
+
<span id="timeRemaining">30</span>s
|
| 783 |
+
</div>
|
| 784 |
+
</div>
|
| 785 |
+
|
| 786 |
+
<div class="quiz-question" id="questionText">
|
| 787 |
+
Loading question...
|
| 788 |
+
</div>
|
| 789 |
+
|
| 790 |
+
<div class="quiz-options" id="quizOptions">
|
| 791 |
+
<!-- Options will be populated by JavaScript -->
|
| 792 |
+
</div>
|
| 793 |
+
|
| 794 |
+
<div style="display: flex; gap: 1rem; justify-content: center;">
|
| 795 |
+
<button class="st-button-secondary" id="hintBtn">
|
| 796 |
+
<i class="fas fa-lightbulb"></i>
|
| 797 |
+
Hint
|
| 798 |
+
</button>
|
| 799 |
+
<button class="st-button" id="nextQuestionBtn" disabled>
|
| 800 |
+
<i class="fas fa-arrow-right"></i>
|
| 801 |
+
Next Question
|
| 802 |
+
</button>
|
| 803 |
+
</div>
|
| 804 |
+
</div>
|
| 805 |
+
|
| 806 |
+
<!-- Results section -->
|
| 807 |
+
<div class="results-container" id="resultsContainer">
|
| 808 |
+
<div class="results-score" id="finalScore">0%</div>
|
| 809 |
+
<div class="results-message" id="resultsMessage">Great job!</div>
|
| 810 |
+
|
| 811 |
+
<div class="chart-container">
|
| 812 |
+
<div class="chart-title">Performance Overview</div>
|
| 813 |
+
<div class="st-metrics">
|
| 814 |
+
<div class="st-metric">
|
| 815 |
+
<div class="st-metric-value" style="color: var(--success-color);" id="correctAnswers">0</div>
|
| 816 |
+
<div class="st-metric-label">Correct Answers</div>
|
| 817 |
+
</div>
|
| 818 |
+
<div class="st-metric">
|
| 819 |
+
<div class="st-metric-value" style="color: var(--error-color);" id="incorrectAnswers">0</div>
|
| 820 |
+
<div class="st-metric-label">Incorrect Answers</div>
|
| 821 |
+
</div>
|
| 822 |
+
<div class="st-metric">
|
| 823 |
+
<div class="st-metric-value" style="color: var(--accent-color);" id="timeTaken">0</div>
|
| 824 |
+
<div class="st-metric-label">Time Taken (min)</div>
|
| 825 |
+
</div>
|
| 826 |
+
</div>
|
| 827 |
+
</div>
|
| 828 |
+
|
| 829 |
+
<div style="display: flex; gap: 1rem; justify-content: center;">
|
| 830 |
+
<button class="st-button-secondary" id="reviewAnswersBtn">
|
| 831 |
+
<i class="fas fa-eye"></i>
|
| 832 |
+
Review Answers
|
| 833 |
+
</button>
|
| 834 |
+
<button class="st-button" id="newQuizBtn">
|
| 835 |
+
<i class="fas fa-refresh"></i>
|
| 836 |
+
New Quiz
|
| 837 |
+
</button>
|
| 838 |
+
</div>
|
| 839 |
+
</div>
|
| 840 |
+
</div>
|
| 841 |
+
</div>
|
| 842 |
+
|
| 843 |
+
<script>
|
| 844 |
+
// Application state
|
| 845 |
+
let appState = {
|
| 846 |
+
currentView: 'home',
|
| 847 |
+
selectedTopic: '',
|
| 848 |
+
selectedQuestions: 5,
|
| 849 |
+
currentQuestionIndex: 0,
|
| 850 |
+
questions: [],
|
| 851 |
+
userAnswers: [],
|
| 852 |
+
score: 0,
|
| 853 |
+
timeRemaining: 30,
|
| 854 |
+
timerInterval: null,
|
| 855 |
+
language: 'en',
|
| 856 |
+
theme: 'dark',
|
| 857 |
+
userStats: {
|
| 858 |
+
totalQuizzes: 0,
|
| 859 |
+
averageScore: 0,
|
| 860 |
+
bestStreak: 0,
|
| 861 |
+
favoriteTopic: 'None'
|
| 862 |
+
}
|
| 863 |
+
};
|
| 864 |
+
|
| 865 |
+
// Language translations
|
| 866 |
+
const translations = {
|
| 867 |
+
en: {
|
| 868 |
+
welcome: "Welcome to TriviaVerse!",
|
| 869 |
+
selectTopic: "Select Topic",
|
| 870 |
+
startQuiz: "Start Quiz",
|
| 871 |
+
nextQuestion: "Next Question",
|
| 872 |
+
hint: "Hint",
|
| 873 |
+
timeRemaining: "Time Remaining",
|
| 874 |
+
correctAnswers: "Correct Answers",
|
| 875 |
+
incorrectAnswers: "Incorrect Answers",
|
| 876 |
+
timeTaken: "Time Taken (min)",
|
| 877 |
+
reviewAnswers: "Review Answers",
|
| 878 |
+
newQuiz: "New Quiz"
|
| 879 |
+
},
|
| 880 |
+
te: {
|
| 881 |
+
welcome: "ట్రివియావర్స్కు స్వాగతం!",
|
| 882 |
+
selectTopic: "విషయం ఎంచుకోండి",
|
| 883 |
+
startQuiz: "క్విజ్ ప్రారంభించండి",
|
| 884 |
+
nextQuestion: "తదుపరి ప్రశ్న",
|
| 885 |
+
hint: "సూచన",
|
| 886 |
+
timeRemaining: "మిగిలిన సమయం",
|
| 887 |
+
correctAnswers: "సరైన సమాధానాలు",
|
| 888 |
+
incorrectAnswers: "తప్పు సమాధానాలు",
|
| 889 |
+
timeTaken: "తీసుకున్న సమయం (నిమిషాలు)",
|
| 890 |
+
reviewAnswers: "సమాధానాలను సమీక్షించండి",
|
| 891 |
+
newQuiz: "కొత్త క���విజ్"
|
| 892 |
+
},
|
| 893 |
+
hi: {
|
| 894 |
+
welcome: "TriviaVerse में आपका स्वागत है!",
|
| 895 |
+
selectTopic: "विषय चुनें",
|
| 896 |
+
startQuiz: "क्विज़ शुरू करें",
|
| 897 |
+
nextQuestion: "अगला प्रश्न",
|
| 898 |
+
hint: "संकेत",
|
| 899 |
+
timeRemaining: "शेष समय",
|
| 900 |
+
correctAnswers: "सही उत्तर",
|
| 901 |
+
incorrectAnswers: "गलत उत्तर",
|
| 902 |
+
timeTaken: "लिया गया समय (मिनट)",
|
| 903 |
+
reviewAnswers: "उत्तरों की समीक्षा करें",
|
| 904 |
+
newQuiz: "नया क्विज़"
|
| 905 |
+
},
|
| 906 |
+
kn: {
|
| 907 |
+
welcome: "ಟ್ರಿವಿಯಾವರ್ಸ್ಗೆ ಸ್ವಾಗತ!",
|
| 908 |
+
selectTopic: "ವಿಷಯ ಆಯ್ಕೆಮಾಡಿ",
|
| 909 |
+
startQuiz: "ಕ್ವಿಜ್ ಪ್ರಾರಂಭಿಸಿ",
|
| 910 |
+
nextQuestion: "ಮುಂದಿನ ಪ್ರಶ್ನೆ",
|
| 911 |
+
hint: "ಸುಳಿವು",
|
| 912 |
+
timeRemaining: "ಉಳಿದಿರುವ ಸಮಯ",
|
| 913 |
+
correctAnswers: "ಸರಿಯಾದ ಉತ್ತರಗಳು",
|
| 914 |
+
incorrectAnswers: "ತಪ್ಪಾದ ಉತ್ತರಗಳು",
|
| 915 |
+
timeTaken: "ತೆಗೆದುಕೊಂಡ ಸಮಯ (ನಿಮಿಷಗಳು)",
|
| 916 |
+
reviewAnswers: "ಉತ್ತರಗಳನ್ನು ಪರಿಶೀಲಿಸಿ",
|
| 917 |
+
newQuiz: "ಹೊಸ ಕ್ವಿಜ್"
|
| 918 |
+
}
|
| 919 |
+
};
|
| 920 |
+
|
| 921 |
+
// Sample questions database
|
| 922 |
+
const questionsDB = {
|
| 923 |
+
python: [
|
| 924 |
+
{
|
| 925 |
+
question: "Which of the following is the correct way to create a list in Python?",
|
| 926 |
+
options: ["list = [1, 2, 3, 4]", "list = (1, 2, 3, 4)", "list = {1, 2, 3, 4}", "list = \"1, 2, 3, 4\""],
|
| 927 |
+
correct: 0,
|
| 928 |
+
hint: "Think about the syntax used for creating collections in Python."
|
| 929 |
+
},
|
| 930 |
+
{
|
| 931 |
+
question: "What is the output of print(type([]))?",
|
| 932 |
+
options: ["<class 'array'>", "<class 'list'>", "<class 'tuple'>", "<class 'dict'>"],
|
| 933 |
+
correct: 1,
|
| 934 |
+
hint: "Consider what type of object [] creates in Python."
|
| 935 |
+
},
|
| 936 |
+
{
|
| 937 |
+
question: "Which operator is used for exponentiation in Python?",
|
| 938 |
+
options: ["^", "**", "exp", "pow"],
|
| 939 |
+
correct: 1,
|
| 940 |
+
hint: "This operator uses two of the same symbols."
|
| 941 |
+
}
|
| 942 |
+
],
|
| 943 |
+
science: [
|
| 944 |
+
{
|
| 945 |
+
question: "What is the chemical symbol for gold?",
|
| 946 |
+
options: ["Go", "Gd", "Au", "Ag"],
|
| 947 |
+
correct: 2,
|
| 948 |
+
hint: "It comes from the Latin word 'aurum'."
|
| 949 |
+
},
|
| 950 |
+
{
|
| 951 |
+
question: "How many bones are in an adult human body?",
|
| 952 |
+
options: ["206", "196", "216", "186"],
|
| 953 |
+
correct: 0,
|
| 954 |
+
hint: "It's just over 200."
|
| 955 |
+
}
|
| 956 |
+
],
|
| 957 |
+
history: [
|
| 958 |
+
{
|
| 959 |
+
question: "In which year did World War II end?",
|
| 960 |
+
options: ["1944", "1945", "1946", "1947"],
|
| 961 |
+
correct: 1,
|
| 962 |
+
hint: "It ended in the mid-1940s."
|
| 963 |
+
},
|
| 964 |
+
{
|
| 965 |
+
question: "Who was the first President of the United States?",
|
| 966 |
+
options: ["Thomas Jefferson", "John Adams", "George Washington", "Benjamin Franklin"],
|
| 967 |
+
correct: 2,
|
| 968 |
+
hint: "He is known as the 'Father of His Country'."
|
| 969 |
+
}
|
| 970 |
+
]
|
| 971 |
+
};
|
| 972 |
+
|
| 973 |
+
// Initialize application
|
| 974 |
+
function initializeApp() {
|
| 975 |
+
loadUserStats();
|
| 976 |
+
setupEventListeners();
|
| 977 |
+
updateLanguage();
|
| 978 |
+
updateTheme();
|
| 979 |
+
}
|
| 980 |
+
|
| 981 |
+
// Load user statistics from localStorage
|
| 982 |
+
function loadUserStats() {
|
| 983 |
+
const saved = localStorage.getItem('triviaverse_stats');
|
| 984 |
+
if (saved) {
|
| 985 |
+
appState.userStats = JSON.parse(saved);
|
| 986 |
+
}
|
| 987 |
+
updateStatsDisplay();
|
| 988 |
+
}
|
| 989 |
+
|
| 990 |
+
// Save user statistics to localStorage
|
| 991 |
+
function saveUserStats() {
|
| 992 |
+
localStorage.setItem('triviaverse_stats', JSON.stringify(appState.userStats));
|
| 993 |
+
}
|
| 994 |
+
|
| 995 |
+
// Update statistics display
|
| 996 |
+
function updateStatsDisplay() {
|
| 997 |
+
document.getElementById('totalQuizzes').textContent = appState.userStats.totalQuizzes;
|
| 998 |
+
document.getElementById('averageScore').textContent = appState.userStats.averageScore + '%';
|
| 999 |
+
document.getElementById('bestStreak').textContent = appState.userStats.bestStreak;
|
| 1000 |
+
document.getElementById('favoriteTopicDisplay').textContent = appState.userStats.favoriteTopic;
|
| 1001 |
+
}
|
| 1002 |
+
|
| 1003 |
+
// Setup event listeners
|
| 1004 |
+
function setupEventListeners() {
|
| 1005 |
+
// Topic selection
|
| 1006 |
+
document.getElementById('topicSelect').addEventListener('change', (e) => {
|
| 1007 |
+
appState.selectedTopic = e.target.value;
|
| 1008 |
+
updateStartButton();
|
| 1009 |
+
});
|
| 1010 |
+
|
| 1011 |
+
// Question count selection
|
| 1012 |
+
document.querySelectorAll('.st-radio-option').forEach(option => {
|
| 1013 |
+
option.addEventListener('click', (e) => {
|
| 1014 |
+
document.querySelectorAll('.st-radio-option').forEach(opt => opt.classList.remove('selected'));
|
| 1015 |
+
e.currentTarget.classList.add('selected');
|
| 1016 |
+
appState.selectedQuestions = parseInt(e.currentTarget.dataset.questions);
|
| 1017 |
+
const radio = e.currentTarget.querySelector('input[type="radio"]');
|
| 1018 |
+
if (radio) radio.checked = true;
|
| 1019 |
+
});
|
| 1020 |
+
});
|
| 1021 |
+
|
| 1022 |
+
// Start quiz button
|
| 1023 |
+
document.getElementById('startQuizBtn').addEventListener('click', startQuiz);
|
| 1024 |
+
|
| 1025 |
+
// Next question button
|
| 1026 |
+
document.getElementById('nextQuestionBtn').addEventListener('click', nextQuestion);
|
| 1027 |
+
|
| 1028 |
+
// Hint button
|
| 1029 |
+
document.getElementById('hintBtn').addEventListener('click', showHint);
|
| 1030 |
+
|
| 1031 |
+
// New quiz button
|
| 1032 |
+
document.getElementById('newQuizBtn').addEventListener('click', resetToHome);
|
| 1033 |
+
|
| 1034 |
+
// Review answers button
|
| 1035 |
+
document.getElementById('reviewAnswersBtn').addEventListener('click', reviewAnswers);
|
| 1036 |
+
|
| 1037 |
+
// Theme toggle
|
| 1038 |
+
document.getElementById('themeToggle').addEventListener('click', toggleTheme);
|
| 1039 |
+
|
| 1040 |
+
// Language switcher
|
| 1041 |
+
document.querySelectorAll('.language-option').forEach(option => {
|
| 1042 |
+
option.addEventListener('click', (e) => {
|
| 1043 |
+
document.querySelectorAll('.language-option').forEach(opt => opt.classList.remove('active'));
|
| 1044 |
+
e.currentTarget.classList.add('active');
|
| 1045 |
+
appState.language = e.currentTarget.dataset.lang;
|
| 1046 |
+
updateLanguage();
|
| 1047 |
+
});
|
| 1048 |
+
});
|
| 1049 |
+
|
| 1050 |
+
// Trending topics
|
| 1051 |
+
document.querySelectorAll('[data-topic]').forEach(topic => {
|
| 1052 |
+
topic.addEventListener('click', (e) => {
|
| 1053 |
+
const topicValue = e.currentTarget.dataset.topic;
|
| 1054 |
+
document.getElementById('topicSelect').value = topicValue;
|
| 1055 |
+
appState.selectedTopic = topicValue;
|
| 1056 |
+
updateStartButton();
|
| 1057 |
+
});
|
| 1058 |
+
});
|
| 1059 |
+
|
| 1060 |
+
// Expandable sections
|
| 1061 |
+
document.querySelectorAll('.st-expander-header').forEach(header => {
|
| 1062 |
+
header.addEventListener('click', (e) => {
|
| 1063 |
+
const content = header.nextElementSibling;
|
| 1064 |
+
const arrow = header.querySelector('.st-expander-arrow');
|
| 1065 |
+
|
| 1066 |
+
content.classList.toggle('expanded');
|
| 1067 |
+
arrow.classList.toggle('expanded');
|
| 1068 |
+
});
|
| 1069 |
+
});
|
| 1070 |
+
}
|
| 1071 |
+
|
| 1072 |
+
// Update start button state
|
| 1073 |
+
function updateStartButton() {
|
| 1074 |
+
const startBtn = document.getElementById('startQuizBtn');
|
| 1075 |
+
if (appState.selectedTopic) {
|
| 1076 |
+
startBtn.disabled = false;
|
| 1077 |
+
startBtn.style.opacity = '1';
|
| 1078 |
+
} else {
|
| 1079 |
+
startBtn.disabled = true;
|
| 1080 |
+
startBtn.style.opacity = '0.5';
|
| 1081 |
+
}
|
| 1082 |
+
}
|
| 1083 |
+
|
| 1084 |
+
// Start quiz
|
| 1085 |
+
function startQuiz() {
|
| 1086 |
+
if (!appState.selectedTopic) {
|
| 1087 |
+
showMessage('Please select a topic first!', 'error');
|
| 1088 |
+
return;
|
| 1089 |
+
}
|
| 1090 |
+
|
| 1091 |
+
// Generate questions
|
| 1092 |
+
const availableQuestions = questionsDB[appState.selectedTopic] || [];
|
| 1093 |
+
if (availableQuestions.length === 0) {
|
| 1094 |
+
showMessage('No questions available for this topic yet!', 'error');
|
| 1095 |
+
return;
|
| 1096 |
+
}
|
| 1097 |
+
|
| 1098 |
+
// Select random questions
|
| 1099 |
+
appState.questions = [];
|
| 1100 |
+
for (let i = 0; i < Math.min(appState.selectedQuestions, availableQuestions.length); i++) {
|
| 1101 |
+
const randomIndex = Math.floor(Math.random() * availableQuestions.length);
|
| 1102 |
+
appState.questions.push(availableQuestions[randomIndex]);
|
| 1103 |
+
}
|
| 1104 |
+
|
| 1105 |
+
// Reset quiz state
|
| 1106 |
+
appState.currentQuestionIndex = 0;
|
| 1107 |
+
appState.userAnswers = [];
|
| 1108 |
+
appState.score = 0;
|
| 1109 |
+
appState.timeRemaining = 30;
|
| 1110 |
+
|
| 1111 |
+
// Show quiz interface
|
| 1112 |
+
showQuizInterface();
|
| 1113 |
+
loadCurrentQuestion();
|
| 1114 |
+
startTimer();
|
| 1115 |
+
}
|
| 1116 |
+
|
| 1117 |
+
// Show quiz interface
|
| 1118 |
+
function showQuizInterface() {
|
| 1119 |
+
document.getElementById('quizContainer').classList.add('active');
|
| 1120 |
+
document.querySelector('.st-header').style.display = 'none';
|
| 1121 |
+
document.querySelector('.st-metrics').style.display = 'none';
|
| 1122 |
+
document.querySelector('.st-columns').style.display = 'none';
|
| 1123 |
+
document.getElementById('resultsContainer').classList.remove('active');
|
| 1124 |
+
}
|
| 1125 |
+
|
| 1126 |
+
// Load current question
|
| 1127 |
+
function loadCurrentQuestion() {
|
| 1128 |
+
const question = appState.questions[appState.currentQuestionIndex];
|
| 1129 |
+
if (!question) return;
|
| 1130 |
+
|
| 1131 |
+
// Update question number and progress
|
| 1132 |
+
document.getElementById('currentQuestionNum').textContent = appState.currentQuestionIndex + 1;
|
| 1133 |
+
document.getElementById('totalQuestions').textContent = appState.questions.length;
|
| 1134 |
+
|
| 1135 |
+
const progress = ((appState.currentQuestionIndex + 1) / appState.questions.length) * 100;
|
| 1136 |
+
document.getElementById('quizProgress').style.width = progress + '%';
|
| 1137 |
+
|
| 1138 |
+
// Update question text
|
| 1139 |
+
document.getElementById('questionText').textContent = question.question;
|
| 1140 |
+
|
| 1141 |
+
// Update options
|
| 1142 |
+
const optionsContainer = document.getElementById('quizOptions');
|
| 1143 |
+
optionsContainer.innerHTML = '';
|
| 1144 |
+
|
| 1145 |
+
question.options.forEach((option, index) => {
|
| 1146 |
+
const optionElement = document.createElement('div');
|
| 1147 |
+
optionElement.className = 'quiz-option';
|
| 1148 |
+
optionElement.dataset.answer = index;
|
| 1149 |
+
optionElement.innerHTML = `
|
| 1150 |
+
<div class="option-letter">${String.fromCharCode(65 + index)}</div>
|
| 1151 |
+
<span>${option}</span>
|
| 1152 |
+
`;
|
| 1153 |
+
optionElement.addEventListener('click', selectAnswer);
|
| 1154 |
+
optionsContainer.appendChild(optionElement);
|
| 1155 |
+
});
|
| 1156 |
+
|
| 1157 |
+
// Reset timer
|
| 1158 |
+
appState.timeRemaining = 30;
|
| 1159 |
+
document.getElementById('nextQuestionBtn').disabled = true;
|
| 1160 |
+
document.getElementById('nextQuestionBtn').style.opacity = '0.5';
|
| 1161 |
+
}
|
| 1162 |
+
|
| 1163 |
+
// Select answer
|
| 1164 |
+
function selectAnswer(e) {
|
| 1165 |
+
const selectedOption = e.currentTarget;
|
| 1166 |
+
const answerIndex = parseInt(selectedOption.dataset.answer);
|
| 1167 |
+
|
| 1168 |
+
// Remove previous selections
|
| 1169 |
+
document.querySelectorAll('.quiz-option').forEach(opt => {
|
| 1170 |
+
opt.classList.remove('selected');
|
| 1171 |
+
});
|
| 1172 |
+
|
| 1173 |
+
// Add selection
|
| 1174 |
+
selectedOption.classList.add('selected');
|
| 1175 |
+
|
| 1176 |
+
// Store answer
|
| 1177 |
+
appState.userAnswers[appState.currentQuestionIndex] = answerIndex;
|
| 1178 |
+
|
| 1179 |
+
// Enable next button
|
| 1180 |
+
document.getElementById('nextQuestionBtn').disabled = false;
|
| 1181 |
+
document.getElementById('nextQuestionBtn').style.opacity = '1';
|
| 1182 |
+
|
| 1183 |
+
// Stop timer
|
| 1184 |
+
clearInterval(appState.timerInterval);
|
| 1185 |
+
|
| 1186 |
+
// Check answer
|
| 1187 |
+
setTimeout(() => checkAnswer(), 500);
|
| 1188 |
+
}
|
| 1189 |
+
|
| 1190 |
+
// Check answer
|
| 1191 |
+
function checkAnswer() {
|
| 1192 |
+
const question = appState.questions[appState.currentQuestionIndex];
|
| 1193 |
+
const userAnswer = appState.userAnswers[appState.currentQuestionIndex];
|
| 1194 |
+
const isCorrect = userAnswer === question.correct;
|
| 1195 |
+
|
| 1196 |
+
// Update score
|
| 1197 |
+
if (isCorrect) {
|
| 1198 |
+
appState.score++;
|
| 1199 |
+
}
|
| 1200 |
+
|
| 1201 |
+
// Show correct/incorrect styling
|
| 1202 |
+
document.querySelectorAll('.quiz-option').forEach((opt, index) => {
|
| 1203 |
+
if (index === question.correct) {
|
| 1204 |
+
opt.classList.add('correct');
|
| 1205 |
+
} else if (index === userAnswer && !isCorrect) {
|
| 1206 |
+
opt.classList.add('incorrect');
|
| 1207 |
+
}
|
| 1208 |
+
});
|
| 1209 |
+
|
| 1210 |
+
// Show feedback message
|
| 1211 |
+
const message = isCorrect ? 'Correct!' : 'Incorrect!';
|
| 1212 |
+
const messageType = isCorrect ? 'success' : 'error';
|
| 1213 |
+
showMessage(message, messageType);
|
| 1214 |
+
}
|
| 1215 |
+
|
| 1216 |
+
// Next question
|
| 1217 |
+
function nextQuestion() {
|
| 1218 |
+
if (appState.currentQuestionIndex < appState.questions.length - 1) {
|
| 1219 |
+
appState.currentQuestionIndex++;
|
| 1220 |
+
loadCurrentQuestion();
|
| 1221 |
+
startTimer();
|
| 1222 |
+
} else {
|
| 1223 |
+
finishQuiz();
|
| 1224 |
+
}
|
| 1225 |
+
}
|
| 1226 |
+
|
| 1227 |
+
// Finish quiz
|
| 1228 |
+
function finishQuiz() {
|
| 1229 |
+
clearInterval(appState.timerInterval);
|
| 1230 |
+
|
| 1231 |
+
// Calculate results
|
| 1232 |
+
const percentage = Math.round((appState.score / appState.questions.length) * 100);
|
| 1233 |
+
const correctAnswers = appState.score;
|
| 1234 |
+
const incorrectAnswers = appState.questions.length - appState.score;
|
| 1235 |
+
|
| 1236 |
+
// Update user stats
|
| 1237 |
+
appState.userStats.totalQuizzes++;
|
| 1238 |
+
appState.userStats.averageScore = Math.round(
|
| 1239 |
+
(appState.userStats.averageScore * (appState.userStats.totalQuizzes - 1) + percentage) / appState.userStats.totalQuizzes
|
| 1240 |
+
);
|
| 1241 |
+
if (appState.score > appState.userStats.bestStreak) {
|
| 1242 |
+
appState.userStats.bestStreak = appState.score;
|
| 1243 |
+
}
|
| 1244 |
+
appState.userStats.favoriteTopic = appState.selectedTopic;
|
| 1245 |
+
|
| 1246 |
+
saveUserStats();
|
| 1247 |
+
updateStatsDisplay();
|
| 1248 |
+
|
| 1249 |
+
// Show results
|
| 1250 |
+
showResults(percentage, correctAnswers, incorrectAnswers);
|
| 1251 |
+
}
|
| 1252 |
+
|
| 1253 |
+
// Show results
|
| 1254 |
+
function showResults(percentage, correctAnswers, incorrectAnswers) {
|
| 1255 |
+
document.getElementById('quizContainer').classList.remove('active');
|
| 1256 |
+
document.getElementById('resultsContainer').classList.add('active');
|
| 1257 |
+
|
| 1258 |
+
// Update results display
|
| 1259 |
+
document.getElementById('finalScore').textContent = percentage + '%';
|
| 1260 |
+
document.getElementById('correctAnswers').textContent = correctAnswers;
|
| 1261 |
+
document.getElementById('incorrectAnswers').textContent = incorrectAnswers;
|
| 1262 |
+
document.getElementById('timeTaken').textContent = Math.round((appState.questions.length * 30 - appState.timeRemaining) / 60);
|
| 1263 |
+
|
| 1264 |
+
// Update results message
|
| 1265 |
+
let message = '';
|
| 1266 |
+
if (percentage >= 90) {
|
| 1267 |
+
message = 'Outstanding! You\'re a quiz master!';
|
| 1268 |
+
} else if (percentage >= 70) {
|
| 1269 |
+
message = 'Great job! Well done!';
|
| 1270 |
+
} else if (percentage >= 50) {
|
| 1271 |
+
message = 'Good effort! Keep practicing!';
|
| 1272 |
+
} else {
|
| 1273 |
+
message = 'Don\'t give up! Practice makes perfect!';
|
| 1274 |
+
}
|
| 1275 |
+
document.getElementById('resultsMessage').textContent = message;
|
| 1276 |
+
}
|
| 1277 |
+
|
| 1278 |
+
// Start timer
|
| 1279 |
+
function startTimer() {
|
| 1280 |
+
clearInterval(appState.timerInterval);
|
| 1281 |
+
appState.timerInterval = setInterval(() => {
|
| 1282 |
+
appState.timeRemaining--;
|
| 1283 |
+
document.getElementById('timeRemaining').textContent = appState.timeRemaining;
|
| 1284 |
+
|
| 1285 |
+
if (appState.timeRemaining <= 0) {
|
| 1286 |
+
clearInterval(appState.timerInterval);
|
| 1287 |
+
showMessage('Time\'s up!', 'warning');
|
| 1288 |
+
setTimeout(() => {
|
| 1289 |
+
if (appState.currentQuestionIndex < appState.questions.length - 1) {
|
| 1290 |
+
nextQuestion();
|
| 1291 |
+
} else {
|
| 1292 |
+
finishQuiz();
|
| 1293 |
+
}
|
| 1294 |
+
}, 1000);
|
| 1295 |
+
}
|
| 1296 |
+
}, 1000);
|
| 1297 |
+
}
|
| 1298 |
+
|
| 1299 |
+
// Show hint
|
| 1300 |
+
function showHint() {
|
| 1301 |
+
const question = appState.questions[appState.currentQuestionIndex];
|
| 1302 |
+
if (question && question.hint) {
|
| 1303 |
+
showMessage(question.hint, 'info');
|
| 1304 |
+
} else {
|
| 1305 |
+
showMessage('No hint available for this question.', 'info');
|
| 1306 |
+
}
|
| 1307 |
+
}
|
| 1308 |
+
|
| 1309 |
+
// Reset to home
|
| 1310 |
+
function resetToHome() {
|
| 1311 |
+
document.getElementById('quizContainer').classList.remove('active');
|
| 1312 |
+
document.getElementById('resultsContainer').classList.remove('active');
|
| 1313 |
+
document.querySelector('.st-header').style.display = 'block';
|
| 1314 |
+
document.querySelector('.st-metrics').style.display = 'grid';
|
| 1315 |
+
document.querySelector('.st-columns').style.display = 'grid';
|
| 1316 |
+
|
| 1317 |
+
// Reset selections
|
| 1318 |
+
document.getElementById('topicSelect').value = '';
|
| 1319 |
+
appState.selectedTopic = '';
|
| 1320 |
+
updateStartButton();
|
| 1321 |
+
}
|
| 1322 |
+
|
| 1323 |
+
// Review answers
|
| 1324 |
+
function reviewAnswers() {
|
| 1325 |
+
let reviewHTML = '<div class="chart-container"><div class="chart-title">Answer Review</div>';
|
| 1326 |
+
|
| 1327 |
+
appState.questions.forEach((question, index) => {
|
| 1328 |
+
const userAnswer = appState.userAnswers[index];
|
| 1329 |
+
const isCorrect = userAnswer === question.correct;
|
| 1330 |
+
const status = isCorrect ? 'Correct' : 'Incorrect';
|
| 1331 |
+
const statusClass = isCorrect ? 'st-success' : 'st-error';
|
| 1332 |
+
|
| 1333 |
+
reviewHTML += `
|
| 1334 |
+
<div class="${statusClass}" style="margin-bottom: 1rem;">
|
| 1335 |
+
<div>
|
| 1336 |
+
<strong>Q${index + 1}:</strong> ${question.question}<br>
|
| 1337 |
+
<strong>Your Answer:</strong> ${question.options[userAnswer] || 'Not answered'}<br>
|
| 1338 |
+
<strong>Correct Answer:</strong> ${question.options[question.correct]}<br>
|
| 1339 |
+
<strong>Status:</strong> ${status}
|
| 1340 |
+
</div>
|
| 1341 |
+
</div>
|
| 1342 |
+
`;
|
| 1343 |
+
});
|
| 1344 |
+
|
| 1345 |
+
reviewHTML += '</div>';
|
| 1346 |
+
|
| 1347 |
+
// Create modal or show in new section
|
| 1348 |
+
showMessage('Review feature coming soon!', 'info');
|
| 1349 |
+
}
|
| 1350 |
+
|
| 1351 |
+
// Show message
|
| 1352 |
+
function showMessage(text, type = 'info') {
|
| 1353 |
+
const messageElement = document.createElement('div');
|
| 1354 |
+
messageElement.className = `st-${type}`;
|
| 1355 |
+
messageElement.innerHTML = `
|
| 1356 |
+
<i class="fas fa-${type === 'success' ? 'check' : type === 'error' ? 'times' : type === 'warning' ? 'exclamation-triangle' : 'info-circle'}"></i>
|
| 1357 |
+
<span>${text}</span>
|
| 1358 |
+
`;
|
| 1359 |
+
|
| 1360 |
+
// Insert at top of main content
|
| 1361 |
+
const mainContent = document.querySelector('.st-container');
|
| 1362 |
+
mainContent.insertBefore(messageElement, mainContent.firstChild);
|
| 1363 |
+
|
| 1364 |
+
// Remove after 3 seconds
|
| 1365 |
+
setTimeout(() => {
|
| 1366 |
+
messageElement.remove();
|
| 1367 |
+
}, 3000);
|
| 1368 |
+
}
|
| 1369 |
+
|
| 1370 |
+
// Toggle theme
|
| 1371 |
+
function toggleTheme() {
|
| 1372 |
+
const toggle = document.getElementById('themeToggle');
|
| 1373 |
+
toggle.classList.toggle('active');
|
| 1374 |
+
|
| 1375 |
+
// Here you would implement theme switching logic
|
| 1376 |
+
// For now, we'll just toggle the visual state
|
| 1377 |
+
appState.theme = appState.theme === 'dark' ? 'light' : 'dark';
|
| 1378 |
+
}
|
| 1379 |
+
|
| 1380 |
+
// Update language
|
| 1381 |
+
function updateLanguage() {
|
| 1382 |
+
const lang = appState.language;
|
| 1383 |
+
const t = translations[lang];
|
| 1384 |
+
|
| 1385 |
+
if (t) {
|
| 1386 |
+
// Update translatable elements
|
| 1387 |
+
// This is a simplified implementation
|
| 1388 |
+
// In a real app, you'd have data attributes or IDs for each translatable element
|
| 1389 |
+
console.log('Language updated to:', lang);
|
| 1390 |
+
}
|
| 1391 |
+
}
|
| 1392 |
+
|
| 1393 |
+
// Update theme
|
| 1394 |
+
function updateTheme() {
|
| 1395 |
+
document.body.className = appState.theme;
|
| 1396 |
+
}
|
| 1397 |
+
|
| 1398 |
+
// Initialize when page loads
|
| 1399 |
+
document.addEventListener('DOMContentLoaded', initializeApp);
|
| 1400 |
+
|
| 1401 |
+
// Mobile responsiveness
|
| 1402 |
+
function toggleSidebar() {
|
| 1403 |
+
const sidebar = document.getElementById('sidebar');
|
| 1404 |
+
const mainContent = document.getElementById('mainContent');
|
| 1405 |
+
|
| 1406 |
+
if (window.innerWidth <= 768) {
|
| 1407 |
+
sidebar.classList.toggle('hidden');
|
| 1408 |
+
mainContent.classList.toggle('full-width');
|
| 1409 |
+
}
|
| 1410 |
+
}
|
| 1411 |
+
|
| 1412 |
+
// Handle window resize
|
| 1413 |
+
window.addEventListener('resize', () => {
|
| 1414 |
+
if (window.innerWidth > 768) {
|
| 1415 |
+
document.getElementById('sidebar').classList.remove('hidden');
|
| 1416 |
+
document.getElementById('mainContent').classList.remove('full-width');
|
| 1417 |
+
} else {
|
| 1418 |
+
document.getElementById('sidebar').classList.add('hidden');
|
| 1419 |
+
document.getElementById('mainContent').classList.add('full-width');
|
| 1420 |
+
}
|
| 1421 |
+
});
|
| 1422 |
+
|
| 1423 |
+
// Initialize mobile view
|
| 1424 |
+
if (window.innerWidth <= 768) {
|
| 1425 |
+
document.getElementById('sidebar').classList.add('hidden');
|
| 1426 |
+
document.getElementById('mainContent').classList.add('full-width');
|
| 1427 |
+
}
|
| 1428 |
+
</script>
|
| 1429 |
+
<script id="dhws-dataInjector" src="/public/dhws-data-injector.js"></script>
|
| 1430 |
+
</body>
|
| 1431 |
+
</html>
|
tailwind.config.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
module.exports = {
|
| 2 |
+
content: [
|
| 3 |
+
"./pages/*.{html,js}",
|
| 4 |
+
"./index.html",
|
| 5 |
+
"./src/**/*.{html,js,jsx,ts,tsx}",
|
| 6 |
+
"./components/**/*.{html,js,jsx,ts,tsx}"
|
| 7 |
+
],
|
| 8 |
+
darkMode: 'class',
|
| 9 |
+
theme: {
|
| 10 |
+
extend: {
|
| 11 |
+
colors: {
|
| 12 |
+
// Primary Colors
|
| 13 |
+
primary: {
|
| 14 |
+
DEFAULT: "#4F46E5", // indigo-600
|
| 15 |
+
50: "#EEF2FF", // indigo-50
|
| 16 |
+
100: "#E0E7FF", // indigo-100
|
| 17 |
+
500: "#6366F1", // indigo-500
|
| 18 |
+
600: "#4F46E5", // indigo-600
|
| 19 |
+
700: "#4338CA", // indigo-700
|
| 20 |
+
900: "#312E81", // indigo-900
|
| 21 |
+
},
|
| 22 |
+
// Secondary Colors
|
| 23 |
+
secondary: {
|
| 24 |
+
DEFAULT: "#06B6D4", // cyan-500
|
| 25 |
+
50: "#ECFEFF", // cyan-50
|
| 26 |
+
100: "#CFFAFE", // cyan-100
|
| 27 |
+
400: "#22D3EE", // cyan-400
|
| 28 |
+
500: "#06B6D4", // cyan-500
|
| 29 |
+
600: "#0891B2", // cyan-600
|
| 30 |
+
700: "#0E7490", // cyan-700
|
| 31 |
+
},
|
| 32 |
+
// Accent Colors
|
| 33 |
+
accent: {
|
| 34 |
+
DEFAULT: "#F59E0B", // amber-500
|
| 35 |
+
50: "#FFFBEB", // amber-50
|
| 36 |
+
100: "#FEF3C7", // amber-100
|
| 37 |
+
400: "#FBBF24", // amber-400
|
| 38 |
+
500: "#F59E0B", // amber-500
|
| 39 |
+
600: "#D97706", // amber-600
|
| 40 |
+
700: "#B45309", // amber-700
|
| 41 |
+
},
|
| 42 |
+
// Background Colors
|
| 43 |
+
background: {
|
| 44 |
+
DEFAULT: "#0F172A", // slate-900
|
| 45 |
+
light: "#F8FAFC", // slate-50
|
| 46 |
+
},
|
| 47 |
+
surface: {
|
| 48 |
+
DEFAULT: "#1E293B", // slate-800
|
| 49 |
+
light: "#FFFFFF", // white
|
| 50 |
+
hover: "#334155", // slate-700
|
| 51 |
+
},
|
| 52 |
+
// Text Colors
|
| 53 |
+
'text-primary': {
|
| 54 |
+
DEFAULT: "#F8FAFC", // slate-50
|
| 55 |
+
light: "#0F172A", // slate-900
|
| 56 |
+
},
|
| 57 |
+
'text-secondary': {
|
| 58 |
+
DEFAULT: "#94A3B8", // slate-400
|
| 59 |
+
light: "#64748B", // slate-500
|
| 60 |
+
},
|
| 61 |
+
'text-muted': {
|
| 62 |
+
DEFAULT: "#64748B", // slate-500
|
| 63 |
+
light: "#94A3B8", // slate-400
|
| 64 |
+
},
|
| 65 |
+
// Status Colors
|
| 66 |
+
success: {
|
| 67 |
+
DEFAULT: "#10B981", // emerald-500
|
| 68 |
+
50: "#ECFDF5", // emerald-50
|
| 69 |
+
100: "#D1FAE5", // emerald-100
|
| 70 |
+
600: "#059669", // emerald-600
|
| 71 |
+
700: "#047857", // emerald-700
|
| 72 |
+
},
|
| 73 |
+
warning: {
|
| 74 |
+
DEFAULT: "#F59E0B", // amber-500
|
| 75 |
+
50: "#FFFBEB", // amber-50
|
| 76 |
+
100: "#FEF3C7", // amber-100
|
| 77 |
+
600: "#D97706", // amber-600
|
| 78 |
+
},
|
| 79 |
+
error: {
|
| 80 |
+
DEFAULT: "#EF4444", // red-500
|
| 81 |
+
50: "#FEF2F2", // red-50
|
| 82 |
+
100: "#FEE2E2", // red-100
|
| 83 |
+
600: "#DC2626", // red-600
|
| 84 |
+
700: "#B91C1C", // red-700
|
| 85 |
+
},
|
| 86 |
+
// Border Colors
|
| 87 |
+
border: "rgba(148, 163, 184, 0.2)", // slate-400 with opacity
|
| 88 |
+
},
|
| 89 |
+
fontFamily: {
|
| 90 |
+
sans: ['Inter', 'sans-serif'],
|
| 91 |
+
inter: ['Inter', 'sans-serif'],
|
| 92 |
+
mono: ['JetBrains Mono', 'monospace'],
|
| 93 |
+
'jetbrains': ['JetBrains Mono', 'monospace'],
|
| 94 |
+
},
|
| 95 |
+
fontSize: {
|
| 96 |
+
'xs': ['0.75rem', { lineHeight: '1rem' }],
|
| 97 |
+
'sm': ['0.875rem', { lineHeight: '1.25rem' }],
|
| 98 |
+
'base': ['1rem', { lineHeight: '1.5rem' }],
|
| 99 |
+
'lg': ['1.125rem', { lineHeight: '1.75rem' }],
|
| 100 |
+
'xl': ['1.25rem', { lineHeight: '1.75rem' }],
|
| 101 |
+
'2xl': ['1.5rem', { lineHeight: '2rem' }],
|
| 102 |
+
'3xl': ['1.875rem', { lineHeight: '2.25rem' }],
|
| 103 |
+
'4xl': ['2.25rem', { lineHeight: '2.5rem' }],
|
| 104 |
+
},
|
| 105 |
+
fontWeight: {
|
| 106 |
+
normal: '400',
|
| 107 |
+
medium: '500',
|
| 108 |
+
semibold: '600',
|
| 109 |
+
bold: '700',
|
| 110 |
+
},
|
| 111 |
+
borderRadius: {
|
| 112 |
+
'sm': '4px',
|
| 113 |
+
'md': '8px',
|
| 114 |
+
'lg': '12px',
|
| 115 |
+
'xl': '16px',
|
| 116 |
+
},
|
| 117 |
+
boxShadow: {
|
| 118 |
+
'sm': '0 1px 3px rgba(0, 0, 0, 0.1)',
|
| 119 |
+
'md': '0 4px 6px rgba(0, 0, 0, 0.1)',
|
| 120 |
+
'lg': '0 10px 15px rgba(0, 0, 0, 0.1)',
|
| 121 |
+
'card': '0 1px 3px rgba(0, 0, 0, 0.1)',
|
| 122 |
+
'modal': '0 4px 6px rgba(0, 0, 0, 0.1)',
|
| 123 |
+
},
|
| 124 |
+
animation: {
|
| 125 |
+
'slide-in': 'slideIn 300ms cubic-bezier(0.4, 0, 0.2, 1)',
|
| 126 |
+
'fade-in': 'fadeIn 150ms ease-out',
|
| 127 |
+
'scale-in': 'scaleIn 150ms ease-out',
|
| 128 |
+
},
|
| 129 |
+
keyframes: {
|
| 130 |
+
slideIn: {
|
| 131 |
+
'0%': { transform: 'translateY(-10px)', opacity: '0' },
|
| 132 |
+
'100%': { transform: 'translateY(0)', opacity: '1' },
|
| 133 |
+
},
|
| 134 |
+
fadeIn: {
|
| 135 |
+
'0%': { opacity: '0' },
|
| 136 |
+
'100%': { opacity: '1' },
|
| 137 |
+
},
|
| 138 |
+
scaleIn: {
|
| 139 |
+
'0%': { transform: 'scale(0.95)', opacity: '0' },
|
| 140 |
+
'100%': { transform: 'scale(1)', opacity: '1' },
|
| 141 |
+
},
|
| 142 |
+
},
|
| 143 |
+
transitionDuration: {
|
| 144 |
+
'150': '150ms',
|
| 145 |
+
'300': '300ms',
|
| 146 |
+
},
|
| 147 |
+
transitionTimingFunction: {
|
| 148 |
+
'ease-out': 'ease-out',
|
| 149 |
+
'custom': 'cubic-bezier(0.4, 0, 0.2, 1)',
|
| 150 |
+
},
|
| 151 |
+
spacing: {
|
| 152 |
+
'18': '4.5rem',
|
| 153 |
+
'88': '22rem',
|
| 154 |
+
'128': '32rem',
|
| 155 |
+
},
|
| 156 |
+
minHeight: {
|
| 157 |
+
'touch': '44px',
|
| 158 |
+
},
|
| 159 |
+
minWidth: {
|
| 160 |
+
'touch': '44px',
|
| 161 |
+
},
|
| 162 |
+
},
|
| 163 |
+
},
|
| 164 |
+
plugins: [
|
| 165 |
+
function({ addUtilities }) {
|
| 166 |
+
const newUtilities = {
|
| 167 |
+
'.touch-target': {
|
| 168 |
+
minHeight: '44px',
|
| 169 |
+
minWidth: '44px',
|
| 170 |
+
},
|
| 171 |
+
'.micro-interaction': {
|
| 172 |
+
transition: 'all 150ms ease-out',
|
| 173 |
+
},
|
| 174 |
+
'.micro-interaction:hover': {
|
| 175 |
+
transform: 'scale(0.98)',
|
| 176 |
+
},
|
| 177 |
+
'.transition-theme': {
|
| 178 |
+
transition: 'background-color 300ms cubic-bezier(0.4, 0, 0.2, 1), color 300ms cubic-bezier(0.4, 0, 0.2, 1), border-color 300ms cubic-bezier(0.4, 0, 0.2, 1)',
|
| 179 |
+
},
|
| 180 |
+
}
|
| 181 |
+
addUtilities(newUtilities)
|
| 182 |
+
}
|
| 183 |
+
],
|
| 184 |
+
}
|