munchboka-edutools 0.1.13__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of munchboka-edutools might be problematic. Click here for more details.

Files changed (149) hide show
  1. munchboka_edutools/__init__.py +184 -0
  2. munchboka_edutools/_plotmath_shim.py +126 -0
  3. munchboka_edutools/_version.py +2 -0
  4. munchboka_edutools/directives/__init__.py +1 -0
  5. munchboka_edutools/directives/admonitions.py +389 -0
  6. munchboka_edutools/directives/cas_popup.py +272 -0
  7. munchboka_edutools/directives/clear.py +103 -0
  8. munchboka_edutools/directives/dialogue.py +137 -0
  9. munchboka_edutools/directives/escape_room.py +296 -0
  10. munchboka_edutools/directives/factor_tree.py +549 -0
  11. munchboka_edutools/directives/ggb.py +209 -0
  12. munchboka_edutools/directives/ggb_icon.py +105 -0
  13. munchboka_edutools/directives/ggb_popup.py +165 -0
  14. munchboka_edutools/directives/horner.py +324 -0
  15. munchboka_edutools/directives/interactive_code.py +75 -0
  16. munchboka_edutools/directives/jeopardy.py +252 -0
  17. munchboka_edutools/directives/multi_plot.py +1126 -0
  18. munchboka_edutools/directives/pair_puzzle.py +191 -0
  19. munchboka_edutools/directives/parsons.py +109 -0
  20. munchboka_edutools/directives/plot.py +3105 -0
  21. munchboka_edutools/directives/poly_icon.py +111 -0
  22. munchboka_edutools/directives/polydiv.py +344 -0
  23. munchboka_edutools/directives/popup.py +245 -0
  24. munchboka_edutools/directives/quiz.py +291 -0
  25. munchboka_edutools/directives/signchart.py +516 -0
  26. munchboka_edutools/directives/timed_quiz.py +436 -0
  27. munchboka_edutools/directives/turtle.py +157 -0
  28. munchboka_edutools/static/css/admonitions.css +2012 -0
  29. munchboka_edutools/static/css/cas_popup.css +242 -0
  30. munchboka_edutools/static/css/code_mirror_themes/github_dark_cm.css +112 -0
  31. munchboka_edutools/static/css/code_mirror_themes/github_dark_default_cm.css +40 -0
  32. munchboka_edutools/static/css/code_mirror_themes/github_dark_high_contrast_cm.css +141 -0
  33. munchboka_edutools/static/css/code_mirror_themes/github_light_cm.css +120 -0
  34. munchboka_edutools/static/css/code_mirror_themes/github_light_default_cm.css +108 -0
  35. munchboka_edutools/static/css/code_mirror_themes/one_dark_cm.css +121 -0
  36. munchboka_edutools/static/css/dialogue.css +92 -0
  37. munchboka_edutools/static/css/escapeRoom/escape-room.css +223 -0
  38. munchboka_edutools/static/css/figures.css +274 -0
  39. munchboka_edutools/static/css/general_style.css +74 -0
  40. munchboka_edutools/static/css/github-dark-high-contrast.css +141 -0
  41. munchboka_edutools/static/css/github-dark.css +112 -0
  42. munchboka_edutools/static/css/github-light.css +120 -0
  43. munchboka_edutools/static/css/interactive_code/style.css +575 -0
  44. munchboka_edutools/static/css/interactive_code.css +582 -0
  45. munchboka_edutools/static/css/jeopardy.css +529 -0
  46. munchboka_edutools/static/css/pairPuzzle/style.css +177 -0
  47. munchboka_edutools/static/css/parsons/parsonsPuzzle.css +331 -0
  48. munchboka_edutools/static/css/popup.css +115 -0
  49. munchboka_edutools/static/css/quiz.css +312 -0
  50. munchboka_edutools/static/css/timedQuiz.css +375 -0
  51. munchboka_edutools/static/icons/ggb/mode_evaluate.svg +1 -0
  52. munchboka_edutools/static/icons/ggb/mode_extremum.svg +1 -0
  53. munchboka_edutools/static/icons/ggb/mode_intersect.svg +1 -0
  54. munchboka_edutools/static/icons/ggb/mode_nsolve.svg +1 -0
  55. munchboka_edutools/static/icons/ggb/mode_numeric.svg +1 -0
  56. munchboka_edutools/static/icons/ggb/mode_point.svg +1 -0
  57. munchboka_edutools/static/icons/ggb/mode_solve.svg +1 -0
  58. munchboka_edutools/static/icons/misc/windows-logo.svg +1 -0
  59. munchboka_edutools/static/icons/outline/dark_mode/academic.svg +3 -0
  60. munchboka_edutools/static/icons/outline/dark_mode/backward.svg +3 -0
  61. munchboka_edutools/static/icons/outline/dark_mode/book.svg +3 -0
  62. munchboka_edutools/static/icons/outline/dark_mode/chat_bubble.svg +3 -0
  63. munchboka_edutools/static/icons/outline/dark_mode/check.svg +3 -0
  64. munchboka_edutools/static/icons/outline/dark_mode/cmd_line.svg +3 -0
  65. munchboka_edutools/static/icons/outline/dark_mode/file.svg +1 -0
  66. munchboka_edutools/static/icons/outline/dark_mode/fire.svg +4 -0
  67. munchboka_edutools/static/icons/outline/dark_mode/key.svg +3 -0
  68. munchboka_edutools/static/icons/outline/dark_mode/magnifying.svg +3 -0
  69. munchboka_edutools/static/icons/outline/dark_mode/pencil_square.svg +3 -0
  70. munchboka_edutools/static/icons/outline/dark_mode/play.svg +3 -0
  71. munchboka_edutools/static/icons/outline/dark_mode/question.svg +3 -0
  72. munchboka_edutools/static/icons/outline/dark_mode/square_check.svg +1 -0
  73. munchboka_edutools/static/icons/outline/dark_mode/stop.svg +3 -0
  74. munchboka_edutools/static/icons/outline/dark_mode/summary.svg +3 -0
  75. munchboka_edutools/static/icons/outline/dark_mode/undo.svg +3 -0
  76. munchboka_edutools/static/icons/outline/dark_mode/unlock.svg +3 -0
  77. munchboka_edutools/static/icons/outline/light_mode/academic.svg +3 -0
  78. munchboka_edutools/static/icons/outline/light_mode/backward.svg +3 -0
  79. munchboka_edutools/static/icons/outline/light_mode/book.svg +3 -0
  80. munchboka_edutools/static/icons/outline/light_mode/chat_bubble.svg +3 -0
  81. munchboka_edutools/static/icons/outline/light_mode/check.svg +3 -0
  82. munchboka_edutools/static/icons/outline/light_mode/cmd_line.svg +3 -0
  83. munchboka_edutools/static/icons/outline/light_mode/file.svg +1 -0
  84. munchboka_edutools/static/icons/outline/light_mode/fire.svg +4 -0
  85. munchboka_edutools/static/icons/outline/light_mode/key.svg +3 -0
  86. munchboka_edutools/static/icons/outline/light_mode/magnifying.svg +3 -0
  87. munchboka_edutools/static/icons/outline/light_mode/pencil_square.svg +3 -0
  88. munchboka_edutools/static/icons/outline/light_mode/play.svg +3 -0
  89. munchboka_edutools/static/icons/outline/light_mode/question.svg +3 -0
  90. munchboka_edutools/static/icons/outline/light_mode/square_check.svg +1 -0
  91. munchboka_edutools/static/icons/outline/light_mode/stop.svg +3 -0
  92. munchboka_edutools/static/icons/outline/light_mode/summary.svg +3 -0
  93. munchboka_edutools/static/icons/outline/light_mode/undo.svg +3 -0
  94. munchboka_edutools/static/icons/outline/light_mode/unlock.svg +3 -0
  95. munchboka_edutools/static/icons/polyicons/cubicdown.svg +3 -0
  96. munchboka_edutools/static/icons/polyicons/cubicup.svg +3 -0
  97. munchboka_edutools/static/icons/polyicons/frown.svg +3 -0
  98. munchboka_edutools/static/icons/polyicons/smile.svg +3 -0
  99. munchboka_edutools/static/icons/solid/dark_mode/academic.svg +5 -0
  100. munchboka_edutools/static/icons/solid/dark_mode/backward.svg +3 -0
  101. munchboka_edutools/static/icons/solid/dark_mode/book.svg +3 -0
  102. munchboka_edutools/static/icons/solid/dark_mode/brain.svg +1 -0
  103. munchboka_edutools/static/icons/solid/dark_mode/file.svg +1 -0
  104. munchboka_edutools/static/icons/solid/dark_mode/fire.svg +3 -0
  105. munchboka_edutools/static/icons/solid/dark_mode/key.svg +3 -0
  106. munchboka_edutools/static/icons/solid/dark_mode/pencil_square.svg +4 -0
  107. munchboka_edutools/static/icons/solid/dark_mode/play.svg +3 -0
  108. munchboka_edutools/static/icons/solid/dark_mode/python.svg +1 -0
  109. munchboka_edutools/static/icons/solid/dark_mode/scroll.svg +1 -0
  110. munchboka_edutools/static/icons/solid/dark_mode/stop.svg +3 -0
  111. munchboka_edutools/static/icons/solid/light_mode/academic.svg +5 -0
  112. munchboka_edutools/static/icons/solid/light_mode/backward.svg +3 -0
  113. munchboka_edutools/static/icons/solid/light_mode/book.svg +3 -0
  114. munchboka_edutools/static/icons/solid/light_mode/brain.svg +1 -0
  115. munchboka_edutools/static/icons/solid/light_mode/file.svg +1 -0
  116. munchboka_edutools/static/icons/solid/light_mode/fire.svg +3 -0
  117. munchboka_edutools/static/icons/solid/light_mode/key.svg +3 -0
  118. munchboka_edutools/static/icons/solid/light_mode/pencil_square.svg +4 -0
  119. munchboka_edutools/static/icons/solid/light_mode/play.svg +3 -0
  120. munchboka_edutools/static/icons/solid/light_mode/python.svg +1 -0
  121. munchboka_edutools/static/icons/solid/light_mode/scroll.svg +1 -0
  122. munchboka_edutools/static/icons/solid/light_mode/stop.svg +3 -0
  123. munchboka_edutools/static/icons/stickers/edit.svg +1 -0
  124. munchboka_edutools/static/icons/stickers/pencil_square.svg +3 -0
  125. munchboka_edutools/static/js/casThemeManager.js +99 -0
  126. munchboka_edutools/static/js/escapeRoom/escape-room.js +219 -0
  127. munchboka_edutools/static/js/geogebra-setup.js +6 -0
  128. munchboka_edutools/static/js/highlight-init.js +6 -0
  129. munchboka_edutools/static/js/interactiveCode/codeEditor.js +632 -0
  130. munchboka_edutools/static/js/interactiveCode/interactiveCodeSetup.js +348 -0
  131. munchboka_edutools/static/js/interactiveCode/pythonRunner.js +336 -0
  132. munchboka_edutools/static/js/interactiveCode/turtleCode.js +203 -0
  133. munchboka_edutools/static/js/interactiveCode/workerManager.js +353 -0
  134. munchboka_edutools/static/js/jeopardy.js +523 -0
  135. munchboka_edutools/static/js/pairPuzzle/draggableItem.js +64 -0
  136. munchboka_edutools/static/js/pairPuzzle/dropZone.js +119 -0
  137. munchboka_edutools/static/js/pairPuzzle/game.js +160 -0
  138. munchboka_edutools/static/js/parsons/parsonsPuzzle.js +641 -0
  139. munchboka_edutools/static/js/popup.js +85 -0
  140. munchboka_edutools/static/js/quiz.js +422 -0
  141. munchboka_edutools/static/js/skulpt/skulpt.js +35721 -0
  142. munchboka_edutools/static/js/timedQuiz/multipleChoiceQuestion.js +184 -0
  143. munchboka_edutools/static/js/timedQuiz/timedMultipleChoiceQuiz.js +244 -0
  144. munchboka_edutools/static/js/timedQuiz/utils.js +6 -0
  145. munchboka_edutools/static/js/utils.js +3 -0
  146. munchboka_edutools-0.1.13.dist-info/METADATA +108 -0
  147. munchboka_edutools-0.1.13.dist-info/RECORD +149 -0
  148. munchboka_edutools-0.1.13.dist-info/WHEEL +4 -0
  149. munchboka_edutools-0.1.13.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,529 @@
1
+ /* Replacing with legacy Jeopardy CSS for faithful styling */
2
+ /* Jeopardy board styles with light/dark mode (Material-aligned) */
3
+
4
+ /* Color system */
5
+ :root {
6
+ color-scheme: light dark;
7
+ /* Light mode tokens */
8
+ --jp-bg: #FAFAFA; /* background */
9
+ --jp-surface: #FFFFFF; /* surfaces/cards */
10
+ --jp-text: #1F1F1F; /* primary text */
11
+ --jp-subtle-text: #5F6368; /* secondary text */
12
+ --jp-outline: #E0E3EB; /* outlines/dividers */
13
+ --jp-primary: #1A73E8; /* Google Blue 600 */
14
+ --jp-primary-strong: #0B57D0; /* header/nav */
15
+ --jp-on-primary: #FFFFFF; /* text on primary */
16
+ --jp-secondary: #E8F0FE; /* subtle surface tint */
17
+ --jp-danger: #D93025; /* Google Red 600 */
18
+ --jp-success: #188038; /* Google Green 700 */
19
+ --jp-success-border: #0F6E31; /* darker green for outline */
20
+ --jp-accent: #F29900; /* Orange for reset */
21
+ --jp-accent-border: #C47D00; /* Darker orange border */
22
+ --jp-shadow: 0 2px 6px rgba(0,0,0,0.12);
23
+ --jp-shadow-lg: 0 8px 30px rgba(0,0,0,0.22);
24
+ /* Components */
25
+ --jp-header-bg: var(--jp-primary-strong);
26
+ --jp-header-fg: var(--jp-on-primary);
27
+ --jp-team-bg: var(--jp-primary-strong);
28
+ --jp-team-fg: var(--jp-on-primary);
29
+ --jp-team-border: rgba(255,255,255,0.28);
30
+ --jp-tile-bg: var(--jp-primary);
31
+ --jp-tile-fg: #FFFFFF; /* readable contrast */
32
+ --jp-modal-bg: var(--jp-surface);
33
+ --jp-modal-fg: var(--jp-text);
34
+ /* Make modal footer match page/surface in light mode */
35
+ --jp-modal-footer: #FFFFFF;
36
+ }
37
+
38
+ @media (prefers-color-scheme: dark) {
39
+ :root {
40
+ /* Dark mode tokens */
41
+ --jp-bg: #121212;
42
+ --jp-surface: #1E1E1E;
43
+ --jp-text: #E8EAED;
44
+ --jp-subtle-text: #9AA0A6;
45
+ --jp-outline: #2A2E34;
46
+ --jp-primary: #1B66C9; /* darker blue for tiles */
47
+ --jp-primary-strong: #1C3B70; /* deep header/nav */
48
+ --jp-on-primary: #FFFFFF;
49
+ --jp-secondary: #171A21; /* modal footer tint */
50
+ --jp-danger: #EA4335; /* Google Red 500 */
51
+ --jp-success: #1E8E3E; /* Material green for dark */
52
+ --jp-success-border: #167C35; /* darker variant for outline */
53
+ --jp-accent: #F6A400; /* Slightly lighter orange for dark */
54
+ --jp-accent-border: #DB8E00; /* Darker orange border */
55
+ --jp-shadow: 0 2px 6px rgba(0,0,0,0.4);
56
+ --jp-shadow-lg: 0 8px 30px rgba(0,0,0,0.6);
57
+ /* Components */
58
+ --jp-header-bg: var(--jp-primary-strong);
59
+ --jp-header-fg: var(--jp-on-primary);
60
+ --jp-team-bg: var(--jp-primary-strong);
61
+ --jp-team-fg: var(--jp-on-primary);
62
+ --jp-team-border: rgba(255,255,255,0.22);
63
+ --jp-tile-bg: var(--jp-primary);
64
+ --jp-tile-fg: #FFFFFF;
65
+ --jp-modal-bg: var(--jp-surface);
66
+ --jp-modal-fg: var(--jp-text);
67
+ --jp-modal-footer: #161A20;
68
+ }
69
+ /* In dark mode, keep container on the dark surface token */
70
+ .jeopardy-container { background: var(--jp-bg); }
71
+ }
72
+
73
+ /* Explicit dark tokens when user selects dark mode (override system light) */
74
+ html.dark-mode,
75
+ body.dark-mode,
76
+ html[data-theme='dark'],
77
+ body[data-theme='dark'],
78
+ html[data-mode='dark'] {
79
+ --jp-bg: #121212;
80
+ --jp-surface: #1E1E1E;
81
+ --jp-text: #E8EAED;
82
+ --jp-subtle-text: #9AA0A6;
83
+ --jp-outline: #2A2E34;
84
+ --jp-primary: #1B66C9;
85
+ --jp-primary-strong: #1C3B70;
86
+ --jp-on-primary: #FFFFFF;
87
+ --jp-secondary: #171A21;
88
+ --jp-danger: #EA4335;
89
+ --jp-success: #1E8E3E;
90
+ --jp-success-border: #167C35;
91
+ --jp-accent: #F6A400;
92
+ --jp-accent-border: #DB8E00;
93
+ --jp-shadow: 0 2px 6px rgba(0,0,0,0.4);
94
+ --jp-shadow-lg: 0 8px 30px rgba(0,0,0,0.6);
95
+ --jp-header-bg: var(--jp-primary-strong);
96
+ --jp-header-fg: var(--jp-on-primary);
97
+ --jp-team-bg: var(--jp-primary-strong);
98
+ --jp-team-fg: var(--jp-on-primary);
99
+ --jp-team-border: rgba(255,255,255,0.22);
100
+ --jp-tile-bg: var(--jp-primary);
101
+ --jp-tile-fg: #FFFFFF;
102
+ --jp-modal-bg: var(--jp-surface);
103
+ --jp-modal-fg: var(--jp-text);
104
+ --jp-modal-footer: #161A20;
105
+ }
106
+
107
+ .jeopardy-container {
108
+ box-sizing: border-box;
109
+ width: 100%;
110
+ margin: 1rem auto;
111
+ padding: 0.5rem;
112
+ /* In light mode, let the page background show through */
113
+ background: transparent !important;
114
+ color: var(--jp-text);
115
+ }
116
+
117
+ /* When embedded inside admonitions, add extra right padding so content doesn't touch the border */
118
+ .admonition .jeopardy-container {
119
+ padding-right: 2.5rem;
120
+ }
121
+
122
+ /* Prevent horizontal overflow inside admonitions and tighten spacing on small widths */
123
+ .admonition .jeopardy-container { overflow-x: hidden; }
124
+ @media (max-width: 900px) {
125
+ .jeopardy-grid { border-spacing: 6px; }
126
+ .jeopardy-grid thead th { padding: 0.6rem; }
127
+ .jeopardy-tile { padding: 0.8rem 0.4rem; }
128
+ }
129
+ @media (max-width: 600px) {
130
+ .jeopardy-grid { border-spacing: 4px; }
131
+ .jeopardy-grid thead th { padding: 0.5rem; }
132
+ .jeopardy-tile { padding: 0.6rem 0.35rem; }
133
+ }
134
+
135
+ .jeopardy-scorebar {
136
+ display: flex;
137
+ gap: 1rem;
138
+ flex-wrap: wrap;
139
+ justify-content: center;
140
+ margin-bottom: 1rem;
141
+ }
142
+ .jeopardy-topbar { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem; }
143
+ .jeopardy-scorebar-wrap { flex: 1 1 auto; display: flex; justify-content: center; }
144
+ .jeopardy-topbar-right { margin-left: auto; display: flex; align-items: center; gap: 0.5rem; }
145
+ .jeopardy-reset-button { white-space: nowrap; }
146
+ .jeopardy-turn-indicator {
147
+ text-align: center;
148
+ margin: -0.5rem 0 0.5rem 0; /* tuck closer to the scorebar */
149
+ font-weight: 700;
150
+ color: var(--jp-text);
151
+ background: var(--jp-surface);
152
+ border: 1px solid var(--jp-outline);
153
+ display: inline-block;
154
+ padding: 0.35rem 0.75rem;
155
+ border-radius: 999px; /* pill */
156
+ box-shadow: var(--jp-shadow);
157
+ }
158
+ .jeopardy-team {
159
+ background: var(--jp-team-bg);
160
+ color: var(--jp-team-fg);
161
+ border-radius: 8px;
162
+ padding: 0.5rem 0.75rem;
163
+ min-width: 180px;
164
+ display: flex;
165
+ align-items: center;
166
+ justify-content: space-between;
167
+ box-shadow: var(--jp-shadow);
168
+ }
169
+ .jeopardy-team input.team-name {
170
+ background: transparent;
171
+ color: var(--jp-team-fg);
172
+ border: 1px solid var(--jp-team-border);
173
+ border-radius: 4px;
174
+ padding: 0.25rem 0.5rem;
175
+ margin-right: 0.5rem;
176
+ min-width: 80px;
177
+ }
178
+ .jeopardy-team input.team-name::placeholder { color: rgba(255,255,255,0.7); }
179
+ .jeopardy-team .score { font-weight: 700; margin: 0 0.5rem; }
180
+
181
+ /* Active team highlight for turn-based mode */
182
+ .jeopardy-team.active {
183
+ outline: 2px solid var(--jp-outline);
184
+ box-shadow: 0 0 0 3px rgba(26, 115, 232, 0.35);
185
+ }
186
+
187
+ .jeopardy-grid {
188
+ width: 100%;
189
+ max-width: 100%;
190
+ table-layout: fixed; /* force columns to fit container width */
191
+ border-collapse: separate;
192
+ border-spacing: 8px;
193
+ }
194
+ .jeopardy-grid thead th {
195
+ background: var(--jp-header-bg);
196
+ color: var(--jp-header-fg);
197
+ text-align: center;
198
+ padding: 0.75rem;
199
+ border-radius: 8px;
200
+ font-weight: 700;
201
+ /* allow long category names to wrap and avoid overflow */
202
+ white-space: normal;
203
+ /* prefer hyphenation on word breaks */
204
+ hyphens: auto;
205
+ -webkit-hyphens: auto;
206
+ -ms-hyphens: auto;
207
+ word-break: normal;
208
+ overflow-wrap: break-word;
209
+ /* scale header font for narrow containers */
210
+ font-size: clamp(0.85rem, 1.8vw, 1rem);
211
+ }
212
+ .jeopardy-grid tbody td { text-align: center; }
213
+
214
+ .jeopardy-tile {
215
+ width: 100%;
216
+ background: var(--jp-tile-bg);
217
+ color: var(--jp-tile-fg);
218
+ border: 1px solid rgba(255,255,255,0.1);
219
+ border-radius: 8px;
220
+ padding: 1rem 0.5rem;
221
+ /* responsive font that shrinks on tight layouts */
222
+ font-size: clamp(0.9rem, 2.2vw, 1.25rem);
223
+ font-weight: 800;
224
+ cursor: pointer;
225
+ box-shadow: var(--jp-shadow);
226
+ transition: transform 0.06s ease, opacity 0.2s ease, box-shadow 0.2s ease;
227
+ /* allow tile text to wrap when needed */
228
+ white-space: normal;
229
+ /* prefer hyphenation on word breaks */
230
+ hyphens: auto;
231
+ -webkit-hyphens: auto;
232
+ -ms-hyphens: auto;
233
+ word-break: normal;
234
+ overflow-wrap: break-word;
235
+ }
236
+ .jeopardy-tile:hover { transform: translateY(-2px); box-shadow: var(--jp-shadow-lg); }
237
+ .jeopardy-tile:focus { outline: 2px solid var(--jp-outline); outline-offset: 2px; }
238
+ .jeopardy-tile.used { opacity: 0.35; cursor: default; }
239
+
240
+ /* Modal */
241
+ .jeopardy-modal-backdrop {
242
+ position: fixed; inset: 0; background: rgba(0,0,0,0.65);
243
+ display: none; align-items: center; justify-content: center;
244
+ z-index: 9999;
245
+ }
246
+ .jeopardy-modal {
247
+ background: var(--jp-modal-bg); color: var(--jp-modal-fg);
248
+ width: min(900px, 92vw);
249
+ border-radius: 10px;
250
+ box-shadow: var(--jp-shadow-lg);
251
+ /* Enable internal scroll when content is tall */
252
+ max-height: 92vh;
253
+ display: flex;
254
+ flex-direction: column;
255
+ overflow: hidden;
256
+ }
257
+ .jeopardy-modal-header {
258
+ display: flex; align-items: center; justify-content: space-between;
259
+ padding: 0.75rem 1rem; background: var(--jp-header-bg); color: var(--jp-header-fg);
260
+ }
261
+ .jeopardy-timer { font-weight: 700; padding: 0 0.5rem; }
262
+ .jeopardy-modal-body {
263
+ padding: 1rem; background: inherit;
264
+ /* Scroll only the body; keep header/footer visible */
265
+ flex: 1 1 auto;
266
+ overflow: auto;
267
+ overscroll-behavior: contain;
268
+ -webkit-overflow-scrolling: touch; /* smooth on iOS */
269
+ }
270
+ .jeopardy-modal-footer {
271
+ padding: 0.75rem 1rem;
272
+ background: var(--jp-modal-footer);
273
+ display: flex;
274
+ align-items: center;
275
+ gap: 0.5rem;
276
+ }
277
+ .jeopardy-modal-footer .jeopardy-team-actions { margin-top: 0; }
278
+ .jeopardy-footer-right { margin-left: auto; display: flex; align-items: center; gap: 0.5rem; }
279
+
280
+ /* Auto theme (OS/browser preference) */
281
+ @media (prefers-color-scheme: light) {
282
+ .jeopardy-modal-body { background: #FFFFFF; color: #000000; }
283
+ /* Ensure auto mode adopts the same light overrides explicitly */
284
+ [data-mode='auto'] .jeopardy-modal-body { background: #FFFFFF; color: #000000; }
285
+ [data-mode='auto'] .jeopardy-setup { background: #E8F0FE; color: #000000; }
286
+ [data-mode='auto'] .jeopardy-setup .jp-field label { color: #000000; }
287
+ [data-mode='auto'] .jeopardy-setup input,
288
+ [data-mode='auto'] .jeopardy-setup select { background: #FFFFFF; color: #000000; border-color: var(--jp-outline); }
289
+ [data-mode='auto'] .jeopardy-resume-prompt { background: #E8F0FE; color: #000000; border-color: var(--jp-outline); }
290
+ /* In auto+light, keep container transparent so the page background shows */
291
+ [data-mode='auto'] .jeopardy-container { background: transparent !important; color: var(--jp-text); }
292
+ }
293
+ @media (prefers-color-scheme: dark) {
294
+ .jeopardy-modal-body { background: inherit; }
295
+ }
296
+
297
+ /* Explicit theme overrides if site provides toggles */
298
+ html.light-mode .jeopardy-modal-body,
299
+ body.light-mode .jeopardy-modal-body,
300
+ html[data-theme='light'] .jeopardy-modal-body,
301
+ body[data-theme='light'] .jeopardy-modal-body,
302
+ [data-mode='light'] .jeopardy-modal-body { background: #FFFFFF !important; color: #000000 !important; }
303
+
304
+ html.dark-mode .jeopardy-modal-body,
305
+ body.dark-mode .jeopardy-modal-body,
306
+ html[data-theme='dark'] .jeopardy-modal-body,
307
+ body[data-theme='dark'] .jeopardy-modal-body,
308
+ [data-mode='dark'] .jeopardy-modal-body { background: var(--jp-modal-bg) !important; color: var(--jp-modal-fg) !important; }
309
+
310
+ /* Code inside Jeopardy content should follow the page's syntax theme.
311
+ Do NOT override background in light mode; only tweak spacing and borders. */
312
+ .jeopardy-modal-body pre,
313
+ .jeopardy-modal-body code {
314
+ background: inherit;
315
+ }
316
+
317
+ html.light-mode .jeopardy-modal-body pre,
318
+ body.light-mode .jeopardy-modal-body pre,
319
+ html[data-theme='light'] .jeopardy-modal-body pre,
320
+ body[data-theme='light'] .jeopardy-modal-body pre,
321
+ [data-mode='light'] .jeopardy-modal-body pre {
322
+ background-color: transparent;
323
+ }
324
+
325
+ /* In dark mode, still avoid forcing a separate dark block if the
326
+ global theme already supplies one; inherit instead. */
327
+ html.dark-mode .jeopardy-modal-body pre,
328
+ body.dark-mode .jeopardy-modal-body pre,
329
+ html[data-theme='dark'] .jeopardy-modal-body pre,
330
+ body[data-theme='dark'] .jeopardy-modal-body pre,
331
+ [data-mode='dark'] .jeopardy-modal-body pre {
332
+ background-color: inherit;
333
+ }
334
+
335
+ .jeopardy-q { font-size: 1.05rem; margin-bottom: 1rem; background: inherit !important; }
336
+ .jeopardy-a { display: none; margin-top: 0.75rem; padding-top: 0.75rem; border-top: 1px solid var(--jp-outline); }
337
+
338
+ /* Improve wrapping with hyphens inside modal content */
339
+ .jeopardy-modal-body, .jeopardy-q, .jeopardy-a {
340
+ hyphens: auto;
341
+ -webkit-hyphens: auto;
342
+ -ms-hyphens: auto;
343
+ word-break: normal;
344
+ overflow-wrap: break-word;
345
+ }
346
+
347
+ .jeopardy-actions { display: flex; gap: 0.5rem; flex-wrap: wrap; }
348
+ .j-btn { padding: 0.5rem 0.75rem; border: none; border-radius: 6px; cursor: pointer; }
349
+ .j-btn.primary { background: var(--jp-primary); color: var(--jp-on-primary); }
350
+ .j-btn.primary:hover { filter: brightness(1.05); }
351
+ .j-btn.secondary { background: var(--jp-secondary); color: var(--jp-text); }
352
+ .j-btn.warn { background: var(--jp-danger); color: #fff; }
353
+ .j-btn.warn:hover { filter: brightness(1.05); }
354
+ .j-btn.success {
355
+ background: var(--jp-success);
356
+ color: #fff;
357
+ border: 2px solid var(--jp-success-border);
358
+ }
359
+ .j-btn.success:hover { filter: brightness(1.05); }
360
+ .j-btn.accent {
361
+ background: var(--jp-accent);
362
+ color: #fff;
363
+ border: 2px solid var(--jp-accent-border);
364
+ }
365
+ .j-btn.accent:hover { filter: brightness(1.05); }
366
+ .j-btn:focus { outline: 2px solid var(--jp-outline); outline-offset: 2px; }
367
+
368
+ .jeopardy-team-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 0.75rem; }
369
+ .jeopardy-team-actions .j-btn { font-size: 0.9rem; }
370
+
371
+ /* Per-team scoring buttons in the modal: make choices visually distinct
372
+ and slightly fade once used to signal that the option is consumed. */
373
+ .jeopardy-team-actions .j-btn.primary {
374
+ border: 2px solid var(--jp-success-border);
375
+ background: var(--jp-success);
376
+ color: #fff;
377
+ }
378
+ .jeopardy-team-actions .j-btn.secondary {
379
+ border: 2px solid var(--jp-outline);
380
+ /* Neutral grey with good contrast in both light/dark contexts */
381
+ background: #4b5563;
382
+ color: #f9fafb;
383
+ }
384
+ .jeopardy-team-actions .j-btn.used-choice {
385
+ opacity: 0.55;
386
+ cursor: default;
387
+ }
388
+
389
+ /* Keep the selected choice visually strong even when faded by adding
390
+ an explicit ring and subtle background tint. */
391
+ .jeopardy-team-actions .j-btn.used-choice.primary {
392
+ box-shadow: 0 0 0 2px var(--jp-success-border);
393
+ }
394
+ .jeopardy-team-actions .j-btn.used-choice.secondary {
395
+ box-shadow: 0 0 0 2px var(--jp-outline);
396
+ background: #374151;
397
+ }
398
+
399
+ /* Images inside content */
400
+ .jeopardy-image-container {
401
+ text-align: center;
402
+ margin: 0.5rem 0;
403
+ /* Robust centering regardless of global img display rules */
404
+ display: flex;
405
+ justify-content: center;
406
+ }
407
+ .jeopardy-image-container img {
408
+ max-width: 100%;
409
+ height: auto;
410
+ border-radius: 6px;
411
+ /* If themes force block images, keep them centered */
412
+ display: block;
413
+ margin-left: auto;
414
+ margin-right: auto;
415
+ }
416
+
417
+ /* Pre-game setup panel */
418
+ .jeopardy-setup {
419
+ background: var(--jp-modal-bg);
420
+ color: var(--jp-modal-fg);
421
+ border: 1px solid var(--jp-outline);
422
+ border-radius: 8px;
423
+ padding: 0.75rem;
424
+ margin-bottom: 0.75rem;
425
+ box-shadow: var(--jp-shadow);
426
+ }
427
+ .jeopardy-setup .jp-field { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem; }
428
+ .jeopardy-setup .jp-field label { min-width: 7rem; font-weight: 600; }
429
+ .jeopardy-setup .jp-names { display: grid; grid-template-columns: 1fr; gap: 0.35rem; margin-bottom: 0.5rem; }
430
+ .jeopardy-setup .jp-name-row { display: flex; align-items: center; gap: 0.5rem; }
431
+ .jeopardy-setup input, .jeopardy-setup select { padding: 0.35rem 0.5rem; border: 1px solid var(--jp-outline); border-radius: 6px; background: var(--jp-surface); color: var(--jp-text); }
432
+
433
+ /* Light mode: make setup panel light blue with black text for clarity */
434
+ @media (prefers-color-scheme: light) {
435
+ .jeopardy-setup { background: #E8F0FE; color: #000000; }
436
+ .jeopardy-setup .jp-field label { color: #000000; }
437
+ .jeopardy-setup input, .jeopardy-setup select { background: #FFFFFF; color: #000000; border-color: var(--jp-outline); }
438
+ }
439
+
440
+ /* Explicit light theme overrides (site theme toggles) */
441
+ html.light-mode .jeopardy-setup,
442
+ body.light-mode .jeopardy-setup,
443
+ html[data-theme='light'] .jeopardy-setup,
444
+ body[data-theme='light'] .jeopardy-setup,
445
+ [data-mode='light'] .jeopardy-setup { background: #E8F0FE !important; color: #000000 !important; }
446
+ html.light-mode .jeopardy-setup .jp-field label,
447
+ body.light-mode .jeopardy-setup .jp-field label,
448
+ html[data-theme='light'] .jeopardy-setup .jp-field label,
449
+ body[data-theme='light'] .jeopardy-setup .jp-field label,
450
+ [data-mode='light'] .jeopardy-setup .jp-field label { color: #000000 !important; }
451
+ html.light-mode .jeopardy-setup input,
452
+ body.light-mode .jeopardy-setup input,
453
+ html[data-theme='light'] .jeopardy-setup input,
454
+ body[data-theme='light'] .jeopardy-setup input,
455
+ html.light-mode .jeopardy-setup select,
456
+ body.light-mode .jeopardy-setup select,
457
+ html[data-theme='light'] .jeopardy-setup select,
458
+ body[data-theme='light'] .jeopardy-setup select,
459
+ [data-mode='light'] .jeopardy-setup input,
460
+ [data-mode='light'] .jeopardy-setup select { background: #FFFFFF !important; color: #000000 !important; border-color: var(--jp-outline) !important; }
461
+
462
+ /* Resume prompt above setup */
463
+ .jeopardy-resume-prompt {
464
+ display: flex;
465
+ justify-content: space-between;
466
+ align-items: center;
467
+ gap: 0.75rem;
468
+ padding: 0.5rem 0.75rem;
469
+ border: 1px solid var(--jp-outline);
470
+ border-radius: 8px;
471
+ background: var(--jp-surface);
472
+ box-shadow: var(--jp-shadow);
473
+ margin: 0.5rem 0 0.75rem;
474
+ }
475
+ .jeopardy-resume-actions { display: flex; gap: 0.5rem; }
476
+
477
+ /* Light mode: make resume prompt light blue for consistency */
478
+ @media (prefers-color-scheme: light) {
479
+ .jeopardy-resume-prompt { background: #E8F0FE; color: #000000; border-color: var(--jp-outline); }
480
+ }
481
+
482
+ /* Explicit light theme overrides */
483
+ html.light-mode .jeopardy-resume-prompt,
484
+ body.light-mode .jeopardy-resume-prompt,
485
+ html[data-theme='light'] .jeopardy-resume-prompt,
486
+ body[data-theme='light'] .jeopardy-resume-prompt,
487
+ [data-mode='light'] .jeopardy-resume-prompt { background: #E8F0FE !important; color: #000000 !important; border-color: var(--jp-outline) !important; }
488
+
489
+ /* Explicit dark theme overrides (site theme toggles and data-mode) */
490
+ html.dark-mode .jeopardy-setup,
491
+ body.dark-mode .jeopardy-setup,
492
+ html[data-theme='dark'] .jeopardy-setup,
493
+ body[data-theme='dark'] .jeopardy-setup,
494
+ [data-mode='dark'] .jeopardy-setup { background: var(--jp-modal-bg) !important; color: var(--jp-modal-fg) !important; }
495
+ html.dark-mode .jeopardy-setup .jp-field label,
496
+ body.dark-mode .jeopardy-setup .jp-field label,
497
+ html[data-theme='dark'] .jeopardy-setup .jp-field label,
498
+ body[data-theme='dark'] .jeopardy-setup .jp-field label,
499
+ [data-mode='dark'] .jeopardy-setup .jp-field label { color: var(--jp-text) !important; }
500
+ html.dark-mode .jeopardy-setup input,
501
+ body.dark-mode .jeopardy-setup input,
502
+ html[data-theme='dark'] .jeopardy-setup input,
503
+ body[data-theme='dark'] .jeopardy-setup input,
504
+ html.dark-mode .jeopardy-setup select,
505
+ body.dark-mode .jeopardy-setup select,
506
+ html[data-theme='dark'] .jeopardy-setup select,
507
+ body[data-theme='dark'] .jeopardy-setup select,
508
+ [data-mode='dark'] .jeopardy-setup input,
509
+ [data-mode='dark'] .jeopardy-setup select { background: var(--jp-surface) !important; color: var(--jp-text) !important; border-color: var(--jp-outline) !important; }
510
+
511
+ html.dark-mode .jeopardy-resume-prompt,
512
+ body.dark-mode .jeopardy-resume-prompt,
513
+ html[data-theme='dark'] .jeopardy-resume-prompt,
514
+ body[data-theme='dark'] .jeopardy-resume-prompt,
515
+ [data-mode='dark'] .jeopardy-resume-prompt { background: var(--jp-modal-bg) !important; color: var(--jp-modal-fg) !important; border-color: var(--jp-outline) !important; }
516
+
517
+ /* Container in explicit dark should use dark page tokens even if system prefers light */
518
+ html.dark-mode .jeopardy-container,
519
+ body.dark-mode .jeopardy-container,
520
+ html[data-theme='dark'] .jeopardy-container,
521
+ body[data-theme='dark'] .jeopardy-container,
522
+ [data-mode='dark'] .jeopardy-container { background: var(--jp-bg) !important; color: var(--jp-text) !important; }
523
+
524
+ [data-mode='dark'] .jeopardy-team { background: var(--jp-team-bg) !important; color: var(--jp-team-fg) !important; }
525
+ [data-mode='dark'] .jeopardy-turn-indicator { background: var(--jp-surface) !important; color: var(--jp-text) !important; }
526
+ [data-mode='dark'] .jeopardy-tile { background: var(--jp-tile-bg) !important; color: var(--jp-tile-fg) !important; }
527
+ [data-mode='dark'] .jeopardy-modal-footer { background: var(--jp-secondary) !important; }
528
+ [data-mode='dark'] .jeopardy-modal-header { background: var(--jp-header-bg) !important; color: var(--jp-header-fg) !important; }
529
+ [data-mode='dark'] .jeopardy-modal { background: var(--jp-modal-bg) !important; color: var(--jp-modal-fg) !important; }
@@ -0,0 +1,177 @@
1
+ /* -----------------------------------------------------------------------------
2
+ Scoped, namespaced CSS variables: all vars prefixed with “--pp-”
3
+ and living only inside the .pairing-puzzle-container.
4
+ This avoids any clash with global or other modules’ variables.
5
+ -----------------------------------------------------------------------------*/
6
+ .pairing-puzzle-container {
7
+ /* light‐mode defaults */
8
+ --pp-background-color: #f9f9f9;
9
+ --pp-border-color: #ccc;
10
+ --pp-draggable-bg-color: #ffffff;
11
+ --pp-container-bg-color: #eeeeee84;
12
+ --pp-text-color: #24292f;
13
+ --pp-primary-color: #007bff;
14
+ --pp-hover-bg-color: #e9ecef;
15
+ --pp-hover-border-color: #0056b3;
16
+ --pp-placeholder-bg-color: #bcbbbb;
17
+ --pp-placeholder-border-color:#999;
18
+ --pp-button-text-color: black;
19
+
20
+ display: flex;
21
+ flex-direction: column;
22
+ align-items: center;
23
+ padding: 20px;
24
+ border: 1px solid var(--pp-border-color);
25
+ border-radius: 8px;
26
+ background-color: var(--pp-background-color);
27
+ }
28
+
29
+ /* Dark Mode overrides, scoped to the container */
30
+ [data-mode="dark"] .pairing-puzzle-container {
31
+ --pp-background-color: #181818;
32
+ --pp-border-color: #ccc;
33
+ --pp-draggable-bg-color: #252d40;
34
+ --pp-container-bg-color: #0f131b;
35
+ --pp-text-color: #ffffff;
36
+ --pp-primary-color: #007bff;
37
+ --pp-hover-bg-color: #333333;
38
+ --pp-hover-border-color: #0056b3;
39
+ --pp-placeholder-bg-color: #000000;
40
+ --pp-placeholder-border-color:#999;
41
+ --pp-button-text-color: black;
42
+ }
43
+
44
+ /* Auto Mode: light system theme */
45
+ @media (prefers-color-scheme: light) {
46
+ [data-mode="auto"] .pairing-puzzle-container {
47
+ --pp-background-color: #f9f9f9;
48
+ --pp-border-color: #ccc;
49
+ --pp-draggable-bg-color: #ffffff;
50
+ --pp-container-bg-color: #d5d5d5;
51
+ --pp-text-color: #24292f;
52
+ --pp-primary-color: #007bff;
53
+ --pp-hover-bg-color: #e9ecef;
54
+ --pp-hover-border-color: #0056b3;
55
+ --pp-placeholder-bg-color: #bcbbbb;
56
+ --pp-placeholder-border-color:#999;
57
+ --pp-button-text-color: black;
58
+ }
59
+ }
60
+
61
+ /* Auto Mode: dark system theme */
62
+ @media (prefers-color-scheme: dark) {
63
+ [data-mode="auto"] .pairing-puzzle-container {
64
+ --pp-background-color: #181818;
65
+ --pp-border-color: #ccc;
66
+ --pp-draggable-bg-color: #252d40;
67
+ --pp-container-bg-color: #0f131b;
68
+ --pp-text-color: #ffffff;
69
+ --pp-primary-color: #007bff;
70
+ --pp-hover-bg-color: #333333;
71
+ --pp-hover-border-color: #0056b3;
72
+ --pp-placeholder-bg-color: #000000;
73
+ --pp-placeholder-border-color:#999;
74
+ --pp-button-text-color: black;
75
+ }
76
+ }
77
+
78
+ /* -----------------------------------------------------------------------------
79
+ Component styles consuming the namespaced vars
80
+ -----------------------------------------------------------------------------*/
81
+ .pairing-puzzle-container .draggable-item {
82
+ background-color: var(--pp-draggable-bg-color);
83
+ color: var(--pp-text-color);
84
+ border: 2px solid var(--pp-primary-color);
85
+ padding: 5px;
86
+ margin-bottom: 10px;
87
+ border-radius: 5px;
88
+ box-shadow: 0 4px 8px rgba(0,0,0,0.1);
89
+ cursor: grab;
90
+ display: inline-block;
91
+ white-space: nowrap;
92
+ box-sizing: border-box;
93
+ transition: all 0.2s ease;
94
+ }
95
+
96
+ .pairing-puzzle-container .draggable-container {
97
+ display: flex;
98
+ flex-wrap: wrap;
99
+ gap: 10px;
100
+ justify-content: flex-start;
101
+ align-items: flex-start;
102
+ width: 100%;
103
+ padding: 10px 15px;
104
+ background-color: var(--pp-container-bg-color);
105
+ border: 2px solid var(--pp-primary-color);
106
+ border-radius: 5px;
107
+ box-shadow: 0 4px 8px rgba(0,0,0,0.1);
108
+ }
109
+
110
+ .pairing-puzzle-container .drop-zone {
111
+ background-color: var(--pp-draggable-bg-color);
112
+ border: 2px dashed var(--pp-primary-color);
113
+ padding: 10px;
114
+ border-radius: 8px;
115
+ display: flex !important;
116
+ flex-wrap: wrap;
117
+ justify-content: center;
118
+ align-items: center;
119
+ gap: 10px;
120
+ min-width: 120px;
121
+ flex: 0 1 auto;
122
+ box-sizing: border-box;
123
+ margin-top: 10px;
124
+ }
125
+
126
+ .pairing-puzzle-container .drop-zone.dragover {
127
+ background-color: var(--pp-hover-bg-color);
128
+ border-color: var(--pp-hover-border-color);
129
+ }
130
+
131
+ .pairing-puzzle-container .placeholder {
132
+ height: 50px;
133
+ margin-bottom: 5px;
134
+ background-color: var(--pp-placeholder-bg-color);
135
+ border: 1px dashed var(--pp-placeholder-border-color);
136
+ width: 100%;
137
+ padding: 5px;
138
+ box-sizing: border-box;
139
+ text-align: center;
140
+ }
141
+
142
+ .pairing-puzzle-container .button-container {
143
+ display: flex;
144
+ justify-content: center;
145
+ gap: 10px;
146
+ margin-top: 20px;
147
+ }
148
+
149
+ /* .pairing-puzzle-container .button {
150
+ padding: 10px 20px;
151
+ border-radius: 5px;
152
+ cursor: pointer;
153
+ color: var(--pp-button-text-color);
154
+ background: var(--pp-primary-color);
155
+ border: none;
156
+ } */
157
+
158
+
159
+ /* optional: code blocks inside draggable items */
160
+ .pairing-puzzle-container .draggable-item pre,
161
+ .pairing-puzzle-container .draggable-item code {
162
+ padding: 4px;
163
+ margin: 0;
164
+ font-size: 14px;
165
+ line-height: 1.4;
166
+ border-radius: 4px;
167
+ }
168
+
169
+
170
+ .drop-zone-container {
171
+ width: 100%;
172
+ display: flex;
173
+ flex-wrap: wrap;
174
+ gap: 10px;
175
+ justify-content: flex-start;
176
+ align-items: stretch;
177
+ }