rapid-router 5.18.0__py2.py3-none-any.whl → 7.6.8__py2.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.
Files changed (170) hide show
  1. example_project/rapid_router_test_settings.py +19 -7
  2. example_project/settings.py +21 -8
  3. example_project/urls.py +5 -6
  4. game/__init__.py +1 -1
  5. game/admin.py +7 -2
  6. game/character.py +8 -0
  7. game/decor.py +40 -0
  8. game/end_to_end_tests/base_game_test.py +34 -27
  9. game/end_to_end_tests/editor_page.py +15 -0
  10. game/end_to_end_tests/game_page.py +88 -20
  11. game/end_to_end_tests/selenium_test_case.py +1 -20
  12. game/end_to_end_tests/test_cow_crashes.py +3 -5
  13. game/end_to_end_tests/test_level_editor.py +273 -10
  14. game/end_to_end_tests/test_level_selection.py +25 -3
  15. game/end_to_end_tests/test_play_through.py +222 -127
  16. game/end_to_end_tests/test_python_levels.py +41 -7
  17. game/end_to_end_tests/test_saving_workspace.py +2 -1
  18. game/forms.py +7 -1
  19. game/level_management.py +26 -11
  20. game/messages.py +899 -337
  21. game/migrations/0001_squashed_0025_levels_ordering_pt1.py +19 -1
  22. game/migrations/0026_levels_pt2.py +13 -2
  23. game/migrations/0032_cannot_turn_left_level.py +13 -2
  24. game/migrations/0033_recursion_level.py +13 -2
  25. game/migrations/0034_joes_level.py +13 -2
  26. game/migrations/0035_disable_route_score_level_70.py +0 -2
  27. game/migrations/0036_level_score_73.py +0 -2
  28. game/migrations/0037_level_score_79.py +0 -2
  29. game/migrations/0038_level_score_40.py +0 -1
  30. game/migrations/0042_level_score_73.py +0 -2
  31. game/migrations/0048_add_cow_field_and_blocks.py +0 -2
  32. game/migrations/0049_level_score_34.py +0 -2
  33. game/migrations/0050_level_score_40.py +0 -2
  34. game/migrations/0051_level_score_49.py +0 -1
  35. game/migrations/0086_loop_levels.py +13 -2
  36. game/migrations/0092_disable_algo_score_in_custom_levels.py +28 -0
  37. game/migrations/0093_alter_level_character_name.py +18 -0
  38. game/migrations/0094_add_hint_lesson_subtitle_to_levels.py +28 -0
  39. game/migrations/0095_level_commands.py +18 -0
  40. game/migrations/0096_alter_level_commands.py +18 -0
  41. game/migrations/0097_add_python_den_levels.py +1515 -0
  42. game/migrations/0098_add_episode_link_fields.py +44 -0
  43. game/migrations/0099_python_episodes_links.py +103 -0
  44. game/migrations/0100_reorder_python_levels.py +179 -0
  45. game/migrations/0101_rename_episodes.py +45 -0
  46. game/migrations/0102_reoder_episodes_13_14.py +136 -0
  47. game/migrations/0103_level_1015_solution.py +26 -0
  48. game/migrations/0104_remove_level_direct_drive.py +17 -0
  49. game/migrations/0105_delete_invalid_attempts.py +18 -0
  50. game/migrations/0106_fields_to_snake_case.py +48 -0
  51. game/migrations/0107_rename_worksheet_link_episode_student_worksheet_link.py +18 -0
  52. game/migrations/0108_episode_indy_worksheet_link.py +18 -0
  53. game/migrations/0109_create_episodes_23_and_24.py +99 -0
  54. game/migrations/0110_remove_episode_indy_worksheet_link_and_more.py +100 -0
  55. game/migrations/0111_create_worksheets.py +149 -0
  56. game/migrations/0112_worksheet_locked_classes.py +21 -0
  57. game/migrations/0113_level_needs_approval.py +18 -0
  58. game/migrations/0114_default_and_non_student_levels_no_approval.py +31 -0
  59. game/migrations/0115_level_level__default_does_not_need_approval.py +22 -0
  60. game/migrations/0116_update_worksheet_video_links.py +68 -0
  61. game/migrations/0117_update_solutions_to_if_else.py +61 -0
  62. game/models.py +127 -17
  63. game/permissions.py +51 -19
  64. game/python_den_urls.py +26 -0
  65. game/random_road.py +9 -9
  66. game/serializers.py +12 -17
  67. game/static/django_reverse_js/js/reverse.js +171 -0
  68. game/static/game/css/LilitaOne-Regular.ttf +0 -0
  69. game/static/game/css/backgrounds.css +8 -12
  70. game/static/game/css/dataTables.custom.css +3 -2
  71. game/static/game/css/editor.css +47 -0
  72. game/static/game/css/game.css +37 -43
  73. game/static/game/css/game_screen.css +16 -0
  74. game/static/game/css/level_editor.css +5 -0
  75. game/static/game/css/level_selection.css +17 -2
  76. game/static/game/image/Python_Den_hero_student.png +0 -0
  77. game/static/game/image/Python_levels_page.svg +1954 -0
  78. game/static/game/image/characters/front_view/Electric_van.svg +448 -0
  79. game/static/game/image/characters/top_view/Electric_van.svg +448 -0
  80. game/static/game/image/decor/city/solar_panel.svg +1200 -0
  81. game/static/game/image/decor/farm/solar_panel.svg +86 -0
  82. game/static/game/image/decor/grass/solar_panel.svg +86 -0
  83. game/static/game/image/decor/snow/solar_panel.svg +173 -0
  84. game/static/game/image/electric_van.svg +448 -0
  85. game/static/game/image/icons/description.svg +1 -0
  86. game/static/game/image/icons/hint.svg +1 -0
  87. game/static/game/image/icons/python.svg +1 -1
  88. game/static/game/image/pigeon.svg +684 -0
  89. game/static/game/image/python_den_header.svg +19 -0
  90. game/static/game/js/animation.js +65 -24
  91. game/static/game/js/blockly/msg/js/bg.js +52 -1
  92. game/static/game/js/blockly/msg/js/ca.js +52 -1
  93. game/static/game/js/blockly/msg/js/en-gb.js +2 -0
  94. game/static/game/js/blockly/msg/js/en.js +2 -0
  95. game/static/game/js/blockly/msg/js/es.js +52 -1
  96. game/static/game/js/blockly/msg/js/fr.js +2 -0
  97. game/static/game/js/blockly/msg/js/hi.js +2 -0
  98. game/static/game/js/blockly/msg/js/it.js +52 -1
  99. game/static/game/js/blockly/msg/js/pl.js +52 -1
  100. game/static/game/js/blockly/msg/js/pt-br.js +52 -1
  101. game/static/game/js/blockly/msg/js/ru.js +52 -1
  102. game/static/game/js/blockly/msg/js/ur.js +52 -1
  103. game/static/game/js/blocklyCustomBlocks.js +93 -52
  104. game/static/game/js/button.js +12 -0
  105. game/static/game/js/cow.js +11 -7
  106. game/static/game/js/drawing.js +68 -29
  107. game/static/game/js/editor.js +23 -0
  108. game/static/game/js/game.js +74 -110
  109. game/static/game/js/level_editor.js +646 -274
  110. game/static/game/js/level_moderation.js +33 -2
  111. game/static/game/js/level_selection.js +1 -1
  112. game/static/game/js/loadLanguages.js +2 -2
  113. game/static/game/js/model.js +32 -2
  114. game/static/game/js/pythonControl.js +14 -1
  115. game/static/game/js/scoreboard.js +0 -37
  116. game/static/game/js/scoreboardSharedLevels.js +48 -0
  117. game/static/game/js/skulpt/skulpt-stdlib.js +1 -1
  118. game/static/game/js/sound.js +52 -5
  119. game/static/game/raphael_image/characters/top_view/Electric_van.svg +448 -0
  120. game/static/game/raphael_image/decor/city/solar_panel.svg +1200 -0
  121. game/static/game/raphael_image/decor/farm/solar_panel.svg +86 -0
  122. game/static/game/raphael_image/decor/grass/solar_panel.svg +86 -0
  123. game/static/game/raphael_image/decor/snow/solar_panel.svg +173 -0
  124. game/static/game/raphael_image/pigeon.svg +685 -0
  125. game/static/game/sass/game.scss +2 -2
  126. game/static/game/sound/clown_horn.mp3 +0 -0
  127. game/static/game/sound/clown_horn.ogg +0 -0
  128. game/static/game/sound/electric_van_starting.mp3 +0 -0
  129. game/static/game/sound/electric_van_starting.ogg +0 -0
  130. game/static/game/sound/pigeon.mp3 +0 -0
  131. game/static/game/sound/pigeon.ogg +0 -0
  132. game/static/game/sound/sleigh_bells.mp3 +0 -0
  133. game/static/game/sound/sleigh_bells.ogg +0 -0
  134. game/static/game/sound/sleigh_crash.mp3 +0 -0
  135. game/static/game/sound/sleigh_crash.ogg +0 -0
  136. game/templates/game/base.html +34 -14
  137. game/templates/game/basenonav.html +11 -5
  138. game/templates/game/game.html +142 -38
  139. game/templates/game/level_editor.html +340 -236
  140. game/templates/game/level_moderation.html +19 -6
  141. game/templates/game/level_selection.html +18 -110
  142. game/templates/game/python_den_level_selection.html +291 -0
  143. game/templates/game/python_den_worksheet.html +101 -0
  144. game/templates/game/scoreboard.html +83 -64
  145. game/tests/test_level_editor.py +94 -26
  146. game/tests/test_level_selection.py +149 -46
  147. game/tests/test_python_den_worksheet.py +85 -0
  148. game/tests/test_scoreboard.py +34 -7
  149. game/tests/utils/level.py +32 -26
  150. game/theme.py +5 -5
  151. game/urls.py +199 -61
  152. game/views/language_code_conversions.py +86 -86
  153. game/views/level.py +155 -63
  154. game/views/level_editor.py +88 -55
  155. game/views/level_moderation.py +23 -0
  156. game/views/level_selection.py +116 -47
  157. game/views/level_solutions.py +491 -106
  158. game/views/scoreboard.py +76 -51
  159. game/views/worksheet.py +25 -0
  160. rapid_router-7.6.8.dist-info/METADATA +174 -0
  161. {rapid_router-5.18.0.dist-info → rapid_router-7.6.8.dist-info}/RECORD +164 -104
  162. {rapid_router-5.18.0.dist-info → rapid_router-7.6.8.dist-info}/WHEEL +1 -1
  163. example_project/manage.py +0 -10
  164. game/static/game/image/actions/go.svg +0 -18
  165. game/static/game/js/js-reverse.js +0 -14
  166. game/static/game/js/pqselect.min.js +0 -9
  167. game/static/game/js/widget-scroller.js +0 -906
  168. rapid_router-5.18.0.dist-info/METADATA +0 -17
  169. {rapid_router-5.18.0.dist-info → rapid_router-7.6.8.dist-info/licenses}/LICENSE.md +0 -0
  170. {rapid_router-5.18.0.dist-info → rapid_router-7.6.8.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,171 @@
1
+ this.Urls = (function () {
2
+ var data = {"urls": [["about", [["about", []]]], ["admin:app_list", [["administration/%(app_label)s/", ["app_label"]]]], ["admin:auth_group_add", [["administration/auth/group/add/", []]]], ["admin:auth_group_change", [["administration/auth/group/%(object_id)s/change/", ["object_id"]]]], ["admin:auth_group_changelist", [["administration/auth/group/", []]]], ["admin:auth_group_delete", [["administration/auth/group/%(object_id)s/delete/", ["object_id"]]]], ["admin:auth_group_history", [["administration/auth/group/%(object_id)s/history/", ["object_id"]]]], ["admin:auth_user_add", [["administration/auth/user/add/", []]]], ["admin:auth_user_change", [["administration/auth/user/%(object_id)s/change/", ["object_id"]]]], ["admin:auth_user_changelist", [["administration/auth/user/", []]]], ["admin:auth_user_delete", [["administration/auth/user/%(object_id)s/delete/", ["object_id"]]]], ["admin:auth_user_history", [["administration/auth/user/%(object_id)s/history/", ["object_id"]]]], ["admin:auth_user_password_change", [["administration/auth/user/%(id)s/password/", ["id"]]]], ["admin:autocomplete", [["administration/autocomplete/", []]]], ["admin:common_class_add", [["administration/common/class/add/", []]]], ["admin:common_class_change", [["administration/common/class/%(object_id)s/change/", ["object_id"]]]], ["admin:common_class_changelist", [["administration/common/class/", []]]], ["admin:common_class_delete", [["administration/common/class/%(object_id)s/delete/", ["object_id"]]]], ["admin:common_class_history", [["administration/common/class/%(object_id)s/history/", ["object_id"]]]], ["admin:common_dailyactivity_add", [["administration/common/dailyactivity/add/", []]]], ["admin:common_dailyactivity_change", [["administration/common/dailyactivity/%(object_id)s/change/", ["object_id"]]]], ["admin:common_dailyactivity_changelist", [["administration/common/dailyactivity/", []]]], ["admin:common_dailyactivity_delete", [["administration/common/dailyactivity/%(object_id)s/delete/", ["object_id"]]]], ["admin:common_dailyactivity_history", [["administration/common/dailyactivity/%(object_id)s/history/", ["object_id"]]]], ["admin:common_dynamicelement_add", [["administration/common/dynamicelement/add/", []]]], ["admin:common_dynamicelement_change", [["administration/common/dynamicelement/%(object_id)s/change/", ["object_id"]]]], ["admin:common_dynamicelement_changelist", [["administration/common/dynamicelement/", []]]], ["admin:common_dynamicelement_delete", [["administration/common/dynamicelement/%(object_id)s/delete/", ["object_id"]]]], ["admin:common_dynamicelement_history", [["administration/common/dynamicelement/%(object_id)s/history/", ["object_id"]]]], ["admin:common_school_add", [["administration/common/school/add/", []]]], ["admin:common_school_change", [["administration/common/school/%(object_id)s/change/", ["object_id"]]]], ["admin:common_school_changelist", [["administration/common/school/", []]]], ["admin:common_school_delete", [["administration/common/school/%(object_id)s/delete/", ["object_id"]]]], ["admin:common_school_history", [["administration/common/school/%(object_id)s/history/", ["object_id"]]]], ["admin:common_schoolteacherinvitation_add", [["administration/common/schoolteacherinvitation/add/", []]]], ["admin:common_schoolteacherinvitation_change", [["administration/common/schoolteacherinvitation/%(object_id)s/change/", ["object_id"]]]], ["admin:common_schoolteacherinvitation_changelist", [["administration/common/schoolteacherinvitation/", []]]], ["admin:common_schoolteacherinvitation_delete", [["administration/common/schoolteacherinvitation/%(object_id)s/delete/", ["object_id"]]]], ["admin:common_schoolteacherinvitation_history", [["administration/common/schoolteacherinvitation/%(object_id)s/history/", ["object_id"]]]], ["admin:common_student_add", [["administration/common/student/add/", []]]], ["admin:common_student_change", [["administration/common/student/%(object_id)s/change/", ["object_id"]]]], ["admin:common_student_changelist", [["administration/common/student/", []]]], ["admin:common_student_delete", [["administration/common/student/%(object_id)s/delete/", ["object_id"]]]], ["admin:common_student_history", [["administration/common/student/%(object_id)s/history/", ["object_id"]]]], ["admin:common_teacher_add", [["administration/common/teacher/add/", []]]], ["admin:common_teacher_change", [["administration/common/teacher/%(object_id)s/change/", ["object_id"]]]], ["admin:common_teacher_changelist", [["administration/common/teacher/", []]]], ["admin:common_teacher_delete", [["administration/common/teacher/%(object_id)s/delete/", ["object_id"]]]], ["admin:common_teacher_history", [["administration/common/teacher/%(object_id)s/history/", ["object_id"]]]], ["admin:common_totalactivity_add", [["administration/common/totalactivity/add/", []]]], ["admin:common_totalactivity_change", [["administration/common/totalactivity/%(object_id)s/change/", ["object_id"]]]], ["admin:common_totalactivity_changelist", [["administration/common/totalactivity/", []]]], ["admin:common_totalactivity_delete", [["administration/common/totalactivity/%(object_id)s/delete/", ["object_id"]]]], ["admin:common_totalactivity_history", [["administration/common/totalactivity/%(object_id)s/history/", ["object_id"]]]], ["admin:common_userprofile_add", [["administration/common/userprofile/add/", []]]], ["admin:common_userprofile_change", [["administration/common/userprofile/%(object_id)s/change/", ["object_id"]]]], ["admin:common_userprofile_changelist", [["administration/common/userprofile/", []]]], ["admin:common_userprofile_delete", [["administration/common/userprofile/%(object_id)s/delete/", ["object_id"]]]], ["admin:common_userprofile_history", [["administration/common/userprofile/%(object_id)s/history/", ["object_id"]]]], ["admin:game_attempt_add", [["administration/game/attempt/add/", []]]], ["admin:game_attempt_change", [["administration/game/attempt/%(object_id)s/change/", ["object_id"]]]], ["admin:game_attempt_changelist", [["administration/game/attempt/", []]]], ["admin:game_attempt_delete", [["administration/game/attempt/%(object_id)s/delete/", ["object_id"]]]], ["admin:game_attempt_history", [["administration/game/attempt/%(object_id)s/history/", ["object_id"]]]], ["admin:game_block_add", [["administration/game/block/add/", []]]], ["admin:game_block_change", [["administration/game/block/%(object_id)s/change/", ["object_id"]]]], ["admin:game_block_changelist", [["administration/game/block/", []]]], ["admin:game_block_delete", [["administration/game/block/%(object_id)s/delete/", ["object_id"]]]], ["admin:game_block_history", [["administration/game/block/%(object_id)s/history/", ["object_id"]]]], ["admin:game_episode_add", [["administration/game/episode/add/", []]]], ["admin:game_episode_change", [["administration/game/episode/%(object_id)s/change/", ["object_id"]]]], ["admin:game_episode_changelist", [["administration/game/episode/", []]]], ["admin:game_episode_delete", [["administration/game/episode/%(object_id)s/delete/", ["object_id"]]]], ["admin:game_episode_history", [["administration/game/episode/%(object_id)s/history/", ["object_id"]]]], ["admin:game_level_add", [["administration/game/level/add/", []]]], ["admin:game_level_change", [["administration/game/level/%(object_id)s/change/", ["object_id"]]]], ["admin:game_level_changelist", [["administration/game/level/", []]]], ["admin:game_level_delete", [["administration/game/level/%(object_id)s/delete/", ["object_id"]]]], ["admin:game_level_history", [["administration/game/level/%(object_id)s/history/", ["object_id"]]]], ["admin:game_leveldecor_add", [["administration/game/leveldecor/add/", []]]], ["admin:game_leveldecor_change", [["administration/game/leveldecor/%(object_id)s/change/", ["object_id"]]]], ["admin:game_leveldecor_changelist", [["administration/game/leveldecor/", []]]], ["admin:game_leveldecor_delete", [["administration/game/leveldecor/%(object_id)s/delete/", ["object_id"]]]], ["admin:game_leveldecor_history", [["administration/game/leveldecor/%(object_id)s/history/", ["object_id"]]]], ["admin:game_workspace_add", [["administration/game/workspace/add/", []]]], ["admin:game_workspace_change", [["administration/game/workspace/%(object_id)s/change/", ["object_id"]]]], ["admin:game_workspace_changelist", [["administration/game/workspace/", []]]], ["admin:game_workspace_delete", [["administration/game/workspace/%(object_id)s/delete/", ["object_id"]]]], ["admin:game_workspace_history", [["administration/game/workspace/%(object_id)s/history/", ["object_id"]]]], ["admin:index", [["administration/", []]]], ["admin:jsi18n", [["administration/jsi18n/", []]]], ["admin:login", [["administration/login/", []]]], ["admin:logout", [["administration/logout/", []]]], ["admin:otp_static_staticdevice_add", [["administration/otp_static/staticdevice/add/", []]]], ["admin:otp_static_staticdevice_change", [["administration/otp_static/staticdevice/%(object_id)s/change/", ["object_id"]]]], ["admin:otp_static_staticdevice_changelist", [["administration/otp_static/staticdevice/", []]]], ["admin:otp_static_staticdevice_delete", [["administration/otp_static/staticdevice/%(object_id)s/delete/", ["object_id"]]]], ["admin:otp_static_staticdevice_history", [["administration/otp_static/staticdevice/%(object_id)s/history/", ["object_id"]]]], ["admin:otp_totp_totpdevice_add", [["administration/otp_totp/totpdevice/add/", []]]], ["admin:otp_totp_totpdevice_change", [["administration/otp_totp/totpdevice/%(object_id)s/change/", ["object_id"]]]], ["admin:otp_totp_totpdevice_changelist", [["administration/otp_totp/totpdevice/", []]]], ["admin:otp_totp_totpdevice_config", [["administration/otp_totp/totpdevice/%(pk)s/config/", ["pk"]]]], ["admin:otp_totp_totpdevice_delete", [["administration/otp_totp/totpdevice/%(object_id)s/delete/", ["object_id"]]]], ["admin:otp_totp_totpdevice_history", [["administration/otp_totp/totpdevice/%(object_id)s/history/", ["object_id"]]]], ["admin:otp_totp_totpdevice_qrcode", [["administration/otp_totp/totpdevice/%(pk)s/qrcode/", ["pk"]]]], ["admin:password_change", [["administration/password_change/", []]]], ["admin:password_change_done", [["administration/password_change/done/", []]]], ["admin:view_on_site", [["administration/r/%(content_type_id)s/%(object_id)s/", ["content_type_id", "object_id"]]]], ["administration_password_change", [["administration/password_change/", []]]], ["administration_password_change_done", [["administration/password_change_done/", []]]], ["anonymise-unverified-accounts", [["cron/user/unverified/delete/", []]]], ["anonymise_orphan_schools", [["schools/anonymise/%(start_id)s/", ["start_id"]]]], ["approve_level", [["rapidrouter/level_moderation/approve/%(levelID)s/", ["levelID"]]]], ["block-detail", [["rapidrouter/api/blocks/%(pk)s/", ["pk"]]]], ["block-list", [["rapidrouter/api/blocks/", []]]], ["celebrate", [["celebrate/", []]]], ["character-detail", [["rapidrouter/api/characters/%(pk)s/", ["pk"]]]], ["character-list", [["rapidrouter/api/characters/", []]]], ["codingClub", [["codingClub/", []]]], ["consent_form", [["consent_form/", []]]], ["contribute", [["contribute", []]]], ["dashboard", [["teach/dashboard/", []]]], ["decor-detail", [["rapidrouter/api/decors/%(pk)s/", ["pk"]]]], ["decor-list", [["rapidrouter/api/decors/", []]]], ["delete_account", [["delete/account/", []]]], ["delete_level", [["rapidrouter/level_moderation/delete/%(levelID)s/", ["levelID"]]]], ["delete_level_for_editor", [["rapidrouter/level_editor/delete/%(levelId)s/", ["levelId"]]]], ["delete_teacher_invite", [["teach/dashboard/delete_teacher_invite/%(token)s", ["token"]]]], ["delete_workspace", [["rapidrouter/workspace/delete/%(workspaceID)s/", ["workspaceID"]]]], ["email_verification", [["verify_email/", []]]], ["episode-detail", [["rapidrouter/api/episodes/%(pk)s/", ["pk"]]]], ["episode-list", [["rapidrouter/api/episodes/", []]]], ["final-inactivity-reminder", [["cron/user/inactive/send-final-reminder/", []]]], ["first-inactivity-reminder", [["cron/user/inactive/send-first-reminder/", []]]], ["first-verify-email-reminder", [["cron/user/unverified/send-first-reminder/", []]]], ["generate_random_map_for_editor", [["rapidrouter/level_editor/random/", []]]], ["get_sharing_information_for_editor", [["rapidrouter/level_editor/get_sharing_information/%(levelID)s/", ["levelID"]]]], ["getinvolved", [["getinvolved", []]]], ["home", [["", []]]], ["home-learning", [["home-learning", []]]], ["inactive_users", [["users/inactive/", []]]], ["independent_edit_account", [["play/account/independent/", []]]], ["independent_student_details", [["play/details/independent", []]]], ["independent_student_login", [["login/independent/", []]]], ["invite_toggle_admin", [["teach/dashboard/toggle_admin_invite/%(invite_id)s/", ["invite_id"]]]], ["invited_teacher", [["invited_teacher/%(token)s/", ["token"]]]], ["js-reverse", [["rapidrouter/reverse.js", []]]], ["last-connected-since", [["api/lastconnectedsince/%(year)s/%(month)s/%(day)s/", ["year", "month", "day"]]]], ["level-detail", [["rapidrouter/api/levels/%(pk)s/", ["pk"]]]], ["level-for-episode", [["rapidrouter/api/episodes/%(pk)s/levels/", ["pk"]]]], ["level-list", [["rapidrouter/api/levels/", []]]], ["level_editor", [["rapidrouter/level_editor/", []]]], ["level_editor_chosen_level", [["rapidrouter/level_editor/%(levelId)s/", ["levelId"]]]], ["level_moderation", [["rapidrouter/level_moderation/", []]]], ["levelblock-detail", [["rapidrouter/api/levelblocks/%(pk)s/", ["pk"]]]], ["levelblock-for-level", [["rapidrouter/api/levels/%(pk)s/blocks/", ["pk"]]]], ["leveldecor-detail", [["rapidrouter/api/leveldecors/%(pk)s/", ["pk"]]]], ["leveldecor-for-level", [["rapidrouter/api/levels/%(pk)s/decors/", ["pk"]]]], ["levels", [["rapidrouter/", []]]], ["load_level_for_editor", [["rapidrouter/level_editor/get/%(levelID)s/", ["levelID"]]]], ["load_list_of_workspaces", [["rapidrouter/workspace/load_list/", []]]], ["load_workspace", [["rapidrouter/workspace/load/%(workspaceID)s/", ["workspaceID"]]]], ["load_workspace_solution", [["rapidrouter/workspace/solution/%(level_name)s/", ["level_name"]]]], ["locked_out", [["locked_out/", []]]], ["logout_view", [["logout/", []]]], ["maintenance", [["maintenance/", []]]], ["map-for-level", [["rapidrouter/api/levels/%(pk)s/map/", ["pk"]]]], ["map-list", [["rapidrouter/api/maps/", []]]], ["mode-for-level", [["rapidrouter/api/levels/%(pk)s/mode/", ["pk"]]]], ["number_users_per_country", [["api/userspercountry/%(country)s/", ["country"]]]], ["old_login_form", [["login_form", []]]], ["onboarding-class", [["teach/onboarding-class/%(access_code)s", ["access_code"]]]], ["onboarding-classes", [["teach/onboarding-classes", []]]], ["onboarding-organisation", [["teach/onboarding-organisation/", []]]], ["organisation_kick", [["teach/dashboard/kick/%(pk)s/", ["pk"]]]], ["organisation_leave", [["teach/dashboard/school/leave/", []]]], ["organisation_toggle_admin", [["teach/dashboard/toggle_admin/%(pk)s/", ["pk"]]]], ["owned_levels", [["rapidrouter/level_editor/levels/owned/", []]]], ["password_reset_check_and_confirm", [["user/password/reset/%(uidb64)s-%(token)s/", ["uidb64", "token"]]]], ["password_reset_complete", [["teacher/password/reset/complete/", []]]], ["play", [["play/", []]]], ["play_anonymous_level", [["rapidrouter/level_editor/play_anonymous/%(levelId)s/", ["levelId"]]]], ["play_custom_level", [["rapidrouter/custom/%(levelId)s/", ["levelId"]]]], ["play_custom_level_from_editor", [["rapidrouter/level_editor/play_custom/%(levelId)s/", ["levelId"]]]], ["play_default_level", [["rapidrouter/%(level_name)s/", ["level_name"]], ["%(level_name)s/", ["level_name"]]]], ["play_python_default_level", [["pythonden/%(level_name)s/", ["level_name"]]]], ["privacy_notice", [["privacy-notice/", []]]], ["privacy_policy", [["privacy-policy/", []]]], ["process_newsletter_form", [["news_signup/", []]]], ["python_levels", [["pythonden/", []]]], ["python_scoreboard", [["pythonden/scoreboard/", []]]], ["random_level_for_episode", [["rapidrouter/levels/random/%(_0)s/", ["_0"]]]], ["rapid-router/javascript-catalog", [["rapidrouter/js-i18n/", []]]], ["register", [["register_form", []]]], ["registered-users", [["api/registered/%(year)s/%(month)s/%(day)s/", ["year", "month", "day"]]]], ["remove_fake_accounts", [["removeFakeAccounts/", []]]], ["resend_invite_teacher", [["teach/dashboard/resend_invite/%(token)s/", ["token"]]]], ["reset_password_email_sent", [["user/password/reset/done/", []]]], ["reset_screentime_warning", [["user/reset_screentime_warning/", []]]], ["reset_session_time", [["user/reset_session_time/", []]]], ["rest_framework:login", [["rapidrouter/api-auth/login/", []]]], ["rest_framework:logout", [["rapidrouter/api-auth/logout/", []]]], ["save_level_for_editor", [["rapidrouter/level_editor/save/%(levelId)s/", ["levelId"]], ["rapidrouter/level_editor/save/", []]]], ["save_workspace", [["rapidrouter/workspace/save/%(workspaceID)s/", ["workspaceID"]], ["rapidrouter/workspace/save/", []]]], ["school_student_edit_account", [["play/account/school_student/", []]]], ["scoreboard", [["rapidrouter/scoreboard/", []]]], ["second-inactivity-reminder", [["cron/user/inactive/send-second-reminder/", []]]], ["second-verify-email-reminder", [["cron/user/unverified/send-second-reminder/", []]]], ["set_language", [["i18n/setlang/", []]]], ["share_level_for_editor", [["rapidrouter/level_editor/share/%(levelID)s/", ["levelID"]]]], ["shared_levels", [["rapidrouter/level_editor/levels/shared/", []]]], ["start_episode", [["rapidrouter/episode/%(episodeId)s/", ["episodeId"]]]], ["start_python_episode", [["pythonden/episode/%(episodeId)s/", ["episodeId"]]]], ["student_details", [["play/details/", []]]], ["student_direct_login", [["u/%(user_id)s/%(login_id)s/", ["user_id", "login_id"]]]], ["student_edit_account", [["play/account/", []]]], ["student_join_organisation", [["play/join/", []]]], ["student_login", [["login/student/%(access_code)s/", ["access_code"]], ["login/student/%(access_code)s/%(login_type)s/", ["access_code", "login_type"]]]], ["student_login_access_code", [["login/student/", []]]], ["student_password_reset", [["user/password/reset/student/", []]]], ["submit_attempt", [["rapidrouter/submit/", []]]], ["teach", [["teach/", []]]], ["teacher_accept_student_request", [["teach/dashboard/student/accept/%(pk)s/", ["pk"]]]], ["teacher_class_password_reset", [["teach/class/%(access_code)s/password_reset/", ["access_code"]]]], ["teacher_delete_class", [["teach/class/delete/%(access_code)s", ["access_code"]]]], ["teacher_delete_students", [["teach/class/%(access_code)s/students/delete/", ["access_code"]]]], ["teacher_disable_2FA", [["teach/dashboard/disable_2FA/%(pk)s/", ["pk"]]]], ["teacher_dismiss_students", [["teach/class/%(access_code)s/students/dismiss/", ["access_code"]]]], ["teacher_download_csv", [["teach/onboarding-class/%(access_code)s/download_csv/", ["access_code"]]]], ["teacher_edit_class", [["teach/class/edit/%(access_code)s", ["access_code"]]]], ["teacher_edit_student", [["teach/class/student/edit/%(pk)s/", ["pk"]]]], ["teacher_login", [["login/teacher/", []]]], ["teacher_move_students", [["teach/class/%(access_code)s/students/move/", ["access_code"]]]], ["teacher_move_students_to_class", [["teach/class/%(access_code)s/students/move/disambiguate/", ["access_code"]]]], ["teacher_password_reset", [["user/password/reset/teacher/", []]]], ["teacher_print_reminder_cards", [["teach/onboarding-class/%(access_code)s/print_reminder_cards/", ["access_code"]]]], ["teacher_reject_student_request", [["teach/dashboard/student/reject/%(pk)s/", ["pk"]]]], ["terms", [["terms", []]]], ["theme-detail", [["rapidrouter/api/themes/%(pk)s/", ["pk"]]]], ["theme-list", [["rapidrouter/api/themes/", []]]], ["two_factor:backup_tokens", [["account/two_factor/backup/tokens/", []]]], ["two_factor:disable", [["account/two_factor/disable/", []]]], ["two_factor:profile", [["account/two_factor/", []]]], ["two_factor:qr", [["account/two_factor/qrcode/", []]]], ["two_factor:setup", [["account/two_factor/setup/", []]]], ["two_factor:setup_complete", [["account/two_factor/setup/complete/", []]]], ["verify_email", [["verify_email/%(token)s/", ["token"]]]], ["view_class", [["teach/class/%(access_code)s", ["access_code"]]]]], "prefix": "/"};
3
+ var resolverFactory;
4
+ /******/ (() => { // webpackBootstrap
5
+ /******/ "use strict";
6
+ /******/ // The require scope
7
+ /******/ var __webpack_require__ = {};
8
+ /******/
9
+ /************************************************************************/
10
+ /******/ /* webpack/runtime/define property getters */
11
+ /******/ (() => {
12
+ /******/ // define getter functions for harmony exports
13
+ /******/ __webpack_require__.d = (exports, definition) => {
14
+ /******/ for(var key in definition) {
15
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
16
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
17
+ /******/ }
18
+ /******/ }
19
+ /******/ };
20
+ /******/ })();
21
+ /******/
22
+ /******/ /* webpack/runtime/hasOwnProperty shorthand */
23
+ /******/ (() => {
24
+ /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
25
+ /******/ })();
26
+ /******/
27
+ /******/ /* webpack/runtime/make namespace object */
28
+ /******/ (() => {
29
+ /******/ // define __esModule on exports
30
+ /******/ __webpack_require__.r = (exports) => {
31
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
32
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
33
+ /******/ }
34
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
35
+ /******/ };
36
+ /******/ })();
37
+ /******/
38
+ /************************************************************************/
39
+ var __webpack_exports__ = {};
40
+ __webpack_require__.r(__webpack_exports__);
41
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
42
+ /* harmony export */ "UrlResolver": () => (/* binding */ UrlResolver),
43
+ /* harmony export */ "factory": () => (/* binding */ factory)
44
+ /* harmony export */ });
45
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
46
+
47
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
48
+
49
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
50
+
51
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
52
+
53
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
54
+
55
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
56
+
57
+ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
58
+
59
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
60
+
61
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
62
+
63
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
64
+
65
+ var UrlResolver = /*#__PURE__*/function () {
66
+ function UrlResolver(prefix, patterns) {
67
+ _classCallCheck(this, UrlResolver);
68
+
69
+ this.prefix = prefix;
70
+ this.patterns = patterns;
71
+ this.reverse = this.reverse.bind(this);
72
+ }
73
+
74
+ _createClass(UrlResolver, [{
75
+ key: "reverse",
76
+ value: function reverse() {
77
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
78
+ args[_key] = arguments[_key];
79
+ }
80
+
81
+ var validateArgs, buildKwargs;
82
+
83
+ if (args.length === 1 && _typeof(args[0]) === 'object') {
84
+ // kwargs mode
85
+ var providedKeys = Object.keys(args[0]);
86
+
87
+ validateArgs = function validateArgs(_ref) {
88
+ var _ref2 = _slicedToArray(_ref, 2),
89
+ _urlTemplate = _ref2[0],
90
+ urlParams = _ref2[1];
91
+
92
+ // check every needed param was provided (without extra elements)
93
+ return urlParams.length === providedKeys.length && urlParams.every(function (p) {
94
+ return providedKeys.includes(p);
95
+ });
96
+ }; // return first element
97
+
98
+
99
+ buildKwargs = function buildKwargs() {
100
+ return args[0];
101
+ };
102
+ } else {
103
+ // args mode
104
+ // check every required param
105
+ validateArgs = function validateArgs(_ref3) {
106
+ var _ref4 = _slicedToArray(_ref3, 2),
107
+ _urlTemplate = _ref4[0],
108
+ urlParams = _ref4[1];
109
+
110
+ return urlParams.length === args.length;
111
+ }; // build keyword-arguments from arguments
112
+
113
+
114
+ buildKwargs = function buildKwargs(keys) {
115
+ return Object.fromEntries(keys.map(function (key, i) {
116
+ return [key, args[i]];
117
+ }));
118
+ };
119
+ } // search between patterns if one matches provided args
120
+
121
+
122
+ var urlPattern = this.patterns.find(validateArgs);
123
+
124
+ if (!urlPattern) {
125
+ return null;
126
+ }
127
+
128
+ var _urlPattern = _slicedToArray(urlPattern, 2),
129
+ urlTemplate = _urlPattern[0],
130
+ urlKwargNames = _urlPattern[1];
131
+
132
+ var urlKwargs = buildKwargs(urlKwargNames);
133
+ var url = Object.entries(urlKwargs).reduce(function (partialUrl, _ref5) {
134
+ var _ref6 = _slicedToArray(_ref5, 2),
135
+ pName = _ref6[0],
136
+ pValue = _ref6[1];
137
+
138
+ if (pValue == null) pValue = ''; // replace variable with param
139
+
140
+ return partialUrl.replace("%(".concat(pName, ")s"), pValue);
141
+ }, urlTemplate);
142
+ return "".concat(this.prefix).concat(url);
143
+ }
144
+ }]);
145
+
146
+ return UrlResolver;
147
+ }();
148
+ function factory(config) {
149
+ var urlPatterns = config.urls,
150
+ urlPrefix = config.prefix;
151
+ return urlPatterns.reduce(function (resolver, _ref7) {
152
+ var _ref8 = _slicedToArray(_ref7, 2),
153
+ name = _ref8[0],
154
+ pattern = _ref8[1];
155
+
156
+ var urlResolver = new UrlResolver(urlPrefix, pattern);
157
+ resolver[name] = urlResolver.reverse; // turn snake-case into camel-case
158
+
159
+ resolver[name.replace(/[-_]+(.)/g, function (_m, p1) {
160
+ return p1.toUpperCase();
161
+ })] = urlResolver.reverse; // turn snake-case into dash-case
162
+
163
+ resolver[name.replace(/-/g, '_')] = urlResolver.reverse;
164
+ return resolver;
165
+ }, {});
166
+ }
167
+ resolverFactory = __webpack_exports__;
168
+ /******/ })()
169
+ ;
170
+ return data ? resolverFactory.factory(data) : resolverFactory.factory;
171
+ })();
@@ -16,22 +16,18 @@
16
16
  background-color: #c90548;
17
17
  }
18
18
 
19
- .bg--hard {
20
- background-color: #8967d3;
21
- }
22
-
23
- .bg--advanced {
24
- background-color: #754fc8;
25
- }
26
-
27
19
  .bg--shared-levels {
28
20
  background-color: #f6be00;
29
21
  }
30
22
 
31
- .bg--loops {
32
- background-color: #3F3F3F;
23
+ .bg--early-python {
24
+ background-color: #213CE7;
25
+ }
26
+
27
+ .bg--late-python {
28
+ background-color: #152584;
33
29
  }
34
30
 
35
- .bg--loops-coming-soon {
36
- background-color: #CBCBCB;
31
+ .banner--python-den--image {
32
+ width: 100%;
37
33
  }
@@ -1,5 +1,6 @@
1
- .tableWrapper {
2
- width: 100%;
1
+ .tableWrapper,
2
+ #moderateTable {
3
+ width: 100% !important;
3
4
  }
4
5
 
5
6
  div.DTFC_LeftBodyLiner,
@@ -0,0 +1,47 @@
1
+ editor-wc {
2
+ display: block;
3
+ width: 66%;
4
+ }
5
+
6
+ video,
7
+ iframe {
8
+ border: 1px solid black;
9
+ border-radius: 5px;
10
+ }
11
+
12
+ .tab-pane video,
13
+ .tab-pane iframe {
14
+ border-radius: 0 0 5px 5px;
15
+ }
16
+
17
+ .nav-tabs {
18
+ border-bottom: 0;
19
+ }
20
+
21
+ .nav-tabs > li > a {
22
+ text-decoration: none;
23
+ }
24
+
25
+ .nav-tabs > li > a,
26
+ .nav-tabs > li > a:hover,
27
+ .nav-tabs > li > a:focus {
28
+ border: 1px solid grey;
29
+ border-bottom-color: transparent;
30
+ font-weight: normal;
31
+ }
32
+
33
+ .nav-tabs > li.active > a,
34
+ .nav-tabs > li.active > a:hover,
35
+ .nav-tabs > li.active > a:focus {
36
+ border: 1px solid black;
37
+ border-bottom-color: transparent;
38
+ font-weight: bold;
39
+ text-decoration: none;
40
+ }
41
+
42
+ @media (max-width: 1000px) {
43
+ editor-wc {
44
+ height: 600px;
45
+ width: 100%;
46
+ }
47
+ }
@@ -18,6 +18,11 @@
18
18
  }
19
19
  }
20
20
 
21
+ @font-face {
22
+ font-family: LilitaOne;
23
+ src: url(LilitaOne-Regular.ttf);
24
+ }
25
+
21
26
  /*****************/
22
27
  /* Tab structure */
23
28
  /*****************/
@@ -37,13 +42,25 @@
37
42
  }
38
43
 
39
44
  #tabs #blockly_tab span,
40
- #tabs #python_tab span {
45
+ #tabs #python_tab span,
46
+ #tabs #language_tab select {
47
+ color: white;
48
+ }
49
+
50
+ #language_dropdown {
51
+ -webkit-appearance: none;
52
+ -moz-appearance: none;
53
+ appearance: none;
54
+ background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' fill='white'><polygon points='0,0 7,0 3.5,5'/></svg>") 96% 60% no-repeat;
55
+ }
56
+
57
+ option {
41
58
  color: black;
42
59
  }
43
60
 
44
61
  #tabs #blockly_tab img,
45
62
  #tabs #python_tab img {
46
- filter: none;
63
+ filter: invert(1);
47
64
  }
48
65
 
49
66
  #right {
@@ -164,6 +181,9 @@ div > .navigation_button_kurono {
164
181
  margin:0;
165
182
  border: none;
166
183
  resize: none;
184
+ height: 100vh;
185
+ min-height: 100vh;
186
+ max-height: 100vh;
167
187
  }
168
188
 
169
189
  #editor {
@@ -250,7 +270,7 @@ div > .navigation_button_kurono {
250
270
  /* Fuel gauge */
251
271
  /**************/
252
272
 
253
- #fuelGauge {
273
+ #fuelGauge, #electricFuelGauge {
254
274
  position: fixed;
255
275
  z-index: 7;
256
276
  width: 100px;
@@ -304,21 +324,11 @@ div > .navigation_button_kurono {
304
324
  cursor: col-resize;
305
325
  }
306
326
 
307
- /******************/
308
- /** Direct drive **/
309
- /******************/
310
-
311
- #direct_drive {
312
- width: 200px;
313
- height: 95px;
314
- position: absolute;
315
- z-index: 7;
316
- left: 50%;
317
- bottom: 20px;
318
- margin-left: 35px;
319
- }
327
+ /**************/
328
+ /** Zoom pan **/
329
+ /**************/
320
330
 
321
- .direct_drive_button {
331
+ .zoom_pan_button {
322
332
  display: inline;
323
333
  cursor: pointer;
324
334
  background-repeat: no-repeat;
@@ -332,8 +342,8 @@ div > .navigation_button_kurono {
332
342
  transition: background-size 0.3s;
333
343
  }
334
344
 
335
- .direct_drive_button:hover,
336
- .direct_drive_button:focus
345
+ .zoom_pan_button:hover,
346
+ .zoom_pan_button:focus
337
347
  {
338
348
  background-color: rgba(240,240,240,0.3);
339
349
  background-size: 50px 50px;
@@ -341,30 +351,6 @@ div > .navigation_button_kurono {
341
351
  outline: none;
342
352
  }
343
353
 
344
- #go {
345
- left: 60px;
346
- bottom: 0px;
347
- background-image : url('/static/game/image/actions/go.svg');
348
- }
349
-
350
- #turnLeft {
351
- left: 10px;
352
- bottom: 0px;
353
- background-image : url('/static/game/image/actions/left.svg');
354
- }
355
-
356
- #turnRight {
357
- left: 110px;
358
- bottom: 0px;
359
- background-image : url('/static/game/image/actions/right.svg');
360
- }
361
-
362
- #moveForward {
363
- left: 60px;
364
- bottom: 50px;
365
- background-image : url('/static/game/image/actions/forward.svg');
366
- }
367
-
368
354
  .blocklyWidgetDiv {
369
355
  line-height: 1;
370
356
  }
@@ -388,3 +374,11 @@ div > .navigation_button_kurono {
388
374
  bottom: 0px;
389
375
  background-image : url('/static/game/image/actions/btn_zoom_in.svg');
390
376
  }
377
+
378
+ /**************/
379
+ /* Python den */
380
+ /**************/
381
+
382
+ .game-header {
383
+ width: 100%;
384
+ }
@@ -87,6 +87,15 @@
87
87
  margin-right: 20px;
88
88
  }
89
89
 
90
+ video {
91
+ aspect-ratio: 16 / 9;
92
+ border: none;
93
+ height: 100%;
94
+ overflow: hidden;
95
+ position: relative;
96
+ width: 100%;
97
+ }
98
+
90
99
  /************/
91
100
  /** Tables **/
92
101
  /************/
@@ -494,6 +503,13 @@ div.no-print div.tab label {
494
503
 
495
504
  #tab_panes_wrapper .tab_pane {
496
505
  padding: 20px 20px 0 30px;
506
+ overflow: scroll;
507
+ position: absolute;
508
+ width: 380px;
509
+ }
510
+
511
+ #scenery_pane {
512
+ overflow: visible !important;
497
513
  }
498
514
 
499
515
  .tab_break {
@@ -260,6 +260,11 @@ input {
260
260
  cursor: pointer;
261
261
  }
262
262
 
263
+ #trafficLightRed,
264
+ #trafficLightGreen {
265
+ transform: scale(-1, 1);
266
+ }
267
+
263
268
  #scenery_pane td:first-child {
264
269
  text-align: left;
265
270
  font-size: 1rem;
@@ -73,13 +73,13 @@
73
73
  margin-left: 15px;
74
74
  }
75
75
 
76
- #episodes .panel-header:not(.bg--loops-coming-soon) .collapsed.episode_range_text::after {
76
+ #episodes .panel-header .collapsed.episode_range_text::after {
77
77
  content: "\e250";
78
78
  font-family: "Glyphicons Halflings";
79
79
  margin-left: 10px;
80
80
  }
81
81
 
82
- #episodes .panel-header:not(.bg--loops-coming-soon) .episode_range_text::after {
82
+ #episodes .panel-header .episode_range_text::after {
83
83
  content: "\e252";
84
84
  font-family: "Glyphicons Halflings";
85
85
  margin-left: 10px;
@@ -94,3 +94,18 @@
94
94
  font-weight: 300;
95
95
  text-decoration: none;
96
96
  }
97
+
98
+ .button--level {
99
+ background-color: #f6be00;
100
+ padding: 5px 12px;
101
+ margin: -10px 0px 0px 0px;
102
+ font-size: 14px;
103
+ }
104
+
105
+ .python-den-level {
106
+ padding: 1rem 0rem;
107
+ }
108
+
109
+ .text--warning {
110
+ color: #d60026;
111
+ }