Merge branch 'MDL-69475_310' of https://github.com/stronk7/moodle into MOODLE_310_STABLE
authorAdrian Greeve <abgreeve@gmail.com>
Wed, 19 Aug 2020 02:42:51 +0000 (10:42 +0800)
committerAdrian Greeve <abgreeve@gmail.com>
Wed, 19 Aug 2020 02:42:51 +0000 (10:42 +0800)
135 files changed:
.travis.yml
admin/settings/courses.php
admin/settings/plugins.php
admin/tool/analytics/classes/output/models_list.php
admin/tool/analytics/templates/evaluation_options.mustache
admin/tool/analytics/templates/export_options.mustache
admin/tool/customlang/templates/translator.mustache
admin/tool/dataprivacy/templates/component_status.mustache
admin/tool/dataprivacy/templates/data_registry.mustache
admin/tool/dataprivacy/templates/data_registry_compliance.mustache
admin/tool/dataprivacy/templates/defaults_display.mustache
admin/tool/dataprivacy/templates/summary.mustache
admin/tool/langimport/templates/langimport.mustache
admin/tool/lp/templates/manage_competencies_page.mustache
admin/tool/mobile/classes/output/subscription.php
admin/tool/mobile/lang/en/tool_mobile.php
admin/tool/mobile/settings.php
admin/tool/moodlenet/amd/build/instance_form.min.js
admin/tool/moodlenet/amd/build/instance_form.min.js.map
admin/tool/moodlenet/amd/src/instance_form.js
admin/tool/moodlenet/templates/import_confirmation.mustache
admin/tool/moodlenet/templates/import_options_select.mustache
analytics/templates/insight_info_message_prediction.mustache
auth/db/auth.php
auth/db/lang/en/auth_db.php
availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form-debug.js
availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form-min.js
availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form.js
availability/condition/completion/yui/src/form/js/form.js
availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form-debug.js
availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form-min.js
availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form.js
availability/condition/date/yui/src/form/js/form.js
availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form-debug.js
availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form-min.js
availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form.js
availability/condition/grade/yui/src/form/js/form.js
availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form-debug.js
availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form-min.js
availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form.js
availability/condition/group/yui/src/form/js/form.js
availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form-debug.js
availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form-min.js
availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form.js
availability/condition/grouping/yui/src/form/js/form.js
availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form-debug.js
availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form-min.js
availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form.js
availability/condition/profile/yui/src/form/js/form.js
availability/yui/build/moodle-core_availability-form/moodle-core_availability-form-debug.js
availability/yui/build/moodle-core_availability-form/moodle-core_availability-form-min.js
availability/yui/build/moodle-core_availability-form/moodle-core_availability-form.js
availability/yui/src/form/js/form.js
badges/renderer.php
blocks/myoverview/templates/view-list.mustache
blocks/myoverview/templates/view-summary.mustache
blocks/rss_client/templates/item.mustache
calendar/classes/external/week_day_exporter.php
calendar/templates/event_item.mustache
calendar/templates/month_detailed.mustache
calendar/templates/month_mini.mustache
contentbank/tests/content_test.php
contentbank/tests/contenttype_test.php
contentbank/tests/external/rename_content_test.php
course/externallib.php
course/lib.php
course/templates/activityinstance.mustache
course/templates/bulkactivitycompletion.mustache
course/templates/coursecard.mustache
course/templates/defaultactivitycompletion.mustache
grade/edit/outcome/course_form.html
group/import.php
group/templates/index.mustache
lang/en/calendar.php
lang/en/course.php
lang/en/error.php
lib/badgeslib.php
lib/classes/date.php
lib/editor/atto/plugins/image/styles.css
lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button-debug.js
lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button-min.js
lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button.js
lib/editor/atto/plugins/table/yui/src/button/js/button.js
lib/form/filemanager.js
lib/outputrenderers.php
lib/templates/auth_digital_minor_page.mustache
lib/templates/filemanager_uploadform.mustache
lib/tests/weblib_test.php
message/templates/message_index.mustache
message/templates/message_preferences_component.mustache
message/templates/message_preferences_notification_processor.mustache
message/templates/notification_preferences_component.mustache
message/templates/notification_preferences_component_notification.mustache
mod/book/tool/print/classes/output/renderer.php
mod/book/tool/print/templates/print_book.mustache
mod/book/tool/print/templates/print_book_chapter.mustache
mod/forum/report/summary/index.php
mod/forum/report/summary/templates/filter_groups.mustache
mod/forum/templates/discussion_list.mustache
mod/forum/templates/forum_discussion.mustache
mod/forum/templates/local/grades/view_grade.mustache
mod/forum/tests/mail_test.php
mod/glossary/formats/entrylist/entrylist_format.php
mod/glossary/lib.php
mod/lesson/locallib.php
mod/lesson/renderer.php
mod/quiz/templates/modal_add_random_question.mustache
mod/quiz/tests/behat/manually_mark_question.feature
mod/workshop/form/rubric/styles.css
question/type/ddimageortext/rendererbase.php
question/type/ddimageortext/styles.css
question/type/ddmarker/renderer.php
question/type/ddmarker/styles.css
report/competency/templates/report.mustache
report/participation/index.php
theme/boost/scss/moodle.scss
theme/boost/scss/moodle/admin.scss
theme/boost/scss/moodle/backup-restore.scss
theme/boost/scss/moodle/bs2-compat.scss [deleted file]
theme/boost/scss/moodle/bs4alphacompat.scss [deleted file]
theme/boost/scss/moodle/calendar.scss
theme/boost/scss/moodle/core.scss
theme/boost/scss/moodle/course.scss
theme/boost/scss/moodle/forms.scss
theme/boost/scss/moodle/grade.scss
theme/boost/scss/moodle/modules.scss
theme/boost/scss/moodle/question.scss
theme/boost/scss/moodle/tool_usertours.scss
theme/boost/scss/moodle/variables.scss [new file with mode: 0644]
theme/boost/scss/preset/default.scss
theme/boost/style/moodle.css
theme/classic/scss/preset/default.scss
theme/classic/style/moodle.css
theme/index.php
theme/upgrade.txt

index 746c6c6..da6a827 100644 (file)
@@ -174,7 +174,9 @@ before_script:
         # Enable test external resources
         sed -i \
           -e "/require_once/i \\define('TEST_EXTERNAL_FILES_HTTP_URL', 'http://127.0.0.1:8080');" \
+          -e "/require_once/i \\define('TEST_EXTERNAL_FILES_HTTPS_URL', 'http://127.0.0.1:8080');" \
           config.php ;
+
         # Redis cache store tests
         sed -i \
           -e "/require_once/i \\define('TEST_CACHESTORE_REDIS_TESTSERVERS', '127.0.0.1');" \
@@ -254,8 +256,6 @@ script:
       if [ "$TASK" = 'PHPUNIT' ];
       then
         vendor/bin/phpunit --fail-on-risky --disallow-test-output --verbose;
-        EXTTESTS_HITS=$(docker logs exttests 2>&1 | grep -Fv -e 'AH00558' -e '[pid 1]' | wc -l)
-        echo -e "\nTest local resources number of hits: ${EXTTESTS_HITS}.\n"
       fi
 
     - >
@@ -292,3 +292,11 @@ script:
           exit 1 ;
         fi
       fi
+
+after_script:
+    - >
+      if [ "$TASK" = 'PHPUNIT' ];
+      then
+        EXTTESTS_HITS=$(docker logs exttests 2>&1 | grep -Fv -e 'AH00558' -e '[pid 1]' | wc -l)
+        echo -e "\nTest local resources number of hits: ${EXTTESTS_HITS}.\n"
+      fi
index b6ba368..e7d9bf9 100644 (file)
@@ -184,6 +184,7 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) {
     // Add a category for the Activity Chooser.
     $ADMIN->add('courses', new admin_category('activitychooser', new lang_string('activitychoosercategory', 'course')));
     $temp = new admin_settingpage('activitychoosersettings', new lang_string('activitychoosersettings', 'course'));
+    // Tab mode for the activity chooser.
     $temp->add(
         new admin_setting_configselect(
             'activitychoosertabmode',
@@ -197,6 +198,31 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) {
             ]
         )
     );
+
+    // Build a list of plugins that use the footer callback.
+    $pluginswithfunction = get_plugins_with_function('custom_chooser_footer', 'lib.php');
+    $pluginsoptions = [];
+    $pluginsoptions[COURSE_CHOOSER_FOOTER_NONE] = get_string('activitychooserhidefooter', 'course');
+    if ($pluginswithfunction) {
+        foreach ($pluginswithfunction as $plugintype => $plugins) {
+            foreach ($plugins as $pluginname => $pluginfunction) {
+                $plugin = $plugintype.'_'.$pluginname;
+                $pluginsoptions[$plugin] = get_string('pluginname', $plugin);
+            }
+        }
+    }
+
+    // Select what plugin to show in the footer.
+    $temp->add(
+        new admin_setting_configselect(
+            'activitychooseractivefooter',
+            new lang_string('activitychooseractivefooter', 'course'),
+            new lang_string('activitychooseractivefooter_desc', 'course'),
+            COURSE_CHOOSER_FOOTER_NONE,
+            $pluginsoptions
+        )
+    );
+
     $ADMIN->add('activitychooser', $temp);
     $ADMIN->add('activitychooser',
         new admin_externalpage('activitychooserrecommended', new lang_string('activitychooserrecommendations', 'course'),
index cc23ff3..3e7c68c 100644 (file)
@@ -555,7 +555,7 @@ if ($hassiteconfig) {
         global $CFG;
 
         // Check nobody's setting the indexing and query-only server to the same one.
-        if ($CFG->searchenginequeryonly === $value) {
+        if (isset($CFG->searchenginequeryonly) && $CFG->searchenginequeryonly === $value) {
             return get_string('searchenginequeryonlysame', 'admin');
         } else {
             return '';
@@ -625,7 +625,7 @@ if ($hassiteconfig) {
         global $CFG;
 
         // Check nobody's setting the indexing and query-only server to the same one.
-        if ($CFG->searchengine === $value) {
+        if (isset($CFG->searchengine) && $CFG->searchengine === $value) {
             return get_string('searchenginequeryonlysame', 'admin');
         } else {
             return '';
index ade6739..be1cb66 100644 (file)
@@ -64,7 +64,7 @@ class models_list implements \renderable, \templatable {
         $data = new \stdClass();
 
         $newmodelmenu = new \action_menu();
-        $newmodelmenu->set_menu_trigger(get_string('newmodel', 'tool_analytics'), 'btn btn-default');
+        $newmodelmenu->set_menu_trigger(get_string('newmodel', 'tool_analytics'), 'btn btn-secondary');
         $newmodelmenu->set_alignment(\action_menu::TL, \action_menu::BL);
 
         $newmodelmenu->add(new \action_menu_link(
index 9d77c13..7f4ce8e 100644 (file)
 {{/trainedexternally}}
 
 {{! Hidden by default if #trainedexternally as the default option is trainedmodel in this case.}}
-<div id="id-evaluation-timesplitting-container" class="m-t-1 {{#trainedexternally}}hidden{{/trainedexternally}}">
+<div id="id-evaluation-timesplitting-container" class="mt-3 {{#trainedexternally}}hidden{{/trainedexternally}}">
     {{#str}} selecttimesplittingforevaluation, tool_analytics {{/str}}
     <div>
-        <select id="id-evaluation-timesplitting" name="timesplitting" class="custom-select m-t-1">
+        <select id="id-evaluation-timesplitting" name="timesplitting" class="custom-select mt-3">
             {{#timesplittingmethods}}
                 <option value="{{id}}">{{text}}</option>
             {{/timesplittingmethods}}
index 34ebe94..c05550d 100644 (file)
@@ -39,7 +39,7 @@
     <input class="custom-control-input" type="radio" name="exportoption" id="id-mode-exportmodel" value="exportmodel" checked>
     <label class="custom-control-label" for="id-mode-exportmodel">{{#str}} exportmodel, tool_analytics {{/str}}</label>
 </div>
-<div class="custom-control custom-checkbox m-l-2" id="id-includeweights-container">
+<div class="custom-control custom-checkbox ml-5" id="id-includeweights-container">
   <input class="custom-control-input" type="checkbox" id="id-includeweights" value="1" checked>
   <label class="custom-control-label" for="id-includeweights">{{#str}} exportincludeweights, tool_analytics {{/str}}</label>
 </div>
index 62cbdac..400464c 100644 (file)
@@ -59,7 +59,7 @@
     <input type="hidden" name="sesskey" value="{{{ sesskey }}}">
     <input type="hidden" name="p" value="{{ currentpage }}">
 
-    <fieldset class="m-a-1 m-3">
+    <fieldset class="m-3">
         <button type="submit" name="savecontinue" class="btn btn-secondary">
             {{#str}}savecontinue, tool_customlang{{/str}}
         </button>
@@ -70,7 +70,7 @@
 
     <div class="list-group">
         <div class="container-fluid d-none d-md-block list-group-item border-bottom-0">
-            <div class="row-fluid">
+            <div class="row">
                 <div class="col-sm-4 col-md-2">
                     <strong>{{#str}}headingcomponent, tool_customlang{{/str}}</strong>
                 </div>
@@ -81,7 +81,7 @@
                     <strong>{{#str}}headingstandard, tool_customlang{{/str}}</strong>
                 </div>
                 <div class="col-sm-12 col-md-6">
-                    <span class="p-l-1 pl-3">
+                    <span class="pl-3">
                         <strong>{{#str}}headinglocal, tool_customlang{{/str}}</strong>
                     </span>
                 </div>
@@ -96,7 +96,7 @@
                 {{#outdated}}list-group-item-warning{{/outdated}}
                 {{#modified}}list-group-item-info{{/modified}}"
             >
-            <div class="row-fluid ">
+            <div class="row">
                 <div class="col-sm-4 col-md-2">
                     <div class="d-md-none">
                         <strong>{{#str}}headingcomponent, tool_customlang{{/str}}</strong>
     {{/strings}}
     </div>
 
-    <fieldset class="m-a-1 m-3">
+    <fieldset class="m-3">
         <button type="submit" name="savecontinue" class="btn btn-secondary">
             {{#str}}savecontinue, tool_customlang{{/str}}
         </button>
index 8d2bf1b..7130dbf 100644 (file)
     <hr />
     <div class="row">
         {{#compliant}}
-            <a class="component-expand p-l-2" data-component="{{raw_component}}" href='#'>
-            <h4 class=" d-inline p-l-2 " id="{{raw_component}}">{{#pix}}t/collapsed, moodle, {{#str}}expandplugin, tool_dataprivacy{{/str}}{{/pix}}{{component}}</h4>
+            <a class="component-expand pl-5" data-component="{{raw_component}}" href='#'>
+            <h4 class=" d-inline pl-5 " id="{{raw_component}}">{{#pix}}t/collapsed, moodle, {{#str}}expandplugin, tool_dataprivacy{{/str}}{{/pix}}{{component}}</h4>
             </a>
         {{/compliant}}
         {{^compliant}}
-            <h4 class="d-inline p-l-3 " id="{{raw_component}}">{{component}}</h4>
+            <h4 class="d-inline pl-6 " id="{{raw_component}}">{{component}}</h4>
             <span>{{#pix}}i/risk_xss, moodle, {{#str}}requiresattention, tool_dataprivacy{{/str}}{{/pix}}</span>
         {{/compliant}}
         {{#external}}
@@ -73,7 +73,7 @@
         <div class="hide" data-section="{{raw_component}}" aria-expanded="false" role="contentinfo">
             {{#metadata}}
                 <hr />
-                <div class="p-l-3">
+                <div class="pl-6">
                     <dl class="row">
                         <dt class="col-3">
                             {{#link}}
@@ -98,7 +98,7 @@
             {{/metadata}}
             {{#nullprovider}}
                 <hr />
-                <div class="p-l-3">
+                <div class="pl-6">
                     <div class="row">
                         <div class="col-12">
                             {{nullprovider}}
             {{/nullprovider}}
         </div>
     {{/compliant}}
-</div>
\ No newline at end of file
+</div>
index d77c7cf..501c5df 100644 (file)
@@ -54,7 +54,7 @@
 
     <div class="container-fluid mt-2">
         <div class="row">
-            <div class="col-md-4 p-l-0 nav-pills context-tree">
+            <div class="col-md-4 pl-0 nav-pills context-tree">
                 {{#tree}}
                     {{> tool_dataprivacy/context_tree_node}}
                 {{/tree}}
index c2231f3..ec41fc2 100644 (file)
@@ -59,7 +59,7 @@
             <h3 id="{{plugin_type_raw}}">{{#pix}}t/collapsed, moodle, {{#str}}expandplugintype, tool_dataprivacy{{/str}}{{/pix}}{{plugin_type}}</h3>
             </a>
         </div>
-        <div class="hide p-b-1" data-plugintarget="{{plugin_type_raw}}" aria-expanded="false" role="contentinfo">
+        <div class="hide pb-3" data-plugintarget="{{plugin_type_raw}}" aria-expanded="false" role="contentinfo">
             {{#plugins}}
                 {{> tool_dataprivacy/component_status}}
             {{/plugins}}
index dc1eb72..0053a31 100644 (file)
@@ -41,9 +41,9 @@
         "contextlevel": 70
     }
 }}
-<div class="row-fluid rtl-compatible mt-1 mb-1">
+<div class="row rtl-compatible mt-1 mb-1">
     <div class="col-md-9">
-        <div class="row-fluid rtl-compatible mt-1 mb-1">
+        <div class="row rtl-compatible mt-1 mb-1">
             <div class="col-md-3">
                 <strong>{{#str}}category, tool_dataprivacy{{/str}}</strong>
             </div>
@@ -51,7 +51,7 @@
                 {{category}}
             </div>
         </div>
-        <div class="row-fluid rtl-compatible mt-1 mb-1">
+        <div class="row rtl-compatible mt-1 mb-1">
             <div class="col-md-3">
                 <strong>{{#str}}purpose, tool_dataprivacy{{/str}}</strong>
             </div>
index 22c0221..a6be02e 100644 (file)
@@ -74,7 +74,7 @@
     {{#contexts}}
         <div class="card mb-3">
             <div class="card-header"><h3>{{contextname}}</h3></div>
-            <div class="card-body p-l-2 p-r-2">
+            <div class="card-body pl-5 pr-5">
 
                 {{#category.name}}
                 <h4>{{#str}}category, tool_dataprivacy{{/str}}</h4>
             </div>
         </div>
     {{/contexts}}
-</div>
\ No newline at end of file
+</div>
index 4b6b645..71a7515 100644 (file)
@@ -65,7 +65,7 @@
     }
 }}
 <div class="container-fluid langimport">
-    <div class="row row-fluid rtl-compatible">
+    <div class="row rtl-compatible">
         <div class="col-md-{{#caninstall}}6{{/caninstall}}{{^caninstall}}12{{/caninstall}} span{{#caninstall}}6{{/caninstall}}{{^caninstall}}12{{/caninstall}} mb-1">
             <form id="uninstallform" action="{{uninstallurl}}" method="post">
                 <fieldset>
index ccc67ba..1c2cd11 100644 (file)
@@ -46,7 +46,7 @@
 </h2>
 <div>{{{framework.description}}}</div>
     <h3>{{#str}}competencies, core_competency{{/str}}</h3>
-    <div class="row-fluid row">
+    <div class="row">
         <div class="col-lg-6">
             <p>
                 <form data-region="filtercompetencies" data-frameworkid="{{framework.id}}" class="form-inline">
index d8deaca..572a91a 100644 (file)
@@ -184,6 +184,13 @@ class subscription implements \renderable, \templatable {
                                     'type' => 'danger', 'message' => get_string('subscriptionfeaturenotapplied', 'tool_mobile')];
                             }
                             break;
+                        // Check QR automatic login.
+                        case 'qrautomaticlogin':
+                            if ($ms->qrcodetype == \tool_mobile\api::QR_CODE_LOGIN) {
+                                $feature['message'] = [
+                                    'type' => 'danger', 'message' => get_string('subscriptionfeaturenotapplied', 'tool_mobile')];
+                            }
+                            break;
                     }
                 }
             }
index bc7fc89..952e99b 100644 (file)
@@ -114,7 +114,7 @@ $string['qrcodeformobileapploginabout'] = 'Scan the QR code with your mobile app
 $string['qrcodeformobileappurlabout'] = 'Scan the QR code with your mobile app to fill in the site URL in your app.';
 $string['qrsiteadminsnotallowed'] = 'For security reasons login via QR code is not allowed for site administrators or if you are logged in as another user.';
 $string['qrcodetype'] = 'QR code access';
-$string['qrcodetype_desc'] = 'A QR code can be provided for mobile app users to scan and either have the site URL filled in or be automatically logged in without having to enter their credentials.';
+$string['qrcodetype_desc'] = 'A QR code can be provided for mobile app users to scan. This can be used to fill in the site URL, or where the site is secured using HTTPS, to automatically log the user in without having to enter their username and password.';
 $string['qrcodetypeurl'] = 'QR code with site URL';
 $string['qrcodetypelogin'] = 'QR code with automatic login';
 $string['readingthisemailgettheapp'] = 'Reading this in an email? <a href="{$a}">Download the mobile app and receive notifications on your mobile device</a>.';
index c2cee8c..19a8798 100644 (file)
@@ -94,11 +94,17 @@ if ($hassiteconfig) {
     $options = [
         tool_mobile\api::QR_CODE_DISABLED => new lang_string('qrcodedisabled', 'tool_mobile'),
         tool_mobile\api::QR_CODE_URL => new lang_string('qrcodetypeurl', 'tool_mobile'),
-        tool_mobile\api::QR_CODE_LOGIN => new lang_string('qrcodetypelogin', 'tool_mobile'),
     ];
+    $qrcodetypedefault = tool_mobile\api::QR_CODE_URL;
+
+    if (is_https()) {   // Allow QR login for https sites.
+        $options[tool_mobile\api::QR_CODE_LOGIN] = new lang_string('qrcodetypelogin', 'tool_mobile');
+        $qrcodetypedefault = tool_mobile\api::QR_CODE_LOGIN;
+    }
+
     $temp->add(new admin_setting_configselect('tool_mobile/qrcodetype',
                 new lang_string('qrcodetype', 'tool_mobile'),
-                new lang_string('qrcodetype_desc', 'tool_mobile'), tool_mobile\api::QR_CODE_LOGIN, $options));
+                new lang_string('qrcodetype_desc', 'tool_mobile'), $qrcodetypedefault, $options));
 
     $temp->add(new admin_setting_configtext('tool_mobile/forcedurlscheme',
                 new lang_string('forcedurlscheme_key', 'tool_mobile'),
index a6f0561..70d692b 100644 (file)
Binary files a/admin/tool/moodlenet/amd/build/instance_form.min.js and b/admin/tool/moodlenet/amd/build/instance_form.min.js differ
index 3e2853c..61f257e 100644 (file)
Binary files a/admin/tool/moodlenet/amd/build/instance_form.min.js.map and b/admin/tool/moodlenet/amd/build/instance_form.min.js.map differ
index a1443a0..cc0580e 100644 (file)
@@ -67,7 +67,7 @@ define(['tool_moodlenet/validator',
                             input.classList.remove('is-invalid'); // Just in case the class has been applied already.
                             input.classList.add('is-valid');
                             validationArea.innerText = result.message;
-                            validationArea.classList.remove('text-error');
+                            validationArea.classList.remove('text-danger');
                             validationArea.classList.add('text-success');
                             // Give the user some time to see their input is valid.
                             setTimeout(function() {
@@ -76,7 +76,7 @@ define(['tool_moodlenet/validator',
                         } else {
                             input.classList.add('is-invalid');
                             validationArea.innerText = result.message;
-                            validationArea.classList.add('text-error');
+                            validationArea.classList.add('text-danger');
                         }
                         return;
                 }).catch();
index 337b22a..f38cc0e 100644 (file)
@@ -53,7 +53,7 @@
 
             <input type="hidden" name="resourceurl" value="{{resourceurl}}">
             <input type="hidden" name="sesskey" value="{{sesskey}}">
-            <div class="box py-3 modal-header p-x-1">
+            <div class="box py-3 modal-header px-3">
                 <h4>{{#str}}confirm, core{{/str}}</h4>
             </div>
             <div class="box py-3 modal-body">
index 9dc42eb..f22566e 100644 (file)
@@ -58,7 +58,7 @@
             <input type="hidden" name="section" value="{{section}}">
             <input type="hidden" name="resourceurl" value="{{resourceurl}}">
             <input type="hidden" name="sesskey" value="{{sesskey}}">
-            <div class="box py-3 modal-header p-x-1">
+            <div class="box py-3 modal-header px-3">
                 <h4>{{#str}}importformatselectheader, tool_moodlenet{{/str}}</h4>
             </div>
             <div class="box py-3 modal-body">
index 6e66e8a..ed1d0e6 100644 (file)
@@ -43,7 +43,7 @@
 <br/>
 
 {{#actions}}
-    <a class="btn btn-outline-primary m-r-1 m-b-1 btn-insight" href="{{url}}">{{text}}</a><br/><br/>
+    <a class="btn btn-outline-primary mr-3 mb-3 btn-insight" href="{{url}}">{{text}}</a><br/><br/>
 {{/actions}}
 
 {{#usefulbuttons}}
index 5c2fe8c..13da0f4 100644 (file)
@@ -603,9 +603,12 @@ class auth_plugin_db extends auth_plugin_base {
             }
         }
         if (!empty($update)) {
-            $authdb->Execute("UPDATE {$this->config->table}
-                                 SET ".implode(',', $update)."
-                               WHERE {$this->config->fielduser}='".$this->ext_addslashes($extusername)."'");
+            $sql = "UPDATE {$this->config->table}
+                       SET ".implode(',', $update)."
+                     WHERE {$this->config->fielduser} = ?";
+            if (!$authdb->Execute($sql, array($this->ext_addslashes($extusername)))) {
+                print_error('auth_dbupdateerror', 'auth_db');
+            }
         }
         $authdb->Close();
         return true;
index d3f8a83..75c5c26 100644 (file)
@@ -74,5 +74,6 @@ $string['auth_dbcannotconnect'] = 'Cannot connect to external database.';
 $string['auth_dbcannotreadtable'] = 'Cannot read external table.';
 $string['auth_dbtableempty'] = 'External table is empty.';
 $string['auth_dbcolumnlist'] = 'External table contains the following columns:<br />{$a}';
+$string['auth_dbupdateerror'] = 'Error updating external database.';
 $string['pluginname'] = 'External database';
 $string['privacy:metadata'] = 'The External database authentication plugin does not store any personal data.';
index 5212364..4d5827f 100644 (file)
Binary files a/availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form-debug.js and b/availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form-debug.js differ
index 67acacb..3c31ebe 100644 (file)
Binary files a/availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form-min.js and b/availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form-min.js differ
index 5212364..4d5827f 100644 (file)
Binary files a/availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form.js and b/availability/condition/completion/yui/build/moodle-availability_completion-form/moodle-availability_completion-form.js differ
index 77c9cf1..2ccf97c 100644 (file)
@@ -23,7 +23,7 @@ M.availability_completion.form.initInner = function(cms) {
 
 M.availability_completion.form.getNode = function(json) {
     // Create HTML structure.
-    var html = '<span class="col-form-label p-r-1"> ' + M.util.get_string('title', 'availability_completion') + '</span>' +
+    var html = '<span class="col-form-label pr-3"> ' + M.util.get_string('title', 'availability_completion') + '</span>' +
                ' <span class="availability-group form-group"><label>' +
             '<span class="accesshide">' + M.util.get_string('label_cm', 'availability_completion') + ' </span>' +
             '<select class="custom-select" name="cm" title="' + M.util.get_string('label_cm', 'availability_completion') + '">' +
index 71cc687..c4eb06b 100644 (file)
Binary files a/availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form-debug.js and b/availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form-debug.js differ
index 42a4d65..4235144 100644 (file)
Binary files a/availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form-min.js and b/availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form-min.js differ
index 71cc687..c4eb06b 100644 (file)
Binary files a/availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form.js and b/availability/condition/date/yui/build/moodle-availability_date-form/moodle-availability_date-form.js differ
index 30e36fe..1d1656c 100644 (file)
@@ -27,7 +27,7 @@ M.availability_date.form.initInner = function(html, defaultTime) {
 };
 
 M.availability_date.form.getNode = function(json) {
-    var html = '<span class="col-form-label p-r-1">' +
+    var html = '<span class="col-form-label pr-3">' +
                     M.util.get_string('direction_before', 'availability_date') + '</span> <span class="availability-group">' +
             '<label><span class="accesshide">' + M.util.get_string('direction_label', 'availability_date') + ' </span>' +
             '<select name="direction" class="custom-select">' +
index cc76dd5..8867dcc 100644 (file)
Binary files a/availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form-debug.js and b/availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form-debug.js differ
index 9f523aa..0e71a08 100644 (file)
Binary files a/availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form-min.js and b/availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form-min.js differ
index cc76dd5..8867dcc 100644 (file)
Binary files a/availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form.js and b/availability/condition/grade/yui/build/moodle-availability_grade-form/moodle-availability_grade-form.js differ
index 1957d9a..4927e6a 100644 (file)
@@ -35,7 +35,7 @@ M.availability_grade.form.getNode = function(json) {
     this.nodesSoFar++;
 
     // Create HTML structure.
-    var html = '<label class="form-group"><span class="p-r-1">' + M.util.get_string('title', 'availability_grade') + '</span> ' +
+    var html = '<label class="form-group"><span class="pr-3">' + M.util.get_string('title', 'availability_grade') + '</span> ' +
             '<span class="availability-group">' +
             '<select name="id" class="custom-select"><option value="0">' + M.util.get_string('choosedots', 'moodle') + '</option>';
     for (var i = 0; i < this.grades.length; i++) {
index e6272f9..0ce2ef3 100644 (file)
Binary files a/availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form-debug.js and b/availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form-debug.js differ
index bc86932..9f64223 100644 (file)
Binary files a/availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form-min.js and b/availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form-min.js differ
index e6272f9..0ce2ef3 100644 (file)
Binary files a/availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form.js and b/availability/condition/group/yui/build/moodle-availability_group-form/moodle-availability_group-form.js differ
index 6c25361..d89ae08 100644 (file)
@@ -31,7 +31,7 @@ M.availability_group.form.initInner = function(groups) {
 
 M.availability_group.form.getNode = function(json) {
     // Create HTML structure.
-    var html = '<label><span class="p-r-1">' + M.util.get_string('title', 'availability_group') + '</span> ' +
+    var html = '<label><span class="pr-3">' + M.util.get_string('title', 'availability_group') + '</span> ' +
             '<span class="availability-group">' +
             '<select name="id" class="custom-select">' +
             '<option value="choose">' + M.util.get_string('choosedots', 'moodle') + '</option>' +
index 6dd1a72..1eb8f26 100644 (file)
Binary files a/availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form-debug.js and b/availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form-debug.js differ
index 4430bd6..1980203 100644 (file)
Binary files a/availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form-min.js and b/availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form-min.js differ
index 6dd1a72..1eb8f26 100644 (file)
Binary files a/availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form.js and b/availability/condition/grouping/yui/build/moodle-availability_grouping-form/moodle-availability_grouping-form.js differ
index 4152385..f8e596f 100644 (file)
@@ -31,7 +31,7 @@ M.availability_grouping.form.initInner = function(groupings) {
 
 M.availability_grouping.form.getNode = function(json) {
     // Create HTML structure.
-    var html = '<label><span class="p-r-1">' + M.util.get_string('title', 'availability_grouping') + '</span> ' +
+    var html = '<label><span class="pr-3">' + M.util.get_string('title', 'availability_grouping') + '</span> ' +
             '<span class="availability-group">' +
             '<select name="id" class="custom-select">' +
             '<option value="choose">' + M.util.get_string('choosedots', 'moodle') + '</option>';
index f47ec11..c4fb5a4 100644 (file)
Binary files a/availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form-debug.js and b/availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form-debug.js differ
index 945137a..38bb84f 100644 (file)
Binary files a/availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form-min.js and b/availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form-min.js differ
index f47ec11..c4fb5a4 100644 (file)
Binary files a/availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form.js and b/availability/condition/profile/yui/build/moodle-availability_profile-form/moodle-availability_profile-form.js differ
index dcab53f..76f75e4 100644 (file)
@@ -33,7 +33,7 @@ M.availability_profile.form.initInner = function(standardFields, customFields) {
 
 M.availability_profile.form.getNode = function(json) {
     // Create HTML structure.
-    var html = '<span class="availability-group"><label><span class="p-r-1">' +
+    var html = '<span class="availability-group"><label><span class="pr-3">' +
             M.util.get_string('conditiontitle', 'availability_profile') + '</span> ' +
             '<select name="field" class="custom-select">' +
             '<option value="choose">' + M.util.get_string('choosedots', 'moodle') + '</option>';
index a98f863..9b61ed9 100644 (file)
Binary files a/availability/yui/build/moodle-core_availability-form/moodle-core_availability-form-debug.js and b/availability/yui/build/moodle-core_availability-form/moodle-core_availability-form-debug.js differ
index d2c2b71..5041b64 100644 (file)
Binary files a/availability/yui/build/moodle-core_availability-form/moodle-core_availability-form-min.js and b/availability/yui/build/moodle-core_availability-form/moodle-core_availability-form-min.js differ
index a98f863..9b61ed9 100644 (file)
Binary files a/availability/yui/build/moodle-core_availability-form/moodle-core_availability-form.js and b/availability/yui/build/moodle-core_availability-form/moodle-core_availability-form.js differ
index 9083dae..93a12d9 100644 (file)
@@ -372,7 +372,7 @@ M.core_availability.List = function(json, root, parentRoot) {
             '<option value="|">' + M.util.get_string('listheader_multi_or', 'availability') + '</option></select></label> ' +
             M.util.get_string('listheader_multi_after', 'availability') + '</span></div>' +
             '<div class="availability-children"></div>' +
-            '<div class="availability-none"><span class="p-x-1">' + M.util.get_string('none', 'moodle') + '</span></div>' +
+            '<div class="availability-none"><span class="px-3">' + M.util.get_string('none', 'moodle') + '</span></div>' +
             '<div class="clearfix mt-1"></div>' +
             '<div class="availability-button"></div></div><div class="clearfix"></div></div>');
     if (!root) {
@@ -1130,7 +1130,7 @@ M.core_availability.EyeIcon.prototype.isHidden = function() {
  * @param {M.core_availability.Item|M.core_availability.List} toDelete Thing to delete
  */
 M.core_availability.DeleteIcon = function(toDelete) {
-    this.span = Y.Node.create('<a class="d-inline-block col-form-label availability-delete p-x-1" href="#" title="' +
+    this.span = Y.Node.create('<a class="d-inline-block col-form-label availability-delete px-3" href="#" title="' +
             M.util.get_string('delete', 'moodle') + '" role="button">');
     var img = Y.Node.create('<img src="' + M.util.image_url('t/delete', 'core') +
             '" alt="' + M.util.get_string('delete', 'moodle') + '" />');
index f268bd7..28a182b 100644 (file)
@@ -626,7 +626,7 @@ class core_badges_renderer extends plugin_renderer_base {
                     get_string('downloadall'), 'POST', array('class' => 'activatebadge'));
         $downloadall = $this->output->box('', 'col-md-3');
         $downloadall .= $this->output->box($actionhtml, 'col-md-9');
-        $downloadall = $this->output->box($downloadall, 'row m-l-2');
+        $downloadall = $this->output->box($downloadall, 'row ml-5');
 
         // Local badges.
         $localhtml = html_writer::start_tag('div', array('id' => 'issued-badge-table', 'class' => 'generalbox'));
@@ -674,7 +674,7 @@ class core_badges_renderer extends plugin_renderer_base {
             $backpacksettings = html_writer::link(new moodle_url('/badges/mybackpack.php'), $label, $attr);
             $actionshtml = $this->output->box('', 'col-md-3');
             $actionshtml .= $this->output->box($backpacksettings, 'col-md-9');
-            $actionshtml = $this->output->box($actionshtml, 'row m-l-2');
+            $actionshtml = $this->output->box($actionshtml, 'row ml-5');
             $externalhtml .= $actionshtml;
         }
 
index f32e7e8..06a35f6 100644 (file)
@@ -41,7 +41,7 @@
     <li class="list-group-item course-listitem"
         data-region="course-content"
         data-course-id="{{{id}}}">
-        <div class="row-fluid">
+        <div class="row">
             <div class="{{#hasprogress}}col-md-6{{/hasprogress}}{{^hasprogress}}col-md-11 col-md-11{{/hasprogress}} d-flex align-items-center">
                 <div>
                     <div class="text-muted muted d-flex flex-wrap">
@@ -72,7 +72,7 @@
                     </a>
                     {{^visible}}
                         <div class="d-flex flex-wrap">
-                            <span class="tag tag-info">{{#str}} hiddenfromstudents {{/str}}</span>
+                            <span class="badge badge-info">{{#str}} hiddenfromstudents {{/str}}</span>
                         </div>
                     {{/visible}}
                 </div>
index 02dd284..aecd376 100644 (file)
                 </div>
                 {{^visible}}
                     <div class="d-flex flex-wrap">
-                        <span class="tag tag-info">{{#str}} hiddenfromstudents {{/str}}</span>
+                        <span class="badge badge-info">{{#str}} hiddenfromstudents {{/str}}</span>
                     </div>
                 {{/visible}}
                 <div class="summary">
                     <span class="sr-only">{{#str}}aria:coursesummary, block_myoverview{{/str}}</span>
                     {{{summary}}}
                 </div>
-                <div class="ml-auto mt-auto w-50 p-t-1">
+                <div class="ml-auto mt-auto w-50 pt-3">
                     {{#hasprogress}}
                         {{> block_myoverview/progress-bar}}
                     {{/hasprogress}}
index 067f8eb..cb0555a 100644 (file)
@@ -43,7 +43,7 @@
         "datepublished": "12 January 2016, 9:12 pm"
     }
 }}
-<li class="p-y-1">
+<li class="py-3">
     {{$title}}
         <div class="link">
             <a href="{{{link}}}" onclick='this.target="_blank"'>{{title}}</a>
index 98ad278..80ddbf0 100644 (file)
@@ -86,6 +86,9 @@ class week_day_exporter extends day_exporter {
                 'type' => PARAM_RAW,
                 'default' => '',
             ],
+            'daytitle' => [
+                'type' => PARAM_RAW,
+            ]
         ]);
 
         return $return;
@@ -104,6 +107,8 @@ class week_day_exporter extends day_exporter {
             $return['popovertitle'] = $popovertitle;
         }
 
+        $return['daytitle'] = $this->get_day_title();
+
         return $return;
     }
 
@@ -141,4 +146,24 @@ class week_day_exporter extends day_exporter {
 
         return $title;
     }
+
+    /**
+     * Get the title for this day.
+     *
+     * @return string
+     */
+    protected function get_day_title(): string {
+        $userdate = userdate($this->data[0], get_string('strftimedayshort'));
+
+        $numevents = count($this->related['events']);
+        if ($numevents == 1) {
+            $title = get_string('dayeventsone', 'calendar', $userdate);
+        } else if ($numevents) {
+            $title = get_string('dayeventsmany', 'calendar', ['num' => $numevents, 'day' => $userdate]);
+        } else {
+            $title = get_string('dayeventsnone', 'calendar', $userdate);
+        }
+
+        return $title;
+    }
 }
index 6f30790..3920e03 100644 (file)
@@ -51,7 +51,7 @@
     }} data-type="event"{{!
     }} data-course-id="{{course.id}}"{{!
     }} data-event-id="{{id}}"{{!
-    }} class="event m-t-1"{{!
+    }} class="event mt-3"{{!
     }} data-event-component="{{component}}"{{!
     }} data-event-eventtype="{{eventtype}}"{{!
     }} data-eventtype-{{normalisedeventtype}}="1"{{!
index a88f65e..ba01dfe 100644 (file)
@@ -46,8 +46,9 @@
         <thead>
             <tr>
                 {{# daynames }}
-                <th class="header text-xs-center" aria-label="{{fullname}}">
-                    {{shortname}}
+                <th class="header text-xs-center">
+                    <span class="sr-only">{{fullname}}</span>
+                    <span aria-hidden="true">{{shortname}}</span>
                 </th>
                 {{/ daynames }}
             </tr>
@@ -71,6 +72,7 @@
                         data-region="day"
                         data-new-event-timestamp="{{neweventtimestamp}}">
                         <div class="d-none d-md-block hidden-phone text-xs-center">
+                            <span class="sr-only">{{daytitle}}</span>
                             {{#hasevents}}
                                 <a data-action="view-day-link" href="#" class="aalink day" aria-label="{{viewdaylinktitle}}"
                                     data-year="{{date.year}}" data-month="{{date.mon}}" data-day="{{mday}}"
@@ -78,7 +80,7 @@
                                     data-timestamp="{{timestamp}}">{{mday}}</a>
                             {{/hasevents}}
                             {{^hasevents}}
-                                {{mday}}
+                                <span aria-hidden="true">{{mday}}</span>
                             {{/hasevents}}
                             {{#hasevents}}
                                 <div data-region="day-content">
                             {{/hasevents}}
                         </div>
                         <div class="d-md-none hidden-desktop hidden-tablet">
+                            <span class="sr-only">{{daytitle}}</span>
                             {{#hasevents}}
                                 <a data-action="view-day-link" href="#" class="day aalink" aria-label="{{viewdaylinktitle}}"
                                     data-year="{{date.year}}" data-month="{{date.mon}}" data-day="{{mday}}"
                                     data-timestamp="{{timestamp}}">{{mday}}</a>
                             {{/hasevents}}
                             {{^hasevents}}
-                                    {{mday}}
+                                <span aria-hidden="true">{{mday}}</span>
                             {{/hasevents}}
                         </div>
                     </td>
index ff10a74..4ff2656 100644 (file)
@@ -78,8 +78,9 @@
         <thead>
           <tr>
                 {{# daynames }}
-                <th class="header text-xs-center" scope="col" aria-label="{{fullname}}">
-                    {{shortname}}
+                <th class="header text-xs-center">
+                    <span class="sr-only">{{fullname}}</span>
+                    <span aria-hidden="true">{{shortname}}</span>
                 </th>
                 {{/ daynames }}
             </tr>
                         This is the timestamp for this month.
                         }} data-day-timestamp="{{timestamp}}"{{!
                     }}>{{!
-                        }}{{#popovertitle}}
+                        }}<span class="sr-only">{{daytitle}}</span>
+                        {{#popovertitle}}
                             {{< core_calendar/minicalendar_day_link }}
                                 {{$day}}{{mday}}{{/day}}
                                 {{$url}}{{viewdaylink}}{{/url}}
                             {{/ core_calendar/minicalendar_day_link }}
                         {{/popovertitle}}{{!
                         }}{{^popovertitle}}
-                            {{mday}}
+                            <span aria-hidden="true">{{mday}}</span>
                         {{/popovertitle}}{{!
                     }}</td>
                 {{/days}}
index b0bfede..ddfff94 100644 (file)
@@ -81,7 +81,9 @@ class core_contenttype_content_testcase extends \advanced_testcase {
             'Name with symbols' => ['Follow us: @moodle', 'Follow us: @moodle'],
             'Name with tags' => ['This is <b>bold</b>', 'This is bold'],
             'Long name' => [str_repeat('a', 100), str_repeat('a', 100)],
-            'Too long name' => [str_repeat('a', 300), str_repeat('a', 255)]
+            'Too long name' => [str_repeat('a', 300), str_repeat('a', 255)],
+            'Empty name' => ['', 'Old name'],
+            'Blanks only' => ['  ', 'Old name'],
         ];
     }
 
index 1fee5be..c8ae908 100644 (file)
@@ -375,12 +375,14 @@ class core_contenttype_contenttype_testcase extends \advanced_testcase {
      */
     public function rename_content_provider() {
         return [
-            'Standard name' => ['New name', 'New name'],
-            'Name with digits' => ['Today is 17/04/2017', 'Today is 17/04/2017'],
-            'Name with symbols' => ['Follow us: @moodle', 'Follow us: @moodle'],
-            'Name with tags' => ['This is <b>bold</b>', 'This is bold'],
-            'Long name' => [str_repeat('a', 100), str_repeat('a', 100)],
-            'Too long name' => [str_repeat('a', 300), str_repeat('a', 255)]
+            'Standard name' => ['New name', 'New name', true],
+            'Name with digits' => ['Today is 17/04/2017', 'Today is 17/04/2017', true],
+            'Name with symbols' => ['Follow us: @moodle', 'Follow us: @moodle', true],
+            'Name with tags' => ['This is <b>bold</b>', 'This is bold', true],
+            'Long name' => [str_repeat('a', 100), str_repeat('a', 100), true],
+            'Too long name' => [str_repeat('a', 300), str_repeat('a', 255), true],
+            'Empty name' => ['', 'Test content ', false],
+            'Blanks only' => ['  ', 'Test content ', false],
         ];
     }
 
@@ -390,10 +392,11 @@ class core_contenttype_contenttype_testcase extends \advanced_testcase {
      * @dataProvider    rename_content_provider
      * @param   string  $newname    The name to set
      * @param   string   $expected   The name result
+     * @param   bool   $result   The bolean result expected when renaming
      *
      * @covers ::rename_content
      */
-    public function test_rename_content(string $newname, string $expected) {
+    public function test_rename_content(string $newname, string $expected, bool $result) {
         global $DB;
 
         $this->resetAfterTest();
@@ -414,9 +417,8 @@ class core_contenttype_contenttype_testcase extends \advanced_testcase {
 
         // Check the content is renamed as expected by a user with permission.
         $renamed = $contenttype->rename_content($content, $newname);
-        $this->assertTrue($renamed);
+        $this->assertEquals($result, $renamed);
         $record = $DB->get_record('contentbank_content', ['id' => $content->get_id()]);
-        $this->assertNotEquals($oldname, $record->name);
         $this->assertEquals($expected, $record->name);
     }
 
index 6a9ea67..d369bb2 100644 (file)
@@ -52,12 +52,14 @@ class rename_content_testcase extends \externallib_advanced_testcase {
      */
     public function rename_content_provider() {
         return [
-            'Standard name' => ['New name', 'New name'],
-            'Name with digits' => ['Today is 17/04/2017', 'Today is 17/04/2017'],
-            'Name with symbols' => ['Follow us: @moodle', 'Follow us: @moodle'],
-            'Name with tags' => ['This is <b>bold</b>', 'This is bold'],
-            'Long name' => [str_repeat('a', 100), str_repeat('a', 100)],
-            'Too long name' => [str_repeat('a', 300), str_repeat('a', 255)]
+            'Standard name' => ['New name', 'New name', true],
+            'Name with digits' => ['Today is 17/04/2017', 'Today is 17/04/2017', true],
+            'Name with symbols' => ['Follow us: @moodle', 'Follow us: @moodle', true],
+            'Name with tags' => ['This is <b>bold</b>', 'This is bold', true],
+            'Long name' => [str_repeat('a', 100), str_repeat('a', 100), true],
+            'Too long name' => [str_repeat('a', 300), str_repeat('a', 255), true],
+            'Empty name' => ['', 'Test content ', false],
+            'Blanks only' => ['  ', 'Test content ', false],
         ];
     }
 
@@ -66,11 +68,12 @@ class rename_content_testcase extends \externallib_advanced_testcase {
      *
      * @dataProvider    rename_content_provider
      * @param   string  $newname    The name to set
-     * @param   string   $expected   The name result
+     * @param   string   $expectedname   The name result
+     * @param   bool   $expectedresult   The bolean result expected when renaming
      *
      * @covers ::execute
      */
-    public function test_rename_content_with_permission(string $newname, string $expected) {
+    public function test_rename_content_with_permission(string $newname, string $expectedname, bool $expectedresult) {
         global $DB;
         $this->resetAfterTest();
 
@@ -91,10 +94,9 @@ class rename_content_testcase extends \externallib_advanced_testcase {
         // Call the WS and check the content is renamed as expected.
         $result = rename_content::execute($content->get_id(), $newname);
         $result = external_api::clean_returnvalue(rename_content::execute_returns(), $result);
-        $this->assertTrue($result['result']);
+        $this->assertEquals($expectedresult, $result['result']);
         $record = $DB->get_record('contentbank_content', ['id' => $content->get_id()]);
-        $this->assertNotEquals($oldname, $record->name);
-        $this->assertEquals($expected, $record->name);
+        $this->assertEquals($expectedname, $record->name);
 
         // Call the WS using an unexisting contentid and check an error is thrown.
         $this->expectException(\invalid_response_exception::class);
index 74fa987..5a896e7 100644 (file)
@@ -4381,15 +4381,10 @@ class core_course_external extends external_api {
         $coursecontext = context_course::instance($courseid);
         self::validate_context($coursecontext);
 
-        $pluginswithfunction = get_plugins_with_function('custom_chooser_footer', 'lib.php');
-        if ($pluginswithfunction) {
-            foreach ($pluginswithfunction as $plugintype => $plugins) {
-                foreach ($plugins as $pluginfunction) {
-                    $footerdata = $pluginfunction($courseid, $sectionid);
-                    break; // Only a single plugin can modify the footer.
-                }
-                break; // Only a single plugin can modify the footer.
-            }
+        $activeplugin = get_config('core', 'activitychooseractivefooter');
+
+        if ($activeplugin !== COURSE_CHOOSER_FOOTER_NONE) {
+            $footerdata = component_callback($activeplugin, 'custom_chooser_footer', [$courseid, $sectionid]);
             return [
                 'footer' => true,
                 'customfooterjs' => $footerdata->get_footer_js_file(),
index 7408941..f8bd189 100644 (file)
@@ -68,6 +68,9 @@ define('COURSE_DB_QUERY_LIMIT', 1000);
 /** Searching for all courses that have no value for the specified custom field. */
 define('COURSE_CUSTOMFIELD_EMPTY', -1);
 
+// Course activity chooser footer default display option.
+define('COURSE_CHOOSER_FOOTER_NONE', 'hidden');
+
 function make_log_url($module, $url) {
     switch ($module) {
         case 'course':
index 3b51f67..64232e2 100644 (file)
@@ -33,7 +33,7 @@
     }
 }}
 {{#activities}}
-<div class="row mb-1 row-fluid">
+<div class="row mb-1">
     <div class="activityinstance col-6">
         <div class="mod-indent-outer"></div>
         <div>
@@ -48,7 +48,7 @@
         </div>
     </div>
     <div class="activity-completionstatus col-6" id="completionstatus_{{cmid}}">
-        <div class="col-sm-1  p-l-0">
+        <div class="col-sm-1  pl-0">
             {{#completionstatus.icon}}
                 {{{completionstatus.icon}}}
             {{/completionstatus.icon}}
@@ -56,7 +56,7 @@
                 <span class="mr-3"></span>
             {{/completionstatus.icon}}
         </div>
-        <div class="col-sm-11  p-l-0">
+        <div class="col-sm-11  pl-0">
             <span class="text-muted muted">{{{completionstatus.string}}}</span>
         </div>
     </div>
index 4a28026..8043be9 100644 (file)
@@ -62,7 +62,7 @@
     <div class="topics">
         {{#sections}}
                 <div class="mb-1">
-                    <div class="row mb-1 row-fluid">
+                    <div class="row mb-1">
                         <div class="col-sm-12">
                             <input type="checkbox" data-section-master="{{sectionnumber}}" class="mr-1" aria-label="{{#str}}checkallsection, completion, {{{name}}}{{/str}}">
                             <h3 class="d-inline-block">{{{name}}}</h3>
index b24636c..5e6c7fb 100644 (file)
@@ -66,7 +66,7 @@
                 </a>
                 {{^visible}}
                     <div class="d-flex flex-wrap">
-                        <span class="tag tag-info">{{#str}} hiddenfromstudents {{/str}}</span>
+                        <span class="badge badge-info">{{#str}} hiddenfromstudents {{/str}}</span>
                     </div>
                 {{/visible}}
             </div>
index dd2b39f..f76da9f 100644 (file)
@@ -60,7 +60,7 @@
         {{#modules}}
             {{#canmanage}}
              <div class="mb-1">
-                <div class="row mb-1 row-fluid">
+                <div class="row mb-1">
                     <div class="col-6">
                         <label class="accesshide" for="modtype_{{id}}">{{#str}}select, core_completion{{/str}} {{formattedname}}</label>
                         <input id="modtype_{{id}}" type="checkbox" class="mr-1" name="modids[]" value="{{id}}" aria-label="{{#str}}checkactivity, completion, {{{formattedname}}}{{/str}}">
@@ -68,7 +68,7 @@
                         <span>{{{formattedname}}}</span>
                     </div>
                     <div class="activity-completionstatus col-6">
-                        <div class="col-sm-1 p-l-0">
+                        <div class="col-sm-1 pl-0">
                             {{#completionstatus.icon}}
                                 {{{completionstatus.icon}}}
                             {{/completionstatus.icon}}
@@ -76,7 +76,7 @@
                                 <span class="mr-3"></span>
                             {{/completionstatus.icon}}
                         </div>
-                        <div class="col-sm-11 p-l-0">
+                        <div class="col-sm-11 pl-0">
                             <span class="text-muted muted">{{{completionstatus.string}}}</span>
                         </div>
                     </div>
@@ -127,4 +127,4 @@ require([
         }
     });
 });
-{{/js}}
\ No newline at end of file
+{{/js}}
index 082cef6..312eef2 100644 (file)
         <?php
         if (has_capability('moodle/grade:manageoutcomes', $context)) {
         ?>
-        <td class="p-l-1 p-r-1">
-            <div class="m-y-1">
+        <td class="pl-3 pr-3">
+            <div class="my-3">
                 <input name="add" class="btn btn-secondary" id="add" type="submit" value="<?php echo $OUTPUT->larrow() . ' ' .
                     get_string('add'); ?>" title="<?php print_string('add'); ?>" />
             </div>
-            <div class="m-y-1">
+            <div class="my-3">
                 <input name="remove" class="btn btn-secondary" id="remove" type="submit" value="<?php echo get_string('remove') .
                     ' ' . $OUTPUT->rarrow(); ?>" title="<?php print_string('remove'); ?>" />
             </div>
index 2f563a2..58f405b 100644 (file)
@@ -49,30 +49,37 @@ $PAGE->set_pagelayout('admin');
 
 $returnurl = new moodle_url('/group/index.php', array('id'=>$id));
 
-$mform_post = new groups_import_form(null, array('id'=>$id));
+$importform = new groups_import_form(null, ['id' => $id]);
 
 // If a file has been uploaded, then process it
-if ($mform_post->is_cancelled()) {
+if ($importform->is_cancelled()) {
     redirect($returnurl);
 
-} else if ($mform_post->get_data()) {
+} else if ($formdata = $importform->get_data()) {
     echo $OUTPUT->header();
 
-    $csv_encode = '/\&\#44/';
-    if (isset($CFG->CSV_DELIMITER)) {
-        $csv_delimiter = $CFG->CSV_DELIMITER;
+    $text = $importform->get_file_content('userfile');
+    $text = preg_replace('!\r\n?!', "\n", $text);
 
-        if (isset($CFG->CSV_ENCODE)) {
-            $csv_encode = '/\&\#' . $CFG->CSV_ENCODE . '/';
-        }
-    } else {
-        $csv_delimiter = ",";
+    $rawlines = explode("\n", $text);
+
+    require_once($CFG->libdir . '/csvlib.class.php');
+    $importid = csv_import_reader::get_new_iid('groupimport');
+    $csvimport = new csv_import_reader($importid, 'groupimport');
+    $delimiter = $formdata->delimiter_name;
+    $encoding = $formdata->encoding;
+    $readcount = $csvimport->load_csv_content($text, $encoding, $delimiter);
+
+    if ($readcount === false) {
+        print_error('csvfileerror', 'error', $PAGE->url, $csvimport->get_error());
+    } else if ($readcount == 0) {
+        print_error('csvemptyfile', 'error', $PAGE->url, $csvimport->get_error());
+    } else if ($readcount == 1) {
+        print_error('csvnodata', 'error', $PAGE->url);
     }
 
-    $text = $mform_post->get_file_content('userfile');
-    $text = preg_replace('!\r\n?!',"\n",$text);
+    $csvimport->init();
 
-    $rawlines = explode("\n", $text);
     unset($text);
 
     // make arrays of valid fields for error checking
@@ -88,12 +95,12 @@ if ($mform_post->is_cancelled()) {
         );
 
     // --- get header (field names) ---
-    $header = explode($csv_delimiter, array_shift($rawlines));
+    $header = explode($csvimport::get_delimiter($delimiter), array_shift($rawlines));
     // check for valid field names
     foreach ($header as $i => $h) {
         $h = trim($h); $header[$i] = $h; // remove whitespace
         if (!(isset($required[$h]) or isset($optionalDefaults[$h]) or isset($optional[$h]))) {
-                print_error('invalidfieldname', 'error', 'import.php?id='.$id, $h);
+                print_error('invalidfieldname', 'error', $PAGE->url, $h);
             }
         if (isset($required[$h])) {
             $required[$h] = 2;
@@ -102,32 +109,28 @@ if ($mform_post->is_cancelled()) {
     // check for required fields
     foreach ($required as $key => $value) {
         if ($value < 2) {
-            print_error('fieldrequired', 'error', 'import.php?id='.$id, $key);
+            print_error('fieldrequired', 'error', $PAGE->url, $key);
         }
     }
     $linenum = 2; // since header is line 1
 
-    foreach ($rawlines as $rawline) {
+    while ($line = $csvimport->next()) {
 
         $newgroup = new stdClass();//to make Martin happy
         foreach ($optionalDefaults as $key => $value) {
             $newgroup->$key = current_language(); //defaults to current language
         }
-        //Note: commas within a field should be encoded as &#44 (for comma separated csv files)
-        //Note: semicolon within a field should be encoded as &#59 (for semicolon separated csv files)
-        $line = explode($csv_delimiter, $rawline);
         foreach ($line as $key => $value) {
-            //decode encoded commas
-            $record[$header[$key]] = preg_replace($csv_encode, $csv_delimiter, trim($value));
+            $record[$header[$key]] = trim($value);
         }
-        if (trim($rawline) !== '') {
+        if (trim(implode($line)) !== '') {
             // add a new group to the database
 
             // add fields to object $user
             foreach ($record as $name => $value) {
                 // check for required values
                 if (isset($required[$name]) and !$value) {
-                    print_error('missingfield', 'error', 'import.php?id='.$id, $name);
+                    print_error('missingfield', 'error', $PAGE->url, $name);
                 } else if ($name == "groupname") {
                     $newgroup->name = $value;
                 } else {
@@ -232,6 +235,7 @@ if ($mform_post->is_cancelled()) {
         }
     }
 
+    $csvimport->close();
     echo $OUTPUT->single_button($returnurl, get_string('continue'), 'get');
     echo $OUTPUT->footer();
     die;
@@ -240,5 +244,5 @@ if ($mform_post->is_cancelled()) {
 /// Print the form
 echo $OUTPUT->header();
 echo $OUTPUT->heading_with_help($strimportgroups, 'importgroups', 'core_group');
-$mform_post ->display();
+$importform->display();
 echo $OUTPUT->footer();
index e4914ff..30e6d92 100644 (file)
@@ -77,7 +77,7 @@
 }}
 <form id="groupeditform" action="index.php" method="post">
     <div class="container-fluid groupmanagementtable">
-        <div class="row row-fluid rtl-compatible">
+        <div class="row rtl-compatible">
             <div class="col-md-6 mb-1">
                 <input type="hidden" name="id" value="{{courseid}}">
                 <div class="form-group">
index 6f1c4f9..e10e573 100644 (file)
@@ -52,6 +52,9 @@ $string['courses'] = 'Courses';
 $string['customexport'] = 'Custom range ({$a->timestart} - {$a->timeend})';
 $string['daily'] = 'Daily';
 $string['day'] = 'Day';
+$string['dayeventsmany'] = '{$a->num} events, {$a->day}';
+$string['dayeventsnone'] = 'No events, {$a}';
+$string['dayeventsone'] = '1 event, {$a}';
 $string['daynext'] = 'Next day';
 $string['dayprev'] = 'Previous day';
 $string['dayviewfor'] = 'Day view for:';
index 0a19d43..156ebab 100644 (file)
@@ -25,6 +25,9 @@
 $string['activitychoosercategory'] = 'Activity chooser';
 $string['activitychooserrecommendations'] = 'Recommended activities';
 $string['activitychoosersettings'] = 'Activity chooser settings';
+$string['activitychooseractivefooter'] = 'Activity chooser footer';
+$string['activitychooseractivefooter_desc'] = 'The activity chooser can support plugins that add items to the footer.';
+$string['activitychooserhidefooter'] = 'No footer';
 $string['activitychoosertabmode'] = 'Activity chooser tabs';
 $string['activitychoosertabmode_desc'] = "The activity chooser enables a teacher to easily select activities and resources to add to their course. This setting determines which tabs should be displayed in it. Note that the starred tab is only displayed for a user if they have starred one or more activities and the recommended tab is only displayed if a site administrator has specified some recommended activities.";
 $string['activitychoosertabmodeone'] = 'Starred, All, Activities, Resources, Recommended';
index afa81ba..6a72879 100644 (file)
@@ -195,10 +195,12 @@ $string['coursemisconf'] = 'Course is misconfigured';
 $string['courserequestdisabled'] = 'Sorry, but course requests have been disabled by the administrator.';
 $string['csvcolumnduplicates'] = 'Duplicate columns detected';
 $string['csvemptyfile'] = 'The CSV file is empty';
+$string['csvfileerror'] = 'There is something wrong with the format of the CSV file. Please check the number of headings and columns match, and that the delimiter and file encoding are correct: {$a}';
 $string['csvfewcolumns'] = 'Not enough columns, please verify the delimiter setting';
 $string['csvinvalidcols'] = '<b>Invalid CSV file:</b> First line must include "Header Fields" and the file must be type of <br />"Expanded Fields/Comma Separated"<br />or<br /> "Expanded Fields with CAVV Result Code/Comma Separated"';
 $string['csvinvalidcolsnum'] = 'Invalid CSV file - each line must include 49 or 70 fields';
 $string['csvloaderror'] = 'An error occurred while loading the CSV file: {$a}';
+$string['csvnodata'] = 'Invalid CSV file - The CSV file has headers but does not contain any data.';
 $string['csvweirdcolumns'] = 'Invalid CSV file format - number of columns is not constant!';
 $string['dbconnectionfailed'] = '<p>Error: Database connection failed</p>
 <p>It is possible that the database is overloaded or otherwise not running properly.</p>
index 352a086..78228c0 100644 (file)
@@ -1232,7 +1232,7 @@ function badges_verify_backpack(int $backpackid) {
 
             $message = get_string('sitebackpackwarning', 'badges', ['url' => $backpackurl, 'warning' => $warning]);
             $icon = $OUTPUT->pix_icon('i/warning', get_string('warning', 'moodle'));
-            return $OUTPUT->container($icon . $message, 'text-error');
+            return $OUTPUT->container($icon . $message, 'text-danger');
         }
     }
 
index e537137..9702d43 100644 (file)
@@ -364,7 +364,7 @@ class core_date {
             'Dateline Standard Time' => 'Etc/GMT+12',
             'Hawaiian Standard Time' => 'Pacific/Honolulu',
             'Alaskan Standard Time' => 'America/Anchorage',
-            'Pacific Standard Time (Mexico)' => 'America/Santa_Isabel',
+            'Pacific Standard Time (Mexico)' => 'America/Tijuana',
             'Pacific Standard Time' => 'America/Los_Angeles',
             'US Mountain Standard Time' => 'America/Phoenix',
             'Mountain Standard Time (Mexico)' => 'America/Chihuahua',
@@ -376,8 +376,8 @@ class core_date {
             'SA Pacific Standard Time' => 'America/Bogota',
             'S.A. Pacific Standard Time' => 'America/Bogota',
             'Eastern Standard Time' => 'America/New_York',
-            'US Eastern Standard Time' => 'America/Indianapolis',
-            'U.S. Eastern Standard Time' => 'America/Indianapolis',
+            'US Eastern Standard Time' => 'America/Indiana/Indianapolis',
+            'U.S. Eastern Standard Time' => 'America/Indiana/Indianapolis',
             'Venezuela Standard Time' => 'America/Caracas',
             'Paraguay Standard Time' => 'America/Asuncion',
             'Atlantic Standard Time' => 'America/Halifax',
@@ -389,7 +389,7 @@ class core_date {
             'Newfoundland Standard Time' => 'America/St_Johns',
             'Newfoundland and Labrador Standard Time' => 'America/St_Johns',
             'E. South America Standard Time' => 'America/Sao_Paulo',
-            'Argentina Standard Time' => 'America/Buenos_Aires',
+            'Argentina Standard Time' => 'America/Argentina/Buenos_Aires',
             'SA Eastern Standard Time' => 'America/Cayenne',
             'S.A. Eastern Standard Time' => 'America/Cayenne',
             'Greenland Standard Time' => 'America/Godthab',
@@ -435,11 +435,11 @@ class core_date {
             'Pakistan Standard Time' => 'Asia/Karachi',
             'India Standard Time' => 'Asia/Kolkata', // PHP and Windows differ in spelling.
             'Sri Lanka Standard Time' => 'Asia/Colombo',
-            'Nepal Standard Time' => 'Asia/Katmandu',
+            'Nepal Standard Time' => 'Asia/Kathmandu',
             'Central Asia Standard Time' => 'Asia/Almaty',
             'Bangladesh Standard Time' => 'Asia/Dhaka',
             'N. Central Asia Standard Time' => 'Asia/Novosibirsk',
-            'Myanmar Standard Time' => 'Asia/Rangoon',
+            'Myanmar Standard Time' => 'Asia/Yangon',
             'SE Asia Standard Time' => 'Asia/Bangkok',
             'S.E. Asia Standard Time' => 'Asia/Bangkok',
             'North Asia Standard Time' => 'Asia/Krasnoyarsk',
@@ -480,34 +480,106 @@ class core_date {
             'Armenian Standard Time' => 'Asia/Yerevan',
             'Kamchatka Standard Time' => 'Asia/Kamchatka',
 
-            // A lot more bad legacy time zones.
+            // A lot more bad legacy (deprecated) time zones.
+            'Australia/ACT' => 'Australia/Sydney',
+            'Australia/LHI' => 'Australia/Lord_Howe',
+            'Australia/North' => 'Australia/Darwin',
+            'Australia/NSW' => 'Australia/Sydney',
+            'Australia/Queensland' => 'Australia/Brisbane',
+            'Australia/South' => 'Australia/Adelaide',
+            'Australia/Tasmania' => 'Australia/Hobart',
+            'Australia/Victoria' => 'Australia/Melbourne',
+            'Australia/West' => 'Australia/Perth',
+            'Brazil/Acre' => 'America/Rio_Branco',
+            'Brazil/DeNoronha' => 'America/Noronha',
+            'Brazil/East' => 'America/Sao_Paulo',
+            'Brazil/West' => 'America/Manaus',
+            'Canada/Atlantic' => 'America/Halifax',
+            'Canada/Central' => 'America/Winnipeg',
+            'Canada/Eastern' => 'America/Toronto',
+            'Canada/Mountain' => 'America/Edmonton',
+            'Canada/Newfoundland' => 'America/St_Johns',
+            'Canada/Pacific' => 'America/Vancouver',
+            'Canada/Saskatchewan' => 'America/Regina',
+            'Canada/Yukon' => 'America/Whitehorse',
+            'CDT' => 'America/Chicago',
             'CET' => 'Europe/Berlin',
             'Central European Time' => 'Europe/Berlin',
-            'CST' => 'America/Chicago',
             'Central Time' => 'America/Chicago',
-            'CST6CDT' => 'America/Chicago',
-            'CDT' => 'America/Chicago',
+            'Chile/Continental' => 'America/Santiago',
+            'Chile/EasterIsland' => 'Pacific/Easter',
             'China Time' => 'Asia/Shanghai',
+            'CST' => 'America/Chicago',
+            'CST6CDT' => 'America/Chicago',
+            'Cuba' => 'America/Havana',
             'EDT' => 'America/New_York',
-            'EST' => 'America/New_York',
+            'EET' => 'Europe/Kiev',
+            'Egypt' => 'Africa/Cairo',
+            'Eire' => 'Europe/Dublin',
+            'EST' => 'America/Cancun',
             'EST5EDT' => 'America/New_York',
             'Eastern Time' => 'America/New_York',
-            'IST' => 'Asia/Kolkata',
+            'Etc/Greenwich' => 'Etc/GMT',
+            'Etc/UCT' => 'Etc/UTC',
+            'Etc/Universal' => 'Etc/UTC',
+            'Etc/Zulu' => 'Etc/UTC',
+            'FET' => 'Europe/Minsk',
+            'GB' => 'Europe/London',
+            'GB-Eire' => 'Europe/London',
+            'Greenwich' => 'Etc/GMT',
+            'Hongkong' => 'Asia/Hong_Kong',
+            'HST' => 'Pacific/Honolulu',
+            'Iceland' => 'Atlantic/Reykjavik',
             'India Time' => 'Asia/Kolkata',
-            'JST' => 'Asia/Tokyo',
-            'Japan Time' => 'Asia/Tokyo',
+            'Iran' => 'Asia/Tehran',
+            'Israel' => 'Asia/Jerusalem',
+            'IST' => 'Asia/Kolkata',
+            'Jamaica' => 'America/Jamaica',
+            'Japan' => 'Asia/Tokyo',
             'Japan Standard Time' => 'Asia/Tokyo',
+            'Japan Time' => 'Asia/Tokyo',
+            'JST' => 'Asia/Tokyo',
+            'Kwajalein' => 'Pacific/Kwajalein',
+            'Libya' => 'Africa/Tripoli',
             'MDT' => 'America/Denver',
-            'MST' => 'America/Denver',
+            'MET' => 'Europe/Paris',
+            'Mexico/BajaNorte' => 'America/Tijuana',
+            'Mexico/BajaSur' => 'America/Mazatlan',
+            'Mexico/General' => 'America/Mexico_City',
+            'MST' => 'America/Phoenix',
             'MST7MDT' => 'America/Denver',
+            'Navajo' => 'America/Denver',
+            'NZ' => 'Pacific/Auckland',
+            'NZ-CHAT' => 'Pacific/Chatham',
+            'Pacific Time' => 'America/Los_Angeles',
             'PDT' => 'America/Los_Angeles',
+            'Poland' => 'Europe/Warsaw',
+            'Portugal' => 'Europe/Lisbon',
+            'PRC' => 'Asia/Shanghai',
             'PST' => 'America/Los_Angeles',
-            'Pacific Time' => 'America/Los_Angeles',
             'PST8PDT' => 'America/Los_Angeles',
-            'HST' => 'Pacific/Honolulu',
+            'ROC' => 'Asia/Taipei',
+            'ROK' => 'Asia/Seoul',
+            'Singapore' => 'Asia/Singapore',
+            'Turkey' => 'Europe/Istanbul',
+            'UCT' => 'Etc/UTC',
+            'Universal' => 'Etc/UTC',
+            'US/Alaska' => 'America/Anchorage',
+            'US/Aleutian' => 'America/Adak',
+            'US/Arizona' => 'America/Phoenix',
+            'US/Central' => 'America/Chicago',
+            'US/East-Indiana' => 'America/Indiana/Indianapolis',
+            'US/Eastern' => 'America/New_York',
+            'US/Hawaii' => 'Pacific/Honolulu',
+            'US/Indiana-Starke' => 'America/Indiana/Knox',
+            'US/Michigan' => 'America/Detroit',
+            'US/Mountain' => 'America/Denver',
+            'US/Pacific' => 'America/Los_Angeles',
+            'US/Pacific-New' => 'America/Los_Angeles',
+            'US/Samoa' => 'Pacific/Pago_Pago',
+            'W-SU' => 'Europe/Moscow',
             'WET' => 'Europe/London',
-            'EET' => 'Europe/Kiev',
-            'FET' => 'Europe/Minsk',
+            'Zulu' => 'Etc/UTC',
 
             // Some UTC variations.
             'UTC-01' => 'Etc/GMT+1',
@@ -525,8 +597,57 @@ class core_date {
             'Etc/GMT-0' => 'Etc/GMT',
             'Etc/GMT0' => 'Etc/GMT',
 
-            // And lastly some alternative city spelling.
+            // Link old timezone names with their new names.
+            'Africa/Asmera' => 'Africa/Asmara',
+            'Africa/Timbuktu' => 'Africa/Abidjan',
+            'America/Argentina/ComodRivadavia' => 'America/Argentina/Catamarca',
+            'America/Atka' => 'America/Adak',
+            'America/Buenos_Aires' => 'America/Argentina/Buenos_Aires',
+            'America/Catamarca' => 'America/Argentina/Catamarca',
+            'America/Coral_Harbour' => 'America/Atikokan',
+            'America/Cordoba' => 'America/Argentina/Cordoba',
+            'America/Ensenada' => 'America/Tijuana',
+            'America/Fort_Wayne' => 'America/Indiana/Indianapolis',
+            'America/Indianapolis' => 'America/Indiana/Indianapolis',
+            'America/Jujuy' => 'America/Argentina/Jujuy',
+            'America/Knox_IN' => 'America/Indiana/Knox',
+            'America/Louisville' => 'America/Kentucky/Louisville',
+            'America/Mendoza' => 'America/Argentina/Mendoza',
+            'America/Montreal' => 'America/Toronto',
+            'America/Porto_Acre' => 'America/Rio_Branco',
+            'America/Rosario' => 'America/Argentina/Cordoba',
+            'America/Santa_Isabel' => 'America/Tijuana',
+            'America/Shiprock' => 'America/Denver',
+            'America/Virgin' => 'America/Port_of_Spain',
+            'Antarctica/South_Pole' => 'Pacific/Auckland',
+            'Asia/Ashkhabad' => 'Asia/Ashgabat',
             'Asia/Calcutta' => 'Asia/Kolkata',
+            'Asia/Chongqing' => 'Asia/Shanghai',
+            'Asia/Chungking' => 'Asia/Shanghai',
+            'Asia/Dacca' => 'Asia/Dhaka',
+            'Asia/Harbin' => 'Asia/Shanghai',
+            'Asia/Istanbul' => 'Europe/Istanbul',
+            'Asia/Kashgar' => 'Asia/Urumqi',
+            'Asia/Katmandu' => 'Asia/Kathmandu',
+            'Asia/Macao' => 'Asia/Macau',
+            'Asia/Rangoon' => 'Asia/Yangon',
+            'Asia/Saigon' => 'Asia/Ho_Chi_Minh',
+            'Asia/Tel_Aviv' => 'Asia/Jerusalem',
+            'Asia/Thimbu' => 'Asia/Thimphu',
+            'Asia/Ujung_Pandang' => 'Asia/Makassar',
+            'Asia/Ulan_Bator' => 'Asia/Ulaanbaatar',
+            'Atlantic/Faeroe' => 'Atlantic/Faroe',
+            'Atlantic/Jan_Mayen' => 'Europe/Oslo',
+            'Australia/Canberra' => 'Australia/Sydney',
+            'Australia/Yancowinna' => 'Australia/Broken_Hill',
+            'Europe/Belfast' => 'Europe/London',
+            'Europe/Nicosia' => 'Asia/Nicosia',
+            'Europe/Tiraspol' => 'Europe/Chisinau',
+            'Pacific/Johnston' => 'Pacific/Honolulu',
+            'Pacific/Ponape' => 'Pacific/Pohnpei',
+            'Pacific/Samoa' => 'Pacific/Pago_Pago',
+            'Pacific/Truk' => 'Pacific/Chuuk',
+            'Pacific/Yap' => 'Pacific/Chuuk',
         );
 
         // Legacy GMT fallback.
index 8656f0e..a93deb0 100644 (file)
@@ -30,9 +30,9 @@
     margin: 0 0.5em;
 }
 
-.atto_image_button_text-top.img-responsive,
-.atto_image_button_middle.img-responsive,
-.atto_image_button_text-bottom.img-responsive {
+.atto_image_button_text-top.img-fluid,
+.atto_image_button_middle.img-fluid,
+.atto_image_button_text-bottom.img-fluid {
     /* If the image is display: block then linking the image to URLs won't work. */
     display: inline-block;
     max-width: calc(100% - 1em);
index e4465fd..606e57f 100644 (file)
Binary files a/lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button-debug.js and b/lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button-debug.js differ
index 8c75af1..4520cac 100644 (file)
Binary files a/lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button-min.js and b/lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button-min.js differ
index e4465fd..606e57f 100644 (file)
Binary files a/lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button.js and b/lib/editor/atto/plugins/table/yui/build/moodle-atto_table-button/moodle-atto_table-button.js differ
index 884e6bc..3b2d4d1 100644 (file)
@@ -41,14 +41,14 @@ var COMPONENT = 'atto_table',
     },
     TEMPLATE = '' +
         '<form class="{{CSS.FORM}}">' +
-            '<div class="mb-1 form-group row-fluid">' +
+            '<div class="mb-1 form-group row">' +
             '<div class="col-sm-4">' +
             '<label for="{{elementid}}_atto_table_caption">{{get_string "caption" component}}</label>' +
             '</div><div class="col-sm-8">' +
             '<input type="text" class="form-control {{CSS.CAPTION}}" id="{{elementid}}_atto_table_caption" required />' +
             '</div>' +
             '</div>' +
-            '<div class="mb-1 form-group row-fluid">' +
+            '<div class="mb-1 form-group row">' +
             '<div class="col-sm-4">' +
             '<label for="{{elementid}}_atto_table_captionposition">' +
             '{{get_string "captionposition" component}}</label>' +
@@ -60,7 +60,7 @@ var COMPONENT = 'atto_table',
             '</select>' +
             '</div>' +
             '</div>' +
-            '<div class="mb-1 form-group row-fluid">' +
+            '<div class="mb-1 form-group row">' +
             '<div class="col-sm-4">' +
             '<label for="{{elementid}}_atto_table_headers">{{get_string "headers" component}}</label>' +
             '</div><div class="col-sm-8">' +
@@ -72,7 +72,7 @@ var COMPONENT = 'atto_table',
             '</div>' +
             '</div>' +
             '{{#if nonedit}}' +
-                '<div class="mb-1 form-group row-fluid">' +
+                '<div class="mb-1 form-group row">' +
                 '<div class="col-sm-4">' +
                 '<label for="{{elementid}}_atto_table_rows">{{get_string "numberofrows" component}}</label>' +
                 '</div><div class="col-sm-8">' +
@@ -80,7 +80,7 @@ var COMPONENT = 'atto_table',
                 'id="{{elementid}}_atto_table_rows" size="8" min="1" max="50"/>' +
                 '</div>' +
                 '</div>' +
-                '<div class="mb-1 form-group row-fluid">' +
+                '<div class="mb-1 form-group row">' +
                 '<div class="col-sm-4">' +
                 '<label for="{{elementid}}_atto_table_columns" ' +
                 '>{{get_string "numberofcolumns" component}}</label>' +
@@ -95,7 +95,7 @@ var COMPONENT = 'atto_table',
                 '<fieldset>' +
                 '<legend class="mdl-align">{{get_string "appearance" component}}</legend>' +
                 '{{#if allowBorders}}' +
-                    '<div class="mb-1 form-group row-fluid">' +
+                    '<div class="mb-1 form-group row">' +
                     '<div class="col-sm-4">' +
                     '<label for="{{elementid}}_atto_table_borders">{{get_string "borders" component}}</label>' +
                     '</div><div class="col-sm-8">' +
@@ -106,7 +106,7 @@ var COMPONENT = 'atto_table',
                     '</select>' +
                     '</div>' +
                     '</div>' +
-                    '<div class="mb-1 form-group row-fluid">' +
+                    '<div class="mb-1 form-group row">' +
                     '<div class="col-sm-4">' +
                     '<label for="{{elementid}}_atto_table_borderstyle">' +
                     '{{get_string "borderstyles" component}}</label>' +
@@ -119,7 +119,7 @@ var COMPONENT = 'atto_table',
                     '</select>' +
                     '</div>' +
                     '</div>' +
-                    '<div class="mb-1 form-group row-fluid">' +
+                    '<div class="mb-1 form-group row">' +
                     '<div class="col-sm-4">' +
                     '<label for="{{elementid}}_atto_table_bordersize">' +
                     '{{get_string "bordersize" component}}</label>' +
@@ -132,7 +132,7 @@ var COMPONENT = 'atto_table',
                     '</div>' +
                     '</div>' +
                     '</div>' +
-                    '<div class="mb-1 form-group row-fluid">' +
+                    '<div class="mb-1 form-group row">' +
                     '<div class="col-sm-4">' +
                     '<label for="{{elementid}}_atto_table_bordercolour">' +
                     '{{get_string "bordercolour" component}}</label>' +
@@ -159,7 +159,7 @@ var COMPONENT = 'atto_table',
                     '</div>' +
                 '{{/if}}' +
                 '{{#if allowBackgroundColour}}' +
-                    '<div class="mb-1 form-group row-fluid">' +
+                    '<div class="mb-1 form-group row">' +
                     '<div class="col-sm-4">' +
                     '<label for="{{elementid}}_atto_table_backgroundcolour">' +
                     '{{get_string "backgroundcolour" component}}</label>' +
@@ -187,7 +187,7 @@ var COMPONENT = 'atto_table',
                     '</div>' +
                 '{{/if}}' +
                 '{{#if allowWidth}}' +
-                    '<div class="mb-1 form-group row-fluid">' +
+                    '<div class="mb-1 form-group row">' +
                     '<div class="col-sm-4">' +
                     '<label for="{{elementid}}_atto_table_width">' +
                     '{{get_string "width" component}}</label>' +
index 5fe7586..e766d16 100644 (file)
@@ -813,7 +813,7 @@ M.form_filemanager.init = function(Y, options) {
                         var message = '';
                         var confirmmsg = M.util.get_string('confirmrenamefile', 'repository', fileinfo.refcount);
                         dialog_options.message = message.concat('<p>', confirmmsg, '</p>',
-                            '<ul class="p-x-2">', warnings, '</ul>');
+                            '<ul class="px-5">', warnings, '</ul>');
                         this.show_confirm_dialog(dialog_options);
                         return;
                     }
index c813362..74e7c80 100644 (file)
@@ -788,7 +788,7 @@ class core_renderer extends renderer_base {
             $timeleft = $CFG->maintenance_later - time();
             // If timeleft less than 30 sec, set the class on block to error to highlight.
             $errorclass = ($timeleft < 30) ? 'alert-error alert-danger' : 'alert-warning';
-            $output .= $this->box_start($errorclass . ' moodle-has-zindex maintenancewarning m-a-1 alert');
+            $output .= $this->box_start($errorclass . ' moodle-has-zindex maintenancewarning m-3 alert');
             $a = new stdClass();
             $a->hour = (int)($timeleft / 3600);
             $a->min = (int)(($timeleft / 60) % 60);
@@ -1979,7 +1979,7 @@ class core_renderer extends renderer_base {
 
         $output = $this->box_start('generalbox modal modal-dialog modal-in-page show', 'notice', $attributes);
         $output .= $this->box_start('modal-content', 'modal-content');
-        $output .= $this->box_start('modal-header p-x-1', 'modal-header');
+        $output .= $this->box_start('modal-header px-3', 'modal-header');
         $output .= html_writer::tag('h4', get_string('confirm'));
         $output .= $this->box_end();
         $attributes = [
index 73bf40a..7ee6759 100644 (file)
@@ -43,7 +43,7 @@
                      <div class="card-title">
                         <h3>{{#str}}considereddigitalminor{{/str}}</h3>
                     </div>
-                    <div class="p-t-1 p-b-2">
+                    <div class="pt-3 pb-5">
                         <p>{{#str}}digitalminor_desc{{/str}}</p>
                         <p class="mb-0">{{{supportname}}}</p>
                         <p class="mb-0">{{{supportemail}}}</p>
index 7f01067..80b8e47 100644 (file)
@@ -28,7 +28,7 @@
             <div class="fp-formset">
                 <div class="fp-file form-group">
                     <label>{{#str}}attachment, repository{{/str}}</label>
-                    <div class="p-x-1">
+                    <div class="px-3">
                         <input  type="file"/>
                     </div>
                 </div>
index 4e81345..e3f44d6 100644 (file)
@@ -806,7 +806,7 @@ EXPECTED;
 
         $html = "<p>This is a test.</p><p><img src=\"${url1}\" alt=\"\" role=\"presentation\"></p>
                 <br>Test content.<p></p><p><img src=\"{$url2}\" alt=\"\" width=\"2048\" height=\"1536\"
-                role=\"presentation\" class=\"img-responsive atto_image_button_text-bottom\"><br></p>";
+                role=\"presentation\" class=\"img-fluid atto_image_button_text-bottom\"><br></p>";
         $draftareas = array(
             array(
                 'urlbase' => 'draftfile.php',
index 33e3ab6..8640609 100644 (file)
@@ -42,7 +42,7 @@
         role="region"
 >
     <div class="container-fluid">
-        <div class="row-fluid h-100 no-gutters">
+        <div class="row h-100 no-gutters">
             <div class="col-4 d-flex flex-column conversationcontainer">
                 <div class="border-right h-100">
                     <div class="panel-header-container" data-region="panel-header-container">
@@ -81,4 +81,4 @@
     var root = $('#message-index-{{uniqid}}');
     MessageDrawer.init(root, '{{uniqid}}', true, {{{route}}});
     });
-{{/js}}
\ No newline at end of file
+{{/js}}
index 52a63bd..88b9aaf 100644 (file)
@@ -65,7 +65,7 @@
         <th>{{displayname}}</th>
         <td class="align-bottom">
             <div class="container-fluid">
-                <div class="row-fluid">
+                <div class="row">
                     <div class="span6 col-6">
                         {{#str}} loggedin, message {{/str}}
                         {{#onlinehelphtml}}{{{.}}}{{/onlinehelphtml}}
index 2b5f08b..927e5e2 100644 (file)
@@ -68,7 +68,7 @@
             <div class="disabled-message">{{#str}} disabled, question {{/str}}</div>
             <form>
                 <div class="container-fluid">
-                    <div class="row-fluid">
+                    <div class="row">
                         <div class="span6 col-6">
                             {{#loggedin}}
                                 {{< core/hover_tooltip }}
index 2d9381e..0700fba 100644 (file)
@@ -72,7 +72,7 @@
     {{#processors}}
         <td class="align-bottom">
             <div class="container-fluid">
-                <div class="row-fluid">
+                <div class="row">
                     <div class="col-6">
                         {{#str}} loggedin, message {{/str}}
                         {{#onlinehelphtml}}{{{.}}}{{/onlinehelphtml}}
index 7770700..3318f08 100644 (file)
@@ -66,7 +66,7 @@
                 <div class="disabled-message">{{#str}} disabled, question {{/str}}</div>
                 <form>
                     <div class="container-fluid">
-                        <div class="row-fluid">
+                        <div class="row">
                             <div class="col-6">
                                 {{#loggedin}}
                                     {{< core/hover_tooltip }}
index 85a2b90..7084ce4 100644 (file)
@@ -123,7 +123,7 @@ class renderer extends plugin_renderer_base {
 
         $toc .= html_writer::tag('a', '', array('name' => 'toc')); // Representation of toc (HTML).
 
-        $toc .= html_writer::tag('h2', get_string('toc', 'mod_book'), ['class' => 'text-center p-b-2']);
+        $toc .= html_writer::tag('h2', get_string('toc', 'mod_book'), ['class' => 'text-center pb-5']);
         $toc .= html_writer::start_tag('ul');
         foreach ($chapters as $ch) {
             if (!$ch->hidden) {
@@ -189,12 +189,12 @@ class renderer extends plugin_renderer_base {
         $chaptervisible = $chapter->hidden ? false : true;
 
         $bookchapter = '';
-        $bookchapter .= html_writer::start_div('book_chapter p-t-1', ['id' => 'ch' . $chapter->id]);
+        $bookchapter .= html_writer::start_div('book_chapter pt-3', ['id' => 'ch' . $chapter->id]);
         if (!$book->customtitles) {
             if (!$chapter->subchapter) {
-                $bookchapter .= $this->output->heading($title, 2, 'text-center p-b-2');
+                $bookchapter .= $this->output->heading($title, 2, 'text-center pb-5');
             } else {
-                $bookchapter .= $this->output->heading($title, 3, 'text-center p-b-2');
+                $bookchapter .= $this->output->heading($title, 3, 'text-center pb-5');
             }
         }
 
index 66f7db9..4cf50b7 100644 (file)
 }}
 <div class="book p-4">
     <div class="text-right">{{{ printdialoglink }}}</div>
-    <div class="text-center p-b-1 book_title">{{{ booktitle }}}</div>
-    <div class="book_info w-100 p-t-3 d-inline-block">
+    <div class="text-center pb-3 book_title">{{{ booktitle }}}</div>
+    <div class="book_info w-100 pt-6 d-inline-block">
         <div class="w-50 float-left">
             <table>
                 <tr>
                     <td>
                         {{# str }} site {{/ str }}:
                     </td>
-                    <td class="p-l-1">
+                    <td class="pl-3">
                         {{{ sitelink }}}
                     </td>
                 </tr>
@@ -79,7 +79,7 @@
                     <td>
                         {{# str }} course {{/ str }}:
                     </td>
-                    <td class="p-l-1">
+                    <td class="pl-3">
                         {{{ coursename }}}
                     </td>
                 </tr>
@@ -87,7 +87,7 @@
                     <td>
                         {{# str }} modulename, mod_book {{/ str }}:
                     </td>
-                    <td class="p-l-1">
+                    <td class="pl-3">
                         {{{ modulename }}}
                     </td>
                 </tr>
@@ -99,7 +99,7 @@
                     <td>
                         {{# str }} printedby, booktool_print {{/ str }}:
                     </td>
-                    <td class="p-l-1">
+                    <td class="pl-3">
                         {{{ username }}}
                     </td>
                 </tr>
                     <td>
                         {{# str }} printdate, booktool_print {{/ str }}:
                     </td>
-                    <td class="p-l-1">
+                    <td class="pl-3">
                         {{{ printdate }}}
                     </td>
                 </tr>
     </div>
     {{#bookintro}}
     <div class="w-100 book_description">
-        <div class="p-b-2 p-t-2">
-            <h2 class="text-center p-b-2">{{#str}} description {{/str}}</h2>
+        <div class="py-5">
+            <h2 class="text-center pb-5">{{#str}} description {{/str}}</h2>
              <p class="book_summary">{{{ bookintro }}}</p>
         </div>
     </div>
     {{/bookintro}}
     <div class="w-100">
-        <div class="p-b-2 p-t-2">{{{ toc }}}</div>
+        <div class="py-5">{{{ toc }}}</div>
     </div>
     <div class="w-100">
      {{#chapters}}
         {{#visible }}
-            <div class="p-b-2">
+            <div class="pb-5">
             {{{ content }}}
             </div>
         {{/visible}}
index bfcc41d..6140acc 100644 (file)
@@ -44,7 +44,7 @@
 }}
 <div class="chapter col-12 p-4">
     <div class="text-right">{{{ printdialoglink }}}</div>
-    <div class="text-center p-b-2">{{{ booktitle }}}</div>
+    <div class="text-center pb-5">{{{ booktitle }}}</div>
     <div class="chapter">
         {{#parentchaptertitle}}
          <div class="text-center">
index 54ec58b..9159430 100644 (file)
@@ -167,7 +167,7 @@ if ($download) {
     \forumreport_summary\event\report_viewed::create($eventparams)->trigger();
 
     echo $OUTPUT->header();
-    echo $OUTPUT->heading(get_string('summarytitle', 'forumreport_summary', $title), 2, 'p-b-2');
+    echo $OUTPUT->heading(get_string('summarytitle', 'forumreport_summary', $title), 2, 'pb-5');
 
     if (!empty($filters['groups'])) {
         \core\notification::info(get_string('viewsdisclaimer', 'forumreport_summary'));
index b2a0e03..3f4ce7c 100644 (file)
@@ -53,7 +53,7 @@
 </div>
 
 {{! Groups filter popover }}
-<div id="filter-groups-popover" class="popover m-t-1 hidden" data-openfilter="false">
+<div id="filter-groups-popover" class="popover mt-3 hidden" data-openfilter="false">
     <h3 class="popover-header">{{# str}} filter:groupsname, forumreport_summary {{/ str}}</h3>
     <div class="popover-body" data-region="filter-groups">
         <div class="form-check filter-scrollable">
index da67f20..d63e483 100644 (file)
@@ -50,7 +50,7 @@
     {{{groupchangemenu}}}
 
 
-    <div class="p-t-1 p-b-1">
+    <div class="py-3">
         {{#forum.capabilities.create}}
             <a class="btn btn-primary" data-toggle="collapse" href="#collapseAddForm">
                 {{$discussion_create_text}}
@@ -60,7 +60,7 @@
         {{/forum.capabilities.create}}
         {{^forum.capabilities.create}}
             {{#forum.capabilities.selfenrol}}
-                <div class="p-t-1 p-b-1">
+                <div class="py-3">
                     <a class="btn btn-primary" href="{{forum.urls.create}}">
                         {{$discussion_create_text}}
                             {{#str}}addanewdiscussion, forum{{/str}}
@@ -81,7 +81,7 @@
         {{/forum.capabilities.grade}}
     </div>
     {{#forum.capabilities.create}}
-        <div class="collapse m-t-1 p-b-1" id="collapseAddForm">
+        <div class="collapse mt-3 pb-3" id="collapseAddForm">
             {{{newdiscussionhtml}}}
         </div>
     {{/forum.capabilities.create}}
                         <th scope="col">
                             <span class="accesshide">{{#str}}status{{/str}}</span>
                         </th>
-                        <th scope="col" class="p-l-0">
+                        <th scope="col" class="pl-0">
                             {{#state.sortorder.isdiscussiondesc}}
                                 <a href="{{{forum.urls.sortdiscussionasc}}}" aria-label="{{#str}}discussionlistsortbydiscussionasc, mod_forum{{/str}}">{{#str}}discussion, mod_forum{{/str}}</a> <span class="text-primary">{{#pix}}t/downlong, core, {{#str}}desc, core{{/str}}{{/pix}}</span>
                             {{/state.sortorder.isdiscussiondesc}}
                                 {{/discussion.pinned}}
                             </td>
                             <th scope="row" class="topic p-0 align-middle">
-                                <div class="p-3 p-l-0">
+                                <div class="p-3 pl-0">
                                     <a class="w-100 h-100 d-block" href="{{discussion.urls.view}}" title="{{discussion.name}}" aria-label="{{discussion.name}}">
                                         {{#shortentext}}100, {{{discussion.name}}}{{/shortentext}}
                                     </a>
index f423c8e..aebd5e2 100644 (file)
@@ -33,7 +33,7 @@
 <div id="discussion-container-{{uniqid}}" data-content="forum-discussion">
 {{#html}}
     {{#hasanyactions}}
-    <div class="d-flex flex-wrap flex-row-reverse m-b-1 text-right" data-container="discussion-tools">
+    <div class="d-flex flex-wrap flex-row-reverse mb-3 text-right" data-container="discussion-tools">
         <div class="pl-1">
             <div class="discussion-settings-menu">
                 {{> mod_forum/forum_action_menu}}
index 920556c..b6fca4b 100644 (file)
 }}
 <div class="container-fluid grade-display" data-region="view-grade">
     {{#grade}}
-        <div class="row-fluid px-3">
+        <div class="row px-3">
             <h5 class="font-weight-bold description">{{#str}}grade{{/str}}:</h5>
             <p class="ml-auto">{{usergrade}} / {{maxgrade}}</p>
         </div>
-        <div class="row-fluid px-3">
+        <div class="row px-3">
             <h5 class="font-weight-bold description">{{#str}}gradedby, forum{{/str}}:</h5>
             <p class="ml-auto">
                 {{#gradedby}}
                 {{/gradedby}}
             </p>
         </div>
-        <div class="row-fluid px-3">
+        <div class="row px-3">
             <h5 class="font-weight-bold description">{{#str}}date{{/str}}:</h5>
             <p class="ml-auto">{{#userdate}}{{timemodified}}, {{#str}} strftimedate, langconfig {{/str}}{{/userdate}}</p>
         </div>
     {{/grade}}
-    <div class="row-fluid px-3">
+    <div class="row px-3">
         <h5 class="font-weight-bold description">
             {{#str}}gradingstatus, forum{{/str}}
         </h5>
@@ -72,7 +72,7 @@
             {{/hasgrade}}
         </p>
     </div>
-    <div class="row-fluid p-3">
+    <div class="row p-3">
         <fieldset class="w-100" disabled="disabled">
             <div class="w-100" data-region="grade-template"></div>
         </fieldset>
index c7f4a44..9902a29 100644 (file)
@@ -1117,7 +1117,7 @@ class mod_forum_mail_testcase extends advanced_testcase {
         $newcase['forums'][0]['forumposts'][0]['name'] = 'HTML text and image';
         $newcase['forums'][0]['forumposts'][0]['message'] = '<p>Welcome to Moodle, '
             .'<img src="@@PLUGINFILE@@/Screen%20Shot%202016-03-22%20at%205.54.36%20AM%20%281%29.png"'
-            .' alt="" width="200" height="393" class="img-responsive" />!</p>';
+            .' alt="" width="200" height="393" class="img-fluid" />!</p>';
         $newcase['expectations'][0]['subject'] = '.*101.*HTML text and image';
         $newcase['expectations'][0]['contents'] = array(
             '~{\$a',
@@ -1127,7 +1127,7 @@ class mod_forum_mail_testcase extends advanced_testcase {
             '<p>Welcome to Moodle, '
             .'<img src="https://www.example.com/moodle/tokenpluginfile.php/[^/]*/\d+/mod_forum/post/\d+/'
                 .'Screen%20Shot%202016-03-22%20at%205\.54\.36%20AM%20%281%29\.png"'
-                .' alt="" width="200" height="393" class="img-responsive" />!</p>',
+                .' alt="" width="200" height="393" class="img-fluid" />!</p>',
             '>Love Moodle', '>1\d1');
         $htmlcases['HTML mail with text+image message i.e. @@PLUGINFILE@@ token handling'] = array('data' => $newcase);
 
index b1482f6..aae1cc0 100644 (file)
@@ -25,7 +25,7 @@ function glossary_show_entry_entrylist($course, $cm, $glossary, $entry, $mode=''
         }
         if (!empty($entry->rating)) {
             echo '<br />';
-            echo '<span class="ratings d-block p-t-1">';
+            echo '<span class="ratings d-block pt-3">';
             $return = glossary_print_entry_ratings($course, $entry);
             echo '</span>';
         }
index 66933cc..596660c 100644 (file)
@@ -1369,7 +1369,7 @@ function  glossary_print_entry_lower_section($course, $cm, $glossary, $entry, $m
             echo '<tr valign="top"><td class="icons">'.$icons.'</td></tr>';
         }
         if (!empty($entry->rating)) {
-            echo '<tr valign="top"><td class="ratings p-t-1">';
+            echo '<tr valign="top"><td class="ratings pt-3">';
             glossary_print_entry_ratings($course, $entry);
             echo '</td></tr>';
         }
index 9b1cb3a..5f001e1 100644 (file)
@@ -2317,7 +2317,7 @@ class lesson extends lesson_base {
                 if ($instancename) {
                     return html_writer::link(new moodle_url('/mod/'.$modname.'/view.php',
                         array('id' => $this->properties->activitylink)), get_string('activitylinkname',
-                        'lesson', $instancename), array('class' => 'centerpadded lessonbutton standardbutton p-r-1'));
+                        'lesson', $instancename), array('class' => 'centerpadded lessonbutton standardbutton pr-3'));
                 }
             }
         }
@@ -4261,7 +4261,7 @@ abstract class lesson_page extends lesson_base {
                 $options->attemptid = isset($attempt) ? $attempt->id : null;
 
                 $result->feedback .= $OUTPUT->box(format_text($this->get_contents(), $this->properties->contentsformat, $options),
-                        'generalbox boxaligncenter p-y-1');
+                        'generalbox boxaligncenter py-3');
                 $result->feedback .= '<div class="correctanswer generalbox"><em>'
                         . get_string("youranswer", "lesson").'</em> : <div class="studentanswer mt-2 mb-2">';
 
index 6b8cfb4..10066f9 100644 (file)
@@ -620,7 +620,8 @@ class mod_lesson_renderer extends plugin_renderer_base {
         $output .= $this->box_end(); // End of Lesson button to Continue.
 
         if ($data->reviewlesson !== false) {
-            $output .= html_writer::link($data->reviewlesson, get_string('reviewlesson', 'lesson'), array('class' => 'centerpadded lessonbutton standardbutton p-r-1'));
+            $output .= html_writer::link($data->reviewlesson, get_string('reviewlesson', 'lesson'),
+                array('class' => 'centerpadded lessonbutton standardbutton pr-3'));
         }
         if ($data->modattemptsnoteacher !== false) {
             $output .= $this->paragraph(get_string("modattemptsnoteacher", "lesson"), 'centerpadded');
@@ -632,13 +633,13 @@ class mod_lesson_renderer extends plugin_renderer_base {
 
         $url = new moodle_url('/course/view.php', array('id' => $course->id));
         $output .= html_writer::link($url, get_string('returnto', 'lesson', format_string($course->fullname, true)),
-                array('class' => 'centerpadded lessonbutton standardbutton p-r-1'));
+                array('class' => 'centerpadded lessonbutton standardbutton pr-3'));
 
         if (has_capability('gradereport/user:view', context_course::instance($course->id))
                 && $course->showgrades && $lesson->grade != 0 && !$lesson->practice) {
             $url = new moodle_url('/grade/index.php', array('id' => $course->id));
             $output .= html_writer::link($url, get_string('viewgrades', 'lesson'),
-                array('class' => 'centerpadded lessonbutton standardbutton p-r-1'));
+                array('class' => 'centerpadded lessonbutton standardbutton pr-3'));
         }
         return $output;
     }
index 8883d16..6d538c7 100644 (file)
         </li>
     </ul>
     <div class="tab-content" data-region="tab-content">
-        <div class="text-sm-center p-t-2" data-region="loading-container">
+        <div class="text-sm-center pt-5" data-region="loading-container">
             {{> core/loading }}
         </div>
-        <div class="tab-pane active p-t-1"
+        <div class="tab-pane active pt-3"
             id="existing-category-{{uniqid}}"
             role="tabpanel"
             data-region="existing-category-container">
         </div>
-        <div class="tab-pane p-t-1"
+        <div class="tab-pane pt-3"
             id="new-category-{{uniqid}}"
             role="tabpanel"
             data-region="new-category-container">
index d8218f3..10df50b 100644 (file)
@@ -76,7 +76,7 @@ Feature: Teachers can override the grade for any question
     And I click on "Save image" "button"
     # Editor is not inserting the html for the image correctly
     # when running under behat so line below manually inserts it.
-    And I set the field "Comment" to "<img src=\"@@PLUGINFILE@@/moodle_logo.jpg\" alt=\"It's the logo\" width=\"48\" height=\"48\" class=\"img-responsive atto_image_button_text-bottom\"><!-- File hash: a8e3ffba4ab315b3fb9187ebbf122fe9 -->"
+    And I set the field "Comment" to "<img src=\"@@PLUGINFILE@@/moodle_logo.jpg\" alt=\"It's the logo\" width=\"48\" height=\"48\" class=\"img-fluid atto_image_button_text-bottom\"><!-- File hash: a8e3ffba4ab315b3fb9187ebbf122fe9 -->"
     And I press "Save" and switch to main window
     And I switch to the main window
     And I should see "Commented: [It's the logo]" in the ".history table" "css_element"
index b8ff382..3413fbc 100644 (file)
     display: none;
 }
 
-.path-mod-workshop #id_rubric-grid-wrapper .rubric-grid {
+.path-mod-workshop .mform.frozen #id_rubric-grid-wrapper,
+.path-mod-workshop #id_rubric-grid-wrapper {
     margin-left: auto;
     margin-right: auto;
+    width: 100%;
+}
+
+.path-mod-workshop .mform.frozen #id_rubric-grid-wrapper .checkbox,
+.path-mod-workshop .assessmentform.rubric.grid #id_rubric-grid-wrapper .checkbox {
+    max-width: 100%;
+    flex: 0 0 100%;
+    text-align: left;
 }
 
 .path-mod-workshop .mform.frozen #id_rubric-grid-wrapper .fitem .felement,
index c7d348d..f1b4e1b 100644 (file)
@@ -70,7 +70,7 @@ class qtype_ddtoimage_renderer_base extends qtype_with_combined_feedback_rendere
         $output .= html_writer::start_div('ddarea');
         $output .= html_writer::start_div($dropareaclass);
         $output .= html_writer::img(self::get_url_for_image($qa, 'bgimage'), get_string('dropbackground', 'qtype_ddmarker'),
-                ['class' => 'dropbackground img-responsive img-fluid']);
+                ['class' => 'dropbackground img-fluid w-100']);
 
         $output .= html_writer::div('', 'dropzones');
         $output .= html_writer::end_div();
index 3b93673..16c75e8 100644 (file)
@@ -26,6 +26,7 @@ form.mform fieldset#id_previewareaheader div.ddarea {
 .que.ddimageortext div.droparea .dropzones {
     position: absolute;
     top: 0;
+    /*rtl:ignore*/
     left: 0;
 }
 
@@ -39,10 +40,6 @@ form.mform fieldset#id_previewareaheader .dropbackground {
     max-width: none;
 }
 
-.que.ddimageortext .dropbackground.img-responsive.img-fluid {
-    width: 100%;
-}
-
 .que.ddimageortext .dropzone {
     display: none;
     position: absolute;
index 180faa5..6ea5278 100644 (file)
@@ -58,7 +58,7 @@ class qtype_ddmarker_renderer extends qtype_ddtoimage_renderer_base {
         $output .= html_writer::start_div('ddarea');
         $output .= html_writer::start_div($dropareaclass);
         $output .= html_writer::img(self::get_url_for_image($qa, 'bgimage'), get_string('dropbackground', 'qtype_ddmarker'),
-                ['class' => 'dropbackground img-responsive img-fluid']);
+                ['class' => 'dropbackground img-fluid w-100']);
 
         $output .= html_writer::div('', 'dropzones');
         $output .= html_writer::div('', 'markertexts');
index e51e60b..3b416f4 100644 (file)
@@ -64,10 +64,6 @@ form.mform fieldset#id_previewareaheader .dropbackground {
     max-width: none;
 }
 
-.que.ddmarker .dropbackground.img-responsive.img-fluid {
-    width: 100%;
-}
-
 .que.ddmarker div.dragitems div.draghome,
 .que.ddmarker div.dragitems div.dragitem,
 form.mform fieldset#id_previewareaheader div.draghome,
index 2671f7d..85538be 100644 (file)
@@ -34,7 +34,7 @@
     </p>
 {{/pushratingstouserplans}}
 </div>
-<div class="row-fluid">
+<div class="row">
 <span class="col-md-6">
     <table class="table table-bordered">
         <summary class="accesshide">
index ef7a617..c328f65 100644 (file)
@@ -366,7 +366,7 @@ if (!empty($instanceid) && !empty($roleid)) {
             echo $OUTPUT->render($checknos);
         }
         echo '</div>';
-        echo '<div class="p-y-1">';
+        echo '<div class="py-3">';
         echo html_writer::label(get_string('withselectedusers'), 'formactionid');
         $displaylist['#messageselect'] = get_string('messageselectadd');
         $withselectedparams = array(
index 7ec7033..d79ac1f 100644 (file)
@@ -1,13 +1,12 @@
 $breadcrumb-divider: "▶" !default;
 $breadcrumb-divider-rtl: "◀" !default;
-// Making BS4 Stable compatible with BS4 Alpha for moodle core sass
-@import "moodle/bs4alphacompat";
 
 // Specific overrides to make Bootstrap RTL.
 @import "moodle/bootstrap-rtl";
 
 // Old Moodle stuff from base theme.
 // Massive, needs broken up.
+@import "moodle/variables";
 @import "moodle/core";
 @import "moodle/icons";
 @import "moodle/admin";
@@ -38,7 +37,6 @@ $breadcrumb-divider-rtl: "◀" !default;
 @import "moodle/sticky-footer";
 @import "moodle/popover-region";
 @import "moodle/tool_usertours";
-@import "moodle/bs2-compat";
 @import "moodle/print";
 @import "moodle/modal";
 @import "moodle/layout";
index bbecc7e..b89ad6f 100644 (file)
 .environmenttable {
     .warn {
         background-color: $state-warning-bg;
-        color: $state-warning-text;
+        color: $warning;
     }
 
     .error {
         background-color: $state-danger-bg;
-        color: $state-danger-text;
+        color: $danger;
     }
 
     .ok {
         background-color: $state-success-bg;
-        color: $state-success-text;
+        color: $success;
     }
 }
 
     text-align: left;
     margin-left: auto;
     margin-right: auto;
-    margin-top: $spacer-y;
+    margin-top: $spacer;
 }
 
 #page-admin-roles-define .topfields {
 }
 
 #page-admin-roles-define .capdefault {
-    background-color: $table-bg-hover;
+    background-color: $table-hover-bg;
 }
 
 #page-filter-manage .backlink,
 
         .uninstall {
             a {
-                color: $state-danger-text;
+                color: $danger;
             }
         }
 
index 64dddd5..cedea64 100644 (file)
         width: 50%;
         display: inline-block;
         float: left;
-        padding: $table-sm-cell-padding;
+        padding: $table-cell-padding-sm;
     }
     .normal_setting {
         width: 50%;
         display: inline-block;
         float: left;
-        padding: $table-sm-cell-padding;
+        padding: $table-cell-padding-sm;
     }
 }
 
@@ -48,7 +48,7 @@
     .grouped_settings {
         /* Striped rows like a table */
         &:nth-of-type(odd) {
-            background-color: $table-bg-accent;
+            background-color: $table-accent-bg;
         }
         &:nth-of-type(even) {
             background-color: $card-bg;
 }
 
 .path-backup .notification.dependencies_enforced {
-    color: $state-danger-text;
+    color: $danger;
     font-weight: bold;
 }
 
 .path-backup .backup_progress {
-    margin-top: $spacer-y;
-    margin-bottom: $spacer-y;
+    margin-top: $spacer;
+    margin-bottom: $spacer;
 
     .backup_stage {
         color: $text-muted;
diff --git a/theme/boost/scss/moodle/bs2-compat.scss b/theme/boost/scss/moodle/bs2-compat.scss
deleted file mode 100644 (file)
index e8552a8..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-// Some - backwards compatibility for BS2. We may have plugins and user content targeted for BS2.
-
-// Well -> Panel -> Card. We skipped panel (BS3) so lets just support well and card.
-.well {
-    border: $border-width solid $border-color;
-    padding: $card-spacer-x;
-}
-
-// Some things just got renamed.
-.img-responsive {
-    @include img-fluid;
-}
-
-.text-error {
-    color: map-get($theme-colors, 'danger');
-}
-
-.btn-default {
-    @include button-variant(map-get($theme-colors, 'secondary'), map-get($theme-colors, 'secondary'));
-}
-
-.label {
-    display: inline-block;
-    padding: $badge-padding-y $badge-padding-x;
-    @include font-size($badge-font-size);
-    font-weight: $badge-font-weight;
-    line-height: 1;
-    text-align: center;
-    white-space: nowrap;
-    vertical-align: baseline;
-    @include border-radius($badge-border-radius);
-    @include transition($badge-transition);
-    @include badge-variant($tag-default-bg);
-}
-
-.label-success {
-    @include badge-variant($tag-success-bg);
-}
-
-.label-info {
-    @include badge-variant($tag-info-bg);
-}
-
-.label-warning {
-    @include badge-variant($tag-warning-bg);
-}
-
-.label-important {
-    @include badge-variant($tag-danger-bg);
-}
-
-// Floats.
-.pull-left {
-    @include pull-left();
-}
-
-.pull-right {
-    @include pull-right();
-}
diff --git a/theme/boost/scss/moodle/bs4alphacompat.scss b/theme/boost/scss/moodle/bs4alphacompat.scss
deleted file mode 100644 (file)
index 1bd88c4..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-$font-size-xs: ($font-size-base * .75) !default;
-$font-size-root: $font-size-base;
-
-$zindex-navbar-fixed: 1030 !default;
-$tag-padding-y: .25rem !default;
-
-/* stylelint-disable function-url-scheme-blacklist */
-$form-icon-success: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") !default;
-$form-icon-warning: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E") !default;
-$form-icon-danger: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E") !default;
-/* stylelint-enable function-url-scheme-blacklist */
-
-$input-bg-disabled: $input-disabled-bg;
-$table-sm-cell-padding: $table-cell-padding-sm;
-$popover-arrow-outer-width: 11px !default;
-$modal-title-padding: $modal-header-padding;
-$pagination-hover-border: $pagination-hover-border-color;
-$pagination-active-border: $pagination-active-border-color;
-
-$primary: $blue !default;
-$secondary: $gray-600 !default;
-$success: $green !default;
-$info: $cyan !default;
-$warning: $yellow !default;
-$danger: $red !default;
-$light: $gray-100 !default;
-$dark: $gray-800 !default;
-
-$brand-primary: $primary;
-$brand-success: $success;
-$brand-info: $info;
-$brand-warning: $warning;
-$brand-danger: $danger;
-
-$spacer: 1rem !default;
-$spacer-x: $spacer !default;
-$spacer-y: $spacer !default;
-
-$gray-dark: $gray-900;
-$gray: $gray-700;
-$gray-light: $gray-600;
-$gray-lighter: $gray-300;
-$gray-lightest: $gray-100;
-
-$table-bg-hover: $table-hover-bg;
-$table-bg-accent: $table-accent-bg;
-
-$tag-default-bg: $gray-light !default;
-$tag-primary-bg: $brand-primary !default;
-$tag-success-bg: $brand-success !default;
-$tag-info-bg: $brand-info !default;
-$tag-warning-bg: $brand-warning !default;
-$tag-danger-bg: $brand-danger !default;
-
-$state-success-text: $success;
-$state-success-bg: theme-color-level("success", -10) !default;
-$state-success-border: theme-color-level("success", -9) !default;
-
-$state-info-text: $info;
-$state-info-bg: theme-color-level("info", -10) !default;
-$state-info-border: theme-color-level("info", -9) !default;
-
-$state-warning-text: $warning;
-$state-warning-bg: theme-color-level("warning", -10) !default;
-$state-warning-border: theme-color-level("warning", -10) !default;
-
-$state-danger-text: $danger;
-$state-danger-bg: theme-color-level("danger", -10) !default;
-$state-danger-border: theme-color-level("danger", -9) !default;
-
-@mixin form-control-validation($color) {
-    // Color the label and help text
-    .form-control-feedback,
-    .form-control-label,
-    .form-check-label,
-    .form-check-inline,
-    .custom-control {
-        color: $color;
-    }
-    // Set the border and box shadow on specific inputs to match
-    .form-control {
-        border-color: $color;
-    }
-
-    // Set validation states also for addons
-    .input-group-addon {
-        color: $color;
-        border-color: $color;
-        background-color: lighten($color, 40%);
-    }
-    // Optional feedback icon
-    .form-control-feedback {
-        color: $color;
-    }
-}
-
-$tag-padding-x: .4em !default;
-$tag-padding-y: .25em !default;
-$tag-font-size: 75% !default;
-$tag-color: #fff !default;
-$tag-font-weight: bold !default;
-
-.tag {
-    display: inline-block;
-    padding: $tag-padding-y $tag-padding-x;
-    font-size: $tag-font-size;
-    font-weight: $tag-font-weight;
-    line-height: 1;
-    color: $tag-color;
-    text-align: center;
-    white-space: nowrap;
-    vertical-align: baseline;
-    @include border-radius();
-
-    // Empty tags collapse automatically
-    &:empty {
-        display: none;
-    }
-}
-
-.form-control-success,
-.form-control-warning,
-.form-control-danger {
-    padding-right: ($input-padding-x * 3);
-    background-repeat: no-repeat;
-    background-position: center right ($input-height / 4);
-    background-size: ($input-height / 2) ($input-height / 2);
-}
-
-// .form-check-input {
-//     position: static;
-// }
-
-@mixin tag-variant($color) {
-    background-color: $color;
-
-    &[href] {
-        @include hover-focus {
-            background-color: darken($color, 10%);
-        }
-    }
-}
-
-.tag-default {
-    @include tag-variant($tag-default-bg);
-}
-
-.tag-primary {
-    @include tag-variant($tag-primary-bg);
-}
-
-.tag-success {
-    @include tag-variant($tag-success-bg);
-}
-
-.tag-info {
-    @include tag-variant($tag-info-bg);
-}
-
-.tag-warning {
-    @include tag-variant($tag-warning-bg);
-}
-
-.tag-danger {
-    @include tag-variant($tag-danger-bg);
-}
-
-@mixin pull-left() {
-    float: left !important; /* stylelint-disable-line declaration-no-important */
-}
-
-@mixin pull-right() {
-    float: right !important; /* stylelint-disable-line declaration-no-important */
-}
-
-.custom-select {
-    width: auto;
-}
-
-.fade.in {
-    opacity: 1;
-}
-
-// Adding compatibility for m-side-* classes.
-// stylelint-disable
-$spacer: 1rem !default;
-$bs4aspacers: () !default;
-$bs4aspacers: map-merge((
-  0: 0,
-  1: ($spacer * 1),
-  2: ($spacer * 2),
-  3: ($spacer * 3)
-), $bs4aspacers);
-
-@each $prop, $abbrev in (margin: m, padding: p) {
-  @each $size, $length in $bs4aspacers {
-
-    .#{$abbrev}-a-#{$size} { #{$prop}: $length !important; }
-    .#{$abbrev}-t-#{$size},
-    .#{$abbrev}-y-#{$size} {
-      #{$prop}-top: $length !important;
-    }
-    .#{$abbrev}-r-#{$size},
-    .#{$abbrev}-x-#{$size} {
-      #{$prop}-right: $length !important;
-    }
-    .#{$abbrev}-b-#{$size},
-    .#{$abbrev}-y-#{$size} {
-      #{$prop}-bottom: $length !important;
-    }
-    .#{$abbrev}-l-#{$size},
-    .#{$abbrev}-x-#{$size} {
-      #{$prop}-left: $length !important;
-    }
-  }
-}
-
-input[disabled] {
-    cursor: not-allowed;
-}
-
-.row-fluid {
-  @include make-row();
-}
-
-// These have been removed in BS4 Stable. Adding in so RTL dropdowns will work.
-/*rtl:raw:
-.dropdown-menu-right {
-    right: 0;
-    left: auto;
-}
-.dropdown-menu-left {
-    right: auto;
-    left: 0;
-}
-*/
index 53fdb52..e8977fd 100644 (file)
@@ -73,7 +73,7 @@ $calendarEventOtherColor: #ced4da !default; // Pale gray.
 
         .drop-target {
             box-sizing: border-box;
-            border: 1px dashed $brand-primary;
+            border: 1px dashed $primary;
         }
     }
 
index 00b1583..9bf6081 100644 (file)
@@ -5,6 +5,8 @@
 // want white default colour.
 $bg-inverse-link-color: #fff !default;
 
+$font-size-xs: ($font-size-base * .75) !default;
+
 #region-main {
     overflow-x: auto;
     overflow-y: visible;
@@ -577,7 +579,7 @@ a.skip:active {
 
 // My Moodle
 .path-my .coursebox {
-    margin: $spacer-y 0;
+    margin: $spacer 0;
     padding: 0;
 
     .overview {
@@ -1215,7 +1217,7 @@ body#page-lib-editor-tinymce-plugins-moodlemedia-preview {
 
 /* Moodle Dialogue Settings (moodle-core-dialogue)  */
 .moodle-dialogue-base .moodle-dialogue-lightbox {
-    background-color: $gray;
+    background-color: $gray-700;
 }
 
 // Prevent adding backdrops to popups in popups.
@@ -2345,7 +2347,7 @@ $footer-link-color: $bg-inverse-link-color !default;
 .sr-only-focusable {
     &:active,
     &:focus {
-        z-index: $zindex-navbar-fixed + 1;
+        z-index: 1031;
         position: fixed;
         background: #fff;
         padding: 7px;
@@ -2477,10 +2479,27 @@ body.h5p-embed {
 .float-left {
     float: left !important; /* stylelint-disable-line declaration-no-important */
 }
+
 .float-right {
     float: right !important; /* stylelint-disable-line declaration-no-important */
 }
 
+.img-responsive {
+    @include img-fluid();
+}
+
+input[disabled] {
+    cursor: not-allowed;
+}
+
+.custom-select {
+    width: auto;
+}
+
+.fade.in {
+    opacity: 1;
+}
+
 .clamp-2 {
     display: -webkit-box;
     -webkit-box-orient: vertical;
index 1349003..d273887 100644 (file)
@@ -225,7 +225,7 @@ body:not(.editing)  .sitetopic ul.section {
 
 .editing .section .activity:hover,
 .editing .section .activity.action-menu-shown {
-    background-color: $table-bg-accent;
+    background-color: $table-accent-bg;
 }
 
 .course-content .current {
@@ -234,7 +234,7 @@ body:not(.editing)  .sitetopic ul.section {
 
 .course-content .current::before {
     content: "";
-    border-left: $brand-primary 2px solid;
+    border-left: $primary 2px solid;
     position: absolute;
     left: -$card-spacer-x;
     top: 0;
@@ -538,7 +538,7 @@ span.editinstructions {
     font-size: $font-size-sm;
     padding: .1em .4em;
     background-color: $state-info-bg;
-    color: $state-info-text;
+    color: $info;
     text-decoration: none;
     z-index: 9999;
 
@@ -556,7 +556,7 @@ span.editinstructions {
     border: 1px solid $state-info-border;
     text-align: center;
     background: $state-info-bg;
-    color: $state-info-text;
+    color: $info;
     z-index: 1; // Required in order to have this above relatively positioned course content@mixin
 
     @include box-shadow(2px 2px 5px 1px #ccc);
@@ -712,12 +712,12 @@ span.editinstructions {
 
 .courses .coursebox {
     &.collapsed {
-        padding-top: $spacer-y / 2;
-        padding-bottom: $spacer-y / 2;
+        padding-top: $spacer / 2;
+        padding-bottom: $spacer / 2;
     }
 
     &.even {
-        background-color: $table-bg-accent;
+        background-color: $table-accent-bg;
     }
 }
 
@@ -948,7 +948,7 @@ span.editinstructions {
             > div,
             > div:hover,
             &[data-selected='1'] > div {
-                background-color: $table-bg-hover;
+                background-color: $table-hover-bg;
             }
         }
     }
index 8eae03e..e60306e 100644 (file)
@@ -69,7 +69,7 @@
 }
 
 #adminsettings .error {
-    color: $state-danger-text;
+    color: $danger;
 }
 
 .mform ul.file-list {
@@ -290,7 +290,7 @@ fieldset.coursesearchbox label {
 .form-autocomplete-suggestions {
     position: absolute;
     background-color: white;
-    border: 2px solid $gray-lighter;
+    border: 2px solid $gray-300;
     border-radius: 3px;
     min-width: 206px;
     max-height: 20em;
@@ -316,7 +316,7 @@ fieldset.coursesearchbox label {
 
 .form-autocomplete-suggestions li[aria-selected=true] {
     background-color: darken($dropdown-bg, 5%);
-    color: $gray;
+    color: $gray-700;
 }
 
 .form-autocomplete-downarrow {
@@ -411,9 +411,11 @@ textarea[data-auto-rows] {
 
 /** Atto fields do not have form-control because that would break the layout of the editor.
     So they need these extra styles to highlight the editor when there is a validation error. */
+/* stylelint-disable function-url-scheme-blacklist */
+$form-icon-danger: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E") !default;
+/* stylelint-enable function-url-scheme-blacklist */
 .has-danger .editor_atto_content.form-control,
 .has-danger .editor_atto_content.form-control-danger {
-    @include form-control-validation($brand-danger);
     background-image: $form-icon-danger;
     padding-right: ($input-padding-x * 3);
     background-repeat: no-repeat;
index 04d6f61..a97af4d 100644 (file)
 
     &.generaltable {
         .levelodd {
-            background-color: $table-bg-accent;
+            background-color: $table-accent-bg;
         }
 
         .leveleven {
         .heading .cell,
         .cell.category,
         .avg .cell {
-            background-color: $gray-lightest;
+            background-color: $gray-100;
         }
 
         table .clickable {
 
     &.generaltable {
         .levelodd {
-            background-color: $table-bg-accent;
+            background-color: $table-accent-bg;
         }
 
         .leveleven {
index f146898..7458548 100644 (file)
@@ -967,10 +967,6 @@ $grading-content-show-content-button-padding-left: calc(#{map-get($spacers, 2) *
     margin-left: 4px;
 }
 
-.ie .row-fluid .desktop-first-column {
-    margin-left: 0;
-}
-
 .langmenu form {
     margin: 0;
 }
@@ -1049,7 +1045,7 @@ div#dock {
         }
 
         > tbody > tr:nth-of-type(even) {
-            background-color: $table-bg-accent;
+            background-color: $table-accent-bg;
         }
 
         .rblock label {
@@ -1187,8 +1183,8 @@ div#dock {
 
     span.qnbutton {
         cursor: default;
-        background-color: $input-bg-disabled;
-        color: $gray;
+        background-color: $input-disabled-bg;
+        color: $gray-700;
     }
 
     a.qnbutton:hover,
@@ -1234,28 +1230,28 @@ div#dock {
 
     .qnbutton.correct .trafficlight {
         background-image: url([[pix:theme|mod/quiz/checkmark]]);
-        background-color: $state-success-text;
+        background-color: $success;
     }
 
     .qnbutton.blocked .trafficlight {
         background-image: url([[pix:core|t/locked]]);
-        background-color: $input-bg-disabled;
+        background-color: $input-disabled-bg;
     }
 
     .qnbutton.notanswered .trafficlight,
     .qnbutton.incorrect .trafficlight {
-        background-color: $state-danger-text;
+        background-color: $danger;
     }
 
     .qnbutton.partiallycorrect .trafficlight {
         background-image: url([[pix:theme|mod/quiz/whitecircle]]);
-        background-color: $state-warning-text;
+        background-color: $warning;
     }
 
     .qnbutton.complete .trafficlight,
     .qnbutton.answersaved .trafficlight,
     .qnbutton.requiresgrading .trafficlight {
-        background-color: $gray-light;
+        background-color: $gray-600;
     }
 }
 
index 4ed5c9a..fc93c2b 100644 (file)
@@ -245,8 +245,8 @@ body.path-question-type {
     width: 7em;
     padding: 0.5em;
     margin-bottom: 1.8em;
-    background-color: $gray-lighter;
-    border: 1px solid darken($gray-lighter, 7%);
+    background-color: $gray-300;
+    border: 1px solid darken($gray-300, 7%);
 
     @include border-radius(2px);
 }
@@ -350,14 +350,14 @@ body.path-question-type {
 
 .que .correctness {
     &.correct {
-        background-color: $state-success-text;
+        background-color: $success;
     }
     &.partiallycorrect {
-        background-color: $state-warning-text;
+        background-color: $warning;
     }
     &.notanswered,
     &.incorrect {
-        background-color: $state-danger-text;
+        background-color: $danger;
     }
 }
 
index eebf19c..50e56eb 100644 (file)
@@ -46,7 +46,7 @@ span[data-flexitour="container"] {
     }
 
     div[data-role="arrow"] {
-        border-width: #{$popover-arrow-outer-width};
+        border-width: $popover-arrow-width;
     }
 
     div[data-role="arrow"],
@@ -87,9 +87,9 @@ span[data-flexitour="container"] {
         &[x-placement="#{$direction}-start"] {
             margin-#{$opposite}: #{$popover-arrow-width};
             div[data-role="arrow"] {
-                #{$opposite}: -#{$popover-arrow-outer-width};
+                #{$opposite}: -$popover-arrow-width;
                 #{$side}: 50%;
-                margin-#{$side}: -#{$popover-arrow-outer-width};
+                margin-#{$side}: -$popover-arrow-width;
                 border-#{$opposite}-width: 0;
                 border-#{$direction}-color: #{$popover-arrow-outer-color};
             }
diff --git a/theme/boost/scss/moodle/variables.scss b/theme/boost/scss/moodle/variables.scss
new file mode 100644 (file)
index 0000000..9b733cf
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * Moodle variables
+ *
+ * Variables written for Moodle specific components
+ *
+ * Please do not override any Bootstrap variables here, custom Bootstrap variable should go in
+ * preset files instead.
+ */
+
+$state-success-bg: theme-color-level("success", -10) !default;
+$state-success-border: theme-color-level("success", -9) !default;
+
+$state-info-bg: theme-color-level("info", -10) !default;
+$state-info-border: theme-color-level("info", -9) !default;
+
+$state-warning-bg: theme-color-level("warning", -10) !default;
+$state-warning-border: theme-color-level("warning", -10) !default;
+
+$state-danger-bg: theme-color-level("danger", -10) !default;
+$state-danger-border: theme-color-level("danger", -9) !default;
\ No newline at end of file
index 280f192..bd0cf66 100644 (file)
@@ -82,6 +82,17 @@ $theme-colors: map-merge((
 ), $theme-colors);
 // stylelint-enable
 
+$spacer: 1rem !default;
+$spacers: (
+    0: 0,
+    1: ($spacer * .25),
+    2: ($spacer * .5),
+    3: $spacer,
+    4: ($spacer * 1.5),
+    5: ($spacer * 2),
+    6: ($spacer * 3)
+) !default;
+
 // Import FontAwesome.
 @import "fontawesome";
 
index 6420d42..cbdfb38 100644 (file)
@@ -7879,22 +7879,41 @@ button.bg-dark:focus {
   margin-left: 1.5rem !important; }
 
 .m-5 {
-  margin: 3rem !important; }
+  margin: 2rem !important; }
 
 .mt-5,
 .my-5 {
-  margin-top: 3rem !important; }
+  margin-top: 2rem !important; }
 
 .mr-5,
 .mx-5 {
-  margin-right: 3rem !important; }
+  margin-right: 2rem !important; }
 
 .mb-5,
 .my-5 {
-  margin-bottom: 3rem !important; }
+  margin-bottom: 2rem !important; }
 
 .ml-5,
 .mx-5 {
+  margin-left: 2rem !important; }
+
+.m-6 {
+  margin: 3rem !important; }
+
+.mt-6,
+.my-6 {
+  margin-top: 3rem !important; }
+
+.mr-6,
+.mx-6 {
+  margin-right: 3rem !important; }
+
+.mb-6,
+.my-6 {
+  margin-bottom: 3rem !important; }
+
+.ml-6,
+.mx-6 {
   margin-left: 3rem !important; }
 
 .p-0 {
@@ -7993,22 +8012,41 @@ button.bg-dark:focus {
   padding-left: 1.5rem !important; }
 
 .p-5 {
-  padding: 3rem !important; }
+  padding: 2rem !important; }
 
 .pt-5,
 .py-5 {
-  padding-top: 3rem !important; }
+  padding-top: 2rem !important; }
 
 .pr-5,
 .px-5 {
-  padding-right: 3rem !important; }
+  padding-right: 2rem !important; }
 
 .pb-5,
 .py-5 {
-  padding-bottom: 3rem !important; }
+  padding-bottom: 2rem !important; }
 
 .pl-5,
 .px-5 {
+  padding-left: 2rem !important; }
+
+.p-6 {
+  padding: 3rem !important; }
+
+.pt-6,
+.py-6 {
+  padding-top: 3rem !important; }
+
+.pr-6,
+.px-6 {
+  padding-right: 3rem !important; }
+
+.pb-6,
+.py-6 {
+  padding-bottom: 3rem !important; }
+
+.pl-6,
+.px-6 {
   padding-left: 3rem !important; }
 
 .m-n1 {
@@ -8088,22 +8126,41 @@ button.bg-dark:focus {
   margin-left: -1.5rem !important; }
 
 .m-n5 {
-  margin: -3rem !important; }
+  margin: -2rem !important; }
 
 .mt-n5,
 .my-n5 {
-  margin-top: -3rem !important; }
+  margin-top: -2rem !important; }
 
 .mr-n5,
 .mx-n5 {
-  margin-right: -3rem !important; }
+  margin-right: -2rem !important; }
 
 .mb-n5,
 .my-n5 {
-  margin-bottom: -3rem !important; }
+  margin-bottom: -2rem !important; }
 
 .ml-n5,
 .mx-n5 {
+  margin-left: -2rem !important; }
+
+.m-n6 {
+  margin: -3rem !important; }
+
+.mt-n6,
+.my-n6 {
+  margin-top: -3rem !important; }
+
+.mr-n6,
+.mx-n6 {
+  margin-right: -3rem !important; }
+
+.mb-n6,
+.my-n6 {
+  margin-bottom: -3rem !important; }
+
+.ml-n6,
+.mx-n6 {
   margin-left: -3rem !important; }
 
 .m-auto {
@@ -8197,18 +8254,32 @@ button.bg-dark:focus {
   .mx-sm-4 {
     margin-left: 1.5rem !important; }
   .m-sm-5 {
-    margin: 3rem !important; }
+    margin: 2rem !important; }
   .mt-sm-5,
   .my-sm-5 {
-    margin-top: 3rem !important; }
+    margin-top: 2rem !important; }
   .mr-sm-5,
   .mx-sm-5 {
-    margin-right: 3rem !important; }
+    margin-right: 2rem !important; }
   .mb-sm-5,
   .my-sm-5 {
-    margin-bottom: 3rem !important; }
+    margin-bottom: 2rem !important; }
   .ml-sm-5,
   .mx-sm-5 {
+    margin-left: 2rem !important; }
+  .m-sm-6 {
+    margin: 3rem !important; }
+  .mt-sm-6,
+  .my-sm-6 {
+    margin-top: 3rem !important; }
+  .mr-sm-6,
+  .mx-sm-6 {
+    margin-right: 3rem !important; }
+  .mb-sm-6,
+  .my-sm-6 {
+    margin-bottom: 3rem !important; }
+  .ml-sm-6,
+  .mx-sm-6 {
     margin-left: 3rem !important; }
   .p-sm-0 {
     padding: 0 !important; }
@@ -8281,18 +8352,32 @@ button.bg-dark:focus {
   .px-sm-4 {
     padding-left: 1.5rem !important; }
   .p-sm-5 {
-    padding: 3rem !important; }
+    padding: 2rem !important; }
   .pt-sm-5,
   .py-sm-5 {
-    padding-top: 3rem !important; }
+    padding-top: 2rem !important; }
   .pr-sm-5,
   .px-sm-5 {
-    padding-right: 3rem !important; }
+    padding-right: 2rem !important; }
   .pb-sm-5,
   .py-sm-5 {
-    padding-bottom: 3rem !important; }
+    padding-bottom: 2rem !important; }
   .pl-sm-5,
   .px-sm-5 {
+    padding-left: 2rem !important; }
+  .p-sm-6 {
+    padding: 3rem !important; }
+  .pt-sm-6,
+  .py-sm-6 {
+    padding-top: 3rem !important; }
+  .pr-sm-6,
+  .px-sm-6 {
+    padding-right: 3rem !important; }
+  .pb-sm-6,
+  .py-sm-6 {
+    padding-bottom: 3rem !important; }
+  .pl-sm-6,
+  .px-sm-6 {
     padding-left: 3rem !important; }
   .m-sm-n1 {
     margin: -0.25rem !important; }
@@ -8351,18 +8436,32 @@ button.bg-dark:focus {
   .mx-sm-n4 {
     margin-left: -1.5rem !important; }
   .m-sm-n5 {
-    margin: -3rem !important; }
+    margin: -2rem !important; }
   .mt-sm-n5,
   .my-sm-n5 {
-    margin-top: -3rem !important; }
+    margin-top: -2rem !important; }
   .mr-sm-n5,
   .mx-sm-n5 {
-    margin-right: -3rem !important; }
+    margin-right: -2rem !important; }
   .mb-sm-n5,
   .my-sm-n5 {
-    margin-bottom: -3rem !important; }
+    margin-bottom: -2rem !important; }
   .ml-sm-n5,
   .mx-sm-n5 {
+    margin-left: -2rem !important; }
+  .m-sm-n6 {
+    margin: -3rem !important; }
+  .mt-sm-n6,
+  .my-sm-n6 {
+    margin-top: -3rem !important; }
+  .mr-sm-n6,
+  .mx-sm-n6 {
+    margin-right: -3rem !important; }
+  .mb-sm-n6,
+  .my-sm-n6 {
+    margin-bottom: -3rem !important; }
+  .ml-sm-n6,
+  .mx-sm-n6 {
     margin-left: -3rem !important; }
   .m-sm-auto {
     margin: auto !important; }
@@ -8451,18 +8550,32 @@ button.bg-dark:focus {
   .mx-md-4 {
     margin-left: 1.5rem !important; }
   .m-md-5 {
-    margin: 3rem !important; }
+    margin: 2rem !important; }
   .mt-md-5,
   .my-md-5 {
-    margin-top: 3rem !important; }
+    margin-top: 2rem !important; }
   .mr-md-5,
   .mx-md-5 {
-    margin-right: 3rem !important; }
+    margin-right: 2rem !important; }
   .mb-md-5,
   .my-md-5 {
-    margin-bottom: 3rem !important; }
+    margin-bottom: 2rem !important; }
   .ml-md-5,
   .mx-md-5 {
+    margin-left: 2rem !important; }
+  .m-md-6 {
+    margin: 3rem !important; }
+  .mt-md-6,
+  .my-md-6 {
+    margin-top: 3rem !important; }
+  .mr-md-6,
+  .mx-md-6 {
+    margin-right: 3rem !important; }
+  .mb-md-6,
+  .my-md-6 {
+    margin-bottom: 3rem !important; }
+  .ml-md-6,
+  .mx-md-6 {
     margin-left: 3rem !important; }
   .p-md-0 {
     padding: 0 !important; }
@@ -8535,18 +8648,32 @@ button.bg-dark:focus {
   .px-md-4 {
     padding-left: 1.5rem !important; }
   .p-md-5 {
-    padding: 3rem !important; }
+    padding: 2rem !important; }
   .pt-md-5,
   .py-md-5 {
-    padding-top: 3rem !important; }
+    padding-top: 2rem !important; }
   .pr-md-5,
   .px-md-5 {
-    padding-right: 3rem !important; }
+    padding-right: 2rem !important; }
   .pb-md-5,
   .py-md-5 {
-    padding-bottom: 3rem !important; }
+    padding-bottom: 2rem !important; }
   .pl-md-5,
   .px-md-5 {
+    padding-left: 2rem !important; }
+  .p-md-6 {
+    padding: 3rem !important; }
+  .pt-md-6,
+  .py-md-6 {
+    padding-top: 3rem !important; }
+  .pr-md-6,
+  .px-md-6 {
+    padding-right: 3rem !important; }
+  .pb-md-6,
+  .py-md-6 {
+    padding-bottom: 3rem !important; }
+  .pl-md-6,
+  .px-md-6 {
     padding-left: 3rem !important; }
   .m-md-n1 {
     margin: -0.25rem !important; }
@@ -8605,18 +8732,32 @@ button.bg-dark:focus {
   .mx-md-n4 {
     margin-left: -1.5rem !important; }
   .m-md-n5 {
-    margin: -3rem !important; }
+    margin: -2rem !important; }
   .mt-md-n5,
   .my-md-n5 {
-    margin-top: -3rem !important; }
+    margin-top: -2rem !important; }
   .mr-md-n5,
   .mx-md-n5 {
-    margin-right: -3rem !important; }
+    margin-right: -2rem !important; }
   .mb-md-n5,
   .my-md-n5 {
-    margin-bottom: -3rem !important; }
+    margin-bottom: -2rem !important; }
   .ml-md-n5,
   .mx-md-n5 {
+    margin-left: -2rem !important; }
+  .m-md-n6 {
+    margin: -3rem !important; }
+  .mt-md-n6,
+  .my-md-n6 {
+    margin-top: -3rem !important; }
+  .mr-md-n6,
+  .mx-md-n6 {
+    margin-right: -3rem !important; }
+  .mb-md-n6,
+  .my-md-n6 {
+    margin-bottom: -3rem !important; }
+  .ml-md-n6,
+  .mx-md-n6 {
     margin-left: -3rem !important; }
   .m-md-auto {
     margin: auto !important; }
@@ -8705,18 +8846,32 @@ button.bg-dark:focus {
   .mx-lg-4 {
     margin-left: 1.5rem !important; }
   .m-lg-5 {
-    margin: 3rem !important; }
+    margin: 2rem !important; }
   .mt-lg-5,
   .my-lg-5 {
-    margin-top: 3rem !important; }
+    margin-top: 2rem !important; }
   .mr-lg-5,
   .mx-lg-5 {
-    margin-right: 3rem !important; }
+    margin-right: 2rem !important; }
   .mb-lg-5,
   .my-lg-5 {
-    margin-bottom: 3rem !important; }
+    margin-bottom: 2rem !important; }
   .ml-lg-5,
   .mx-lg-5 {
+    margin-left: 2rem !important; }
+  .m-lg-6 {
+    margin: 3rem !important; }
+  .mt-lg-6,
+  .my-lg-6 {
+    margin-top: 3rem !important; }
+  .mr-lg-6,
+  .mx-lg-6 {
+    margin-right: 3rem !important; }
+  .mb-lg-6,
+  .my-lg-6 {
+    margin-bottom: 3rem !important; }
+  .ml-lg-6,
+  .mx-lg-6 {
     margin-left: 3rem !important; }
   .p-lg-0 {
     padding: 0 !important; }
@@ -8789,18 +8944,32 @@ button.bg-dark:focus {
   .px-lg-4 {
     padding-left: 1.5rem !important; }
   .p-lg-5 {
-    padding: 3rem !important; }
+    padding: 2rem !important; }
   .pt-lg-5,
   .py-lg-5 {
-    padding-top: 3rem !important; }
+    padding-top: 2rem !important; }
   .pr-lg-5,
   .px-lg-5 {
-    padding-right: 3rem !important; }
+    padding-right: 2rem !important; }
   .pb-lg-5,
   .py-lg-5 {
-    padding-bottom: 3rem !important; }
+    padding-bottom: 2rem !important; }
   .pl-lg-5,
   .px-lg-5 {
+    padding-left: 2rem !important; }
+  .p-lg-6 {
+    padding: 3rem !important; }
+  .pt-lg-6,
+  .py-lg-6 {
+    padding-top: 3rem !important; }
+  .pr-lg-6,
+  .px-lg-6 {
+    padding-right: 3rem !important; }
+  .pb-lg-6,
+  .py-lg-6 {
+    padding-bottom: 3rem !important; }
+  .pl-lg-6,
+  .px-lg-6 {
     padding-left: 3rem !important; }
   .m-lg-n1 {
     margin: -0.25rem !important; }
@@ -8859,18 +9028,32 @@ button.bg-dark:focus {
   .mx-lg-n4 {
     margin-left: -1.5rem !important; }
   .m-lg-n5 {
-    margin: -3rem !important; }
+    margin: -2rem !important; }
   .mt-lg-n5,
   .my-lg-n5 {
-    margin-top: -3rem !important; }
+    margin-top: -2rem !important; }
   .mr-lg-n5,
   .mx-lg-n5 {
-    margin-right: -3rem !important; }
+    margin-right: -2rem !important; }
   .mb-lg-n5,
   .my-lg-n5 {
-    margin-bottom: -3rem !important; }
+    margin-bottom: -2rem !important; }
   .ml-lg-n5,
   .mx-lg-n5 {
+    margin-left: -2rem !important; }
+  .m-lg-n6 {
+    margin: -3rem !important; }
+  .mt-lg-n6,
+  .my-lg-n6 {
+    margin-top: -3rem !important; }
+  .mr-lg-n6,
+  .mx-lg-n6 {
+    margin-right: -3rem !important; }
+  .mb-lg-n6,
+  .my-lg-n6 {
+    margin-bottom: -3rem !important; }
+  .ml-lg-n6,
+  .mx-lg-n6 {
     margin-left: -3rem !important; }
   .m-lg-auto {
     margin: auto !important; }
@@ -8959,18 +9142,32 @@ button.bg-dark:focus {
   .mx-xl-4 {
     margin-left: 1.5rem !important; }
   .m-xl-5 {
-    margin: 3rem !important; }
+    margin: 2rem !important; }
   .mt-xl-5,
   .my-xl-5 {
-    margin-top: 3rem !important; }
+    margin-top: 2rem !important; }
   .mr-xl-5,
   .mx-xl-5 {
-    margin-right: 3rem !important; }
+    margin-right: 2rem !important; }
   .mb-xl-5,
   .my-xl-5 {
-    margin-bottom: 3rem !important; }
+    margin-bottom: 2rem !important; }
   .ml-xl-5,
   .mx-xl-5 {
+    margin-left: 2rem !important; }
+  .m-xl-6 {
+    margin: 3rem !important; }
+  .mt-xl-6,
+  .my-xl-6 {
+    margin-top: 3rem !important; }
+  .mr-xl-6,
+  .mx-xl-6 {
+    margin-right: 3rem !important; }
+  .mb-xl-6,
+  .my-xl-6 {
+    margin-bottom: 3rem !important; }
+  .ml-xl-6,
+  .mx-xl-6 {
     margin-left: 3rem !important; }
   .p-xl-0 {
     padding: 0 !important; }
@@ -9043,18 +9240,32 @@ button.bg-dark:focus {
   .px-xl-4 {
     padding-left: 1.5rem !important; }
   .p-xl-5 {
-    padding: 3rem !important; }
+    padding: 2rem !important; }
   .pt-xl-5,
   .py-xl-5 {
-    padding-top: 3rem !important; }
+    padding-top: 2rem !important; }
   .pr-xl-5,
   .px-xl-5 {
-    padding-right: 3rem !important; }
+    padding-right: 2rem !important; }
   .pb-xl-5,
   .py-xl-5 {
-    padding-bottom: 3rem !important; }
+    padding-bottom: 2rem !important; }
   .pl-xl-5,
   .px-xl-5 {
+    padding-left: 2rem !important; }
+  .p-xl-6 {
+    padding: 3rem !important; }
+  .pt-xl-6,
+  .py-xl-6 {
+    padding-top: 3rem !important; }
+  .pr-xl-6,
+  .px-xl-6 {
+    padding-right: 3rem !important; }
+  .pb-xl-6,
+  .py-xl-6 {
+    padding-bottom: 3rem !important; }
+  .pl-xl-6,
+  .px-xl-6 {
     padding-left: 3rem !important; }
   .m-xl-n1 {
     margin: -0.25rem !important; }
@@ -9113,18 +9324,32 @@ button.bg-dark:focus {
   .mx-xl-n4 {
     margin-left: -1.5rem !important; }
   .m-xl-n5 {
-    margin: -3rem !important; }
+    margin: -2rem !important; }
   .mt-xl-n5,
   .my-xl-n5 {
-    margin-top: -3rem !important; }
+    margin-top: -2rem !important; }
   .mr-xl-n5,
   .mx-xl-n5 {
-    margin-right: -3rem !important; }
+    margin-right: -2rem !important; }
   .mb-xl-n5,
   .my-xl-n5 {
-    margin-bottom: -3rem !important; }
+    margin-bottom: -2rem !important; }
   .ml-xl-n5,
   .mx-xl-n5 {
+    margin-left: -2rem !important; }
+  .m-xl-n6 {
+    margin: -3rem !important; }
+  .mt-xl-n6,
+  .my-xl-n6 {
+    margin-top: -3rem !important; }
+  .mr-xl-n6,
+  .mx-xl-n6 {
+    margin-right: -3rem !important; }
+  .mb-xl-n6,
+  .my-xl-n6 {
+    margin-bottom: -3rem !important; }
+  .ml-xl-n6,
+  .mx-xl-n6 {
     margin-left: -3rem !important; }
   .m-xl-auto {
     margin: auto !important; }
@@ -9378,236 +9603,6 @@ a.text-dark:hover, a.text-dark:focus {
     color: inherit;
     border-color: #dee2e6; } }
 
-/* stylelint-disable function-url-scheme-blacklist */
-/* stylelint-enable function-url-scheme-blacklist */
-.tag {
-  display: inline-block;
-  padding: 0.25rem 0.4em;
-  font-size: 75%;
-  font-weight: bold;
-  line-height: 1;
-  color: #fff;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline; }
-  .tag:empty {
-    display: none; }
-
-.form-control-success,
-.form-control-warning,
-.form-control-danger {
-  padding-right: 2.25rem;
-  background-repeat: no-repeat;
-  background-position: center right calc(1.5em + 0.75rem + 2px)/4;
-  background-size: calc(1.5em + 0.75rem + 2px)/2 calc(1.5em + 0.75rem + 2px)/2; }
-
-.tag-default {
-  background-color: #6c757d; }
-  .tag-default[href]:hover, .tag-default[href]:focus {
-    background-color: #545b62; }
-
-.tag-primary {
-  background-color: #1177d1; }
-  .tag-primary[href]:hover, .tag-primary[href]:focus {
-    background-color: #0d5ca2; }
-
-.tag-success {
-  background-color: #398439; }
-  .tag-success[href]:hover, .tag-success[href]:focus {
-    background-color: #2a602a; }
-
-.tag-info {
-  background-color: #5bc0de; }
-  .tag-info[href]:hover, .tag-info[href]:focus {
-    background-color: #31b0d5; }
-
-.tag-warning {
-  background-color: #f0ad4e; }
-  .tag-warning[href]:hover, .tag-warning[href]:focus {
-    background-color: #ec971f; }
-
-.tag-danger {
-  background-color: #d43f3a; }
-  .tag-danger[href]:hover, .tag-danger[href]:focus {
-    background-color: #b42c27; }
-
-.custom-select {
-  width: auto; }
-
-.fade.in {
-  opacity: 1; }
-
-.m-a-0 {
-  margin: 0 !important; }
-
-.m-t-0,
-.m-y-0 {
-  margin-top: 0 !important; }
-
-.m-r-0,
-.m-x-0 {
-  margin-right: 0 !important; }
-
-.m-b-0,
-.m-y-0 {
-  margin-bottom: 0 !important; }
-
-.m-l-0,
-.m-x-0 {
-  margin-left: 0 !important; }
-
-.m-a-1 {
-  margin: 1rem !important; }
-
-.m-t-1,
-.m-y-1 {
-  margin-top: 1rem !important; }
-
-.m-r-1,
-.m-x-1 {
-  margin-right: 1rem !important; }
-
-.m-b-1,
-.m-y-1 {
-  margin-bottom: 1rem !important; }
-
-.m-l-1,
-.m-x-1 {
-  margin-left: 1rem !important; }
-
-.m-a-2 {
-  margin: 2rem !important; }
-
-.m-t-2,
-.m-y-2 {
-  margin-top: 2rem !important; }
-
-.m-r-2,
-.m-x-2 {
-  margin-right: 2rem !important; }
-
-.m-b-2,
-.m-y-2 {
-  margin-bottom: 2rem !important; }
-
-.m-l-2,
-.m-x-2 {
-  margin-left: 2rem !important; }
-
-.m-a-3 {
-  margin: 3rem !important; }
-
-.m-t-3,
-.m-y-3 {
-  margin-top: 3rem !important; }
-
-.m-r-3,
-.m-x-3 {
-  margin-right: 3rem !important; }
-
-.m-b-3,
-.m-y-3 {
-  margin-bottom: 3rem !important; }
-
-.m-l-3,
-.m-x-3 {
-  margin-left: 3rem !important; }
-
-.p-a-0 {
-  padding: 0 !important; }
-
-.p-t-0,
-.p-y-0 {
-  padding-top: 0 !important; }
-
-.p-r-0,
-.p-x-0 {
-  padding-right: 0 !important; }
-
-.p-b-0,
-.p-y-0 {
-  padding-bottom: 0 !important; }
-
-.p-l-0,
-.p-x-0 {
-  padding-left: 0 !important; }
-
-.p-a-1 {
-  padding: 1rem !important; }
-
-.p-t-1,
-.p-y-1 {
-  padding-top: 1rem !important; }
-
-.p-r-1,
-.p-x-1 {
-  padding-right: 1rem !important; }
-
-.p-b-1,
-.p-y-1 {
-  padding-bottom: 1rem !important; }
-
-.p-l-1,
-.p-x-1 {
-  padding-left: 1rem !important; }
-
-.p-a-2 {
-  padding: 2rem !important; }
-
-.p-t-2,
-.p-y-2 {
-  padding-top: 2rem !important; }
-
-.p-r-2,
-.p-x-2 {
-  padding-right: 2rem !important; }
-
-.p-b-2,
-.p-y-2 {
-  padding-bottom: 2rem !important; }
-
-.p-l-2,
-.p-x-2 {
-  padding-left: 2rem !important; }
-
-.p-a-3 {
-  padding: 3rem !important; }
-
-.p-t-3,
-.p-y-3 {
-  padding-top: 3rem !important; }
-
-.p-r-3,
-.p-x-3 {
-  padding-right: 3rem !important; }
-
-.p-b-3,
-.p-y-3 {
-  padding-bottom: 3rem !important; }
-
-.p-l-3,
-.p-x-3 {
-  padding-left: 3rem !important; }
-
-input[disabled] {
-  cursor: not-allowed; }
-
-.row-fluid {
-  display: flex;
-  flex-wrap: wrap;
-  margin-right: -15px;
-  margin-left: -15px; }
-
-/*rtl:raw:
-.dropdown-menu-right {
-    right: 0;
-    left: auto;
-}
-.dropdown-menu-left {
-    right: auto;
-    left: 0;
-}
-*/
 /**
  * Bootstrap overrides for RTL
  *
@@ -9630,6 +9625,14 @@ input[disabled] {
     text-align: right;
 }
 */
+/**
+ * Moodle variables
+ *
+ * Variables written for Moodle specific components
+ *
+ * Please do not override any Bootstrap variables here, custom Bootstrap variable should go in
+ * preset files instead.
+ */
 /* core.less */
 #region-main {
   overflow-x: auto;
@@ -11597,6 +11600,10 @@ div.editor_atto_toolbar button .icon {
   /* stylelint-disable-line declaration-no-important */ }
 
 .line-height-5 {
+  line-height: 2rem !important;
+  /* stylelint-disable-line declaration-no-important */ }
+
+.line-height-6 {
   line-height: 3rem !important;
   /* stylelint-disable-line declaration-no-important */ }
 
@@ -11654,6 +11661,19 @@ body.h5p-embed .h5pmessages {
   float: right !important;
   /* stylelint-disable-line declaration-no-important */ }
 
+.img-responsive {
+  max-width: 100%;
+  height: auto; }
+
+input[disabled] {
+  cursor: not-allowed; }
+
+.custom-select {
+  width: auto; }
+
+.fade.in {
+  opacity: 1; }
+
 .clamp-2 {
   display: -webkit-box;
   -webkit-box-orient: vertical;
@@ -16513,6 +16533,8 @@ textarea[data-auto-rows] {
 
 /** Atto fields do not have form-control because that would break the layout of the editor.
     So they need these extra styles to highlight the editor when there is a validation error. */
+/* stylelint-disable function-url-scheme-blacklist */
+/* stylelint-enable function-url-scheme-blacklist */
 .has-danger .editor_atto_content.form-control,
 .has-danger .editor_atto_content.form-control-danger {
   background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E");
@@ -16520,28 +16542,6 @@ textarea[data-auto-rows] {
   background-repeat: no-repeat;
   background-position: center right 1rem;
   background-size: 1.5rem; }
-  .has-danger .editor_atto_content.form-control .form-control-feedback,
-  .has-danger .editor_atto_content.form-control .form-control-label,
-  .has-danger .editor_atto_content.form-control .form-check-label,
-  .has-danger .editor_atto_content.form-control .form-check-inline,
-  .has-danger .editor_atto_content.form-control .custom-control,
-  .has-danger .editor_atto_content.form-control-danger .form-control-feedback,
-  .has-danger .editor_atto_content.form-control-danger .form-control-label,
-  .has-danger .editor_atto_content.form-control-danger .form-check-label,
-  .has-danger .editor_atto_content.form-control-danger .form-check-inline,
-  .has-danger .editor_atto_content.form-control-danger .custom-control {
-    color: #d43f3a; }
-  .has-danger .editor_atto_content.form-control .form-control,
-  .has-danger .editor_atto_content.form-control-danger .form-control {
-    border-color: #d43f3a; }
-  .has-danger .editor_atto_content.form-control .input-group-addon,
-  .has-danger .editor_atto_content.form-control-danger .input-group-addon {
-    color: #d43f3a;
-    border-color: #d43f3a;
-    background-color: #f9e2e1; }
-  .has-danger .editor_atto_content.form-control .form-control-feedback,
-  .has-danger .editor_atto_content.form-control-danger .form-control-feedback {
-    color: #d43f3a; }
 
 [data-filetypesbrowserbody] [aria-expanded="false"] > [role="group"],
 [data-filetypesbrowserbody] [aria-expanded="false"] [data-filetypesbrowserfeature="hideifcollapsed"],
@@ -17257,9 +17257,6 @@ select {
   float: left;
   margin-left: 4px; }
 
-.ie .row-fluid .desktop-first-column {
-  margin-left: 0; }
-
 .langmenu form {
   margin: 0; }
 
@@ -18946,7 +18943,7 @@ span[data-flexitour="container"] .modal-dialog {
   margin: 0; }
 
 span[data-flexitour="container"] div[data-role="arrow"] {
-  border-width: 11px; }
+  border-width: 1rem; }
 
 span[data-flexitour="container"] div[data-role="arrow"],
 span[data-flexitour="container"] div[data-role="arrow"]:after {
@@ -18961,9 +18958,9 @@ span[data-flexitour="container"] div[data-role="arrow"]:after {
 span[data-flexitour="container"][x-placement="top"], span[data-flexitour="container"][x-placement="top-start"] {
   margin-bottom: 1rem; }
   span[data-flexitour="container"][x-placement="top"] div[data-role="arrow"], span[data-flexitour="container"][x-placement="top-start"] div[data-role="arrow"] {
-    bottom: -11px;
+    bottom: -1rem;
     left: 50%;
-    margin-left: -11px;
+    margin-left: -1rem;
     border-bottom-width: 0;
     border-top-color: rgba(0, 0, 0, 0.25); }
   span[data-flexitour="container"][x-placement="top"] div[data-role="arrow"]:after, span[data-flexitour="container"][x-placement="top-start"] div[data-role="arrow"]:after {
@@ -18976,9 +18973,9 @@ span[data-flexitour="container"][x-placement="top"], span[data-flexitour="contai
 span[data-flexitour="container"][x-placement="bottom"], span[data-flexitour="container"][x-placement="bottom-start"] {
   margin-top: 1rem; }
   span[data-flexitour="container"][x-placement="bottom"] div[data-role="arrow"], span[data-flexitour="container"][x-placement="bottom-start"] div[data-role="arrow"] {
-    top: -11px;
+    top: -1rem;
     left: 50%;
-    margin-left: -11px;
+    margin-left: -1rem;
     border-top-width: 0;
     border-bottom-color: rgba(0, 0, 0, 0.25); }
   span[data-flexitour="container"][x-placement="bottom"] div[data-role="arrow"]:after, span[data-flexitour="container"][x-placement="bottom-start"] div[data-role="arrow"]:after {
@@ -18991,9 +18988,9 @@ span[data-flexitour="container"][x-placement="bottom"], span[data-flexitour="con
 span[data-flexitour="container"][x-placement="left"], span[data-flexitour="container"][x-placement="left-start"] {
   margin-right: 1rem; }
   span[data-flexitour="container"][x-placement="left"] div[data-role="arrow"], span[data-flexitour="container"][x-placement="left-start"] div[data-role="arrow"] {
-    right: -11px;
+    right: -1rem;
     top: 50%;
-    margin-top: -11px;
+    margin-top: -1rem;
     border-right-width: 0;
     border-left-color: rgba(0, 0, 0, 0.25); }
   span[data-flexitour="container"][x-placement="left"] div[data-role="arrow"]:after, span[data-flexitour="container"][x-placement="left-start"] div[data-role="arrow"]:after {
@@ -19006,9 +19003,9 @@ span[data-flexitour="container"][x-placement="left"], span[data-flexitour="conta
 span[data-flexitour="container"][x-placement="right"], span[data-flexitour="container"][x-placement="right-start"] {
   margin-left: 1rem; }
   span[data-flexitour="container"][x-placement="right"] div[data-role="arrow"], span[data-flexitour="container"][x-placement="right-start"] div[data-role="arrow"] {
-    left: -11px;
+    left: -1rem;
     top: 50%;
-    margin-top: -11px;
+    margin-top: -1rem;
     border-left-width: 0;
     border-right-color: rgba(0, 0, 0, 0.25); }
   span[data-flexitour="container"][x-placement="right"] div[data-role="arrow"]:after, span[data-flexitour="container"][x-placement="right-start"] div[data-role="arrow"]:after {
@@ -19023,113 +19020,6 @@ span[data-flexitour="container"][x-placement="right"], span[data-flexitour="cont
   margin-left: -15px;
   width: 275px; }
 
-.well {
-  border: 1px solid #dee2e6;
-  padding: 1.25rem; }
-
-.img-responsive {
-  max-width: 100%;
-  height: auto; }
-
-.text-error {
-  color: #d43f3a; }
-
-.btn-default {
-  color: #212529;
-  background-color: #ced4da;
-  border-color: #ced4da; }
-  .btn-default:hover {
-    color: #212529;
-    background-color: #b8c1ca;
-    border-color: #b1bbc4; }
-  .btn-default:focus, .btn-default.focus {
-    color: #212529;
-    background-color: #b8c1ca;
-    border-color: #b1bbc4;
-    box-shadow: 0 0 0 0.2rem rgba(180, 186, 191, 0.5); }
-  .btn-default.disabled, .btn-default:disabled {
-    color: #212529;
-    background-color: #ced4da;
-    border-color: #ced4da; }
-  .btn-default:not(:disabled):not(.disabled):active, .btn-default:not(:disabled):not(.disabled).active,
-  .show > .btn-default.dropdown-toggle {
-    color: #212529;
-    background-color: #b1bbc4;
-    border-color: #aab4bf; }
-    .btn-default:not(:disabled):not(.disabled):active:focus, .btn-default:not(:disabled):not(.disabled).active:focus,
-    .show > .btn-default.dropdown-toggle:focus {
-      box-shadow: 0 0 0 0.2rem rgba(180, 186, 191, 0.5); }
-
-.label {
-  display: inline-block;
-  padding: 0.25em 0.4em;
-  font-size: 75%;
-  font-weight: 700;
-  line-height: 1;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline;
-  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-  color: #fff;
-  background-color: #6c757d; }
-  @media (prefers-reduced-motion: reduce) {
-    .label {
-      transition: none; } }
-  a.label:hover, a.label:focus {
-    color: #fff;
-    background-color: #545b62; }
-  a.label:focus, a.label.focus {
-    outline: 0;
-    box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); }
-
-.label-success {
-  color: #fff;
-  background-color: #398439; }
-  a.label-success:hover, a.label-success:focus {
-    color: #fff;
-    background-color: #2a602a; }
-  a.label-success:focus, a.label-success.focus {
-    outline: 0;
-    box-shadow: 0 0 0 0.2rem rgba(57, 132, 57, 0.5); }
-
-.label-info {
-  color: #212529;
-  background-color: #5bc0de; }
-  a.label-info:hover, a.label-info:focus {
-    color: #212529;
-    background-color: #31b0d5; }
-  a.label-info:focus, a.label-info.focus {
-    outline: 0;
-    box-shadow: 0 0 0 0.2rem rgba(91, 192, 222, 0.5); }
-
-.label-warning {
-  color: #212529;
-  background-color: #f0ad4e; }
-  a.label-warning:hover, a.label-warning:focus {
-    color: #212529;
-    background-color: #ec971f; }
-  a.label-warning:focus, a.label-warning.focus {
-    outline: 0;
-    box-shadow: 0 0 0 0.2rem rgba(240, 173, 78, 0.5); }
-
-.label-important {
-  color: #fff;
-  background-color: #d43f3a; }
-  a.label-important:hover, a.label-important:focus {
-    color: #fff;
-    background-color: #b42c27; }
-  a.label-important:focus, a.label-important.focus {
-    outline: 0;
-    box-shadow: 0 0 0 0.2rem rgba(212, 63, 58, 0.5); }
-
-.pull-left {
-  float: left !important;
-  /* stylelint-disable-line declaration-no-important */ }
-
-.pull-right {
-  float: right !important;
-  /* stylelint-disable-line declaration-no-important */ }
-
 @media print {
   body.drawer-open-left.jsenabled,
   body.drawer-open-right.jsenabled {
index c5f2517..c5a370d 100644 (file)
@@ -76,6 +76,17 @@ $theme-colors: map-merge((
 ), $theme-colors);
 // stylelint-enable
 
+$spacer: 1rem !default;
+$spacers: (
+    0: 0,
+    1: ($spacer * .25),
+    2: ($spacer * .5),
+    3: $spacer,
+    4: ($spacer * 1.5),
+    5: ($spacer * 2),
+    6: ($spacer * 3)
+) !default;
+
 // Import FontAwesome.
 @import "fontawesome";
 
index b64067e..d673dfc 100644 (file)
@@ -8082,22 +8082,41 @@ button.bg-dark:focus {
   margin-left: 1.5rem !important; }
 
 .m-5 {
-  margin: 3rem !important; }
+  margin: 2rem !important; }
 
 .mt-5,
 .my-5 {
-  margin-top: 3rem !important; }
+  margin-top: 2rem !important; }
 
 .mr-5,
 .mx-5 {
-  margin-right: 3rem !important; }
+  margin-right: 2rem !important; }
 
 .mb-5,
 .my-5 {
-  margin-bottom: 3rem !important; }
+  margin-bottom: 2rem !important; }
 
 .ml-5,
 .mx-5 {
+  margin-left: 2rem !important; }
+
+.m-6 {
+  margin: 3rem !important; }
+
+.mt-6,
+.my-6 {
+  margin-top: 3rem !important; }
+
+.mr-6,
+.mx-6 {
+  margin-right: 3rem !important; }
+
+.mb-6,
+.my-6 {
+  margin-bottom: 3rem !important; }
+
+.ml-6,
+.mx-6 {
   margin-left: 3rem !important; }
 
 .p-0 {
@@ -8196,22 +8215,41 @@ button.bg-dark:focus {
   padding-left: 1.5rem !important; }
 
 .p-5 {
-  padding: 3rem !important; }
+  padding: 2rem !important; }
 
 .pt-5,
 .py-5 {
-  padding-top: 3rem !important; }
+  padding-top: 2rem !important; }
 
 .pr-5,
 .px-5 {
-  padding-right: 3rem !important; }
+  padding-right: 2rem !important; }
 
 .pb-5,
 .py-5 {
-  padding-bottom: 3rem !important; }
+  padding-bottom: 2rem !important; }
 
 .pl-5,
 .px-5 {
+  padding-left: 2rem !important; }
+
+.p-6 {
+  padding: 3rem !important; }
+
+.pt-6,
+.py-6 {
+  padding-top: 3rem !important; }
+
+.pr-6,
+.px-6 {
+  padding-right: 3rem !important; }
+
+.pb-6,
+.py-6 {
+  padding-bottom: 3rem !important; }
+
+.pl-6,
+.px-6 {
   padding-left: 3rem !important; }
 
 .m-n1 {
@@ -8291,22 +8329,41 @@ button.bg-dark:focus {
   margin-left: -1.5rem !important; }
 
 .m-n5 {
-  margin: -3rem !important; }
+  margin: -2rem !important; }
 
 .mt-n5,
 .my-n5 {
-  margin-top: -3rem !important; }
+  margin-top: -2rem !important; }
 
 .mr-n5,
 .mx-n5 {
-  margin-right: -3rem !important; }
+  margin-right: -2rem !important; }
 
 .mb-n5,
 .my-n5 {
-  margin-bottom: -3rem !important; }
+  margin-bottom: -2rem !important; }
 
 .ml-n5,
 .mx-n5 {
+  margin-left: -2rem !important; }
+
+.m-n6 {
+  margin: -3rem !important; }
+
+.mt-n6,
+.my-n6 {
+  margin-top: -3rem !important; }
+
+.mr-n6,
+.mx-n6 {
+  margin-right: -3rem !important; }
+
+.mb-n6,
+.my-n6 {
+  margin-bottom: -3rem !important; }
+
+.ml-n6,
+.mx-n6 {
   margin-left: -3rem !important; }
 
 .m-auto {
@@ -8400,18 +8457,32 @@ button.bg-dark:focus {
   .mx-sm-4 {
     margin-left: 1.5rem !important; }
   .m-sm-5 {
-    margin: 3rem !important; }
+    margin: 2rem !important; }
   .mt-sm-5,
   .my-sm-5 {
-    margin-top: 3rem !important; }
+    margin-top: 2rem !important; }
   .mr-sm-5,
   .mx-sm-5 {
-    margin-right: 3rem !important; }
+    margin-right: 2rem !important; }
   .mb-sm-5,
   .my-sm-5 {
-    margin-bottom: 3rem !important; }
+    margin-bottom: 2rem !important; }
   .ml-sm-5,
   .mx-sm-5 {
+    margin-left: 2rem !important; }
+  .m-sm-6 {
+    margin: 3rem !important; }
+  .mt-sm-6,
+  .my-sm-6 {
+    margin-top: 3rem !important; }
+  .mr-sm-6,
+  .mx-sm-6 {
+    margin-right: 3rem !important; }
+  .mb-sm-6,
+  .my-sm-6 {
+    margin-bottom: 3rem !important; }
+  .ml-sm-6,
+  .mx-sm-6 {
     margin-left: 3rem !important; }
   .p-sm-0 {
     padding: 0 !important; }
@@ -8484,18 +8555,32 @@ button.bg-dark:focus {
   .px-sm-4 {
     padding-left: 1.5rem !important; }
   .p-sm-5 {
-    padding: 3rem !important; }
+    padding: 2rem !important; }
   .pt-sm-5,
   .py-sm-5 {
-    padding-top: 3rem !important; }
+    padding-top: 2rem !important; }
   .pr-sm-5,
   .px-sm-5 {
-    padding-right: 3rem !important; }
+    padding-right: 2rem !important; }
   .pb-sm-5,
   .py-sm-5 {
-    padding-bottom: 3rem !important; }
+    padding-bottom: 2rem !important; }
   .pl-sm-5,
   .px-sm-5 {
+    padding-left: 2rem !important; }
+  .p-sm-6 {
+    padding: 3rem !important; }
+  .pt-sm-6,
+  .py-sm-6 {
+    padding-top: 3rem !important; }
+  .pr-sm-6,
+  .px-sm-6 {
+    padding-right: 3rem !important; }
+  .pb-sm-6,
+  .py-sm-6 {
+    padding-bottom: 3rem !important; }
+  .pl-sm-6,
+  .px-sm-6 {
     padding-left: 3rem !important; }
   .m-sm-n1 {
     margin: -0.25rem !important; }
@@ -8554,18 +8639,32 @@ button.bg-dark:focus {
   .mx-sm-n4 {
     margin-left: -1.5rem !important; }
   .m-sm-n5 {
-    margin: -3rem !important; }
+    margin: -2rem !important; }
   .mt-sm-n5,
   .my-sm-n5 {
-    margin-top: -3rem !important; }
+    margin-top: -2rem !important; }
   .mr-sm-n5,
   .mx-sm-n5 {
-    margin-right: -3rem !important; }
+    margin-right: -2rem !important; }
   .mb-sm-n5,
   .my-sm-n5 {
-    margin-bottom: -3rem !important; }
+    margin-bottom: -2rem !important; }
   .ml-sm-n5,
   .mx-sm-n5 {
+    margin-left: -2rem !important; }
+  .m-sm-n6 {
+    margin: -3rem !important; }
+  .mt-sm-n6,
+  .my-sm-n6 {
+    margin-top: -3rem !important; }
+  .mr-sm-n6,
+  .mx-sm-n6 {
+    margin-right: -3rem !important; }
+  .mb-sm-n6,
+  .my-sm-n6 {
+    margin-bottom: -3rem !important; }
+  .ml-sm-n6,
+  .mx-sm-n6 {
     margin-left: -3rem !important; }
   .m-sm-auto {
     margin: auto !important; }
@@ -8654,18 +8753,32 @@ button.bg-dark:focus {
   .mx-md-4 {
     margin-left: 1.5rem !important; }
   .m-md-5 {
-    margin: 3rem !important; }
+    margin: 2rem !important; }
   .mt-md-5,
   .my-md-5 {
-    margin-top: 3rem !important; }
+    margin-top: 2rem !important; }
   .mr-md-5,
   .mx-md-5 {
-    margin-right: 3rem !important; }
+    margin-right: 2rem !important; }
   .mb-md-5,
   .my-md-5 {
-    margin-bottom: 3rem !important; }
+    margin-bottom: 2rem !important; }
   .ml-md-5,
   .mx-md-5 {
+    margin-left: 2rem !important; }
+  .m-md-6 {
+    margin: 3rem !important; }
+  .mt-md-6,
+  .my-md-6 {
+    margin-top: 3rem !important; }
+  .mr-md-6,
+  .mx-md-6 {
+    margin-right: 3rem !important; }
+  .mb-md-6,
+  .my-md-6 {
+    margin-bottom: 3rem !important; }
+  .ml-md-6,
+  .mx-md-6 {
     margin-left: 3rem !important; }
   .p-md-0 {
     padding: 0 !important; }
@@ -8738,18 +8851,32 @@ button.bg-dark:focus {
   .px-md-4 {
     padding-left: 1.5rem !important; }
   .p-md-5 {
-    padding: 3rem !important; }
+    padding: 2rem !important; }
   .pt-md-5,
   .py-md-5 {
-    padding-top: 3rem !important; }
+    padding-top: 2rem !important; }
   .pr-md-5,
   .px-md-5 {
-    padding-right: 3rem !important; }
+    padding-right: 2rem !important; }
   .pb-md-5,
   .py-md-5 {
-    padding-bottom: 3rem !important; }
+    padding-bottom: 2rem !important; }
   .pl-md-5,
   .px-md-5 {
+    padding-left: 2rem !important; }
+  .p-md-6 {
+    padding: 3rem !important; }
+  .pt-md-6,
+  .py-md-6 {
+    padding-top: 3rem !important; }
+  .pr-md-6,
+  .px-md-6 {
+    padding-right: 3rem !important; }
+  .pb-md-6,
+  .py-md-6 {
+    padding-bottom: 3rem !important; }
+  .pl-md-6,
+  .px-md-6 {
     padding-left: 3rem !important; }
   .m-md-n1 {
     margin: -0.25rem !important; }
@@ -8808,18 +8935,32 @@ button.bg-dark:focus {
   .mx-md-n4 {
     margin-left: -1.5rem !important; }
   .m-md-n5 {
-    margin: -3rem !important; }
+    margin: -2rem !important; }
   .mt-md-n5,
   .my-md-n5 {
-    margin-top: -3rem !important; }
+    margin-top: -2rem !important; }
   .mr-md-n5,
   .mx-md-n5 {
-    margin-right: -3rem !important; }
+    margin-right: -2rem !important; }
   .mb-md-n5,
   .my-md-n5 {
-    margin-bottom: -3rem !important; }
+    margin-bottom: -2rem !important; }
   .ml-md-n5,
   .mx-md-n5 {
+    margin-left: -2rem !important; }
+  .m-md-n6 {
+    margin: -3rem !important; }
+  .mt-md-n6,
+  .my-md-n6 {
+    margin-top: -3rem !important; }
+  .mr-md-n6,
+  .mx-md-n6 {
+    margin-right: -3rem !important; }
+  .mb-md-n6,
+  .my-md-n6 {
+    margin-bottom: -3rem !important; }
+  .ml-md-n6,
+  .mx-md-n6 {
     margin-left: -3rem !important; }
   .m-md-auto {
     margin: auto !important; }
@@ -8908,18 +9049,32 @@ button.bg-dark:focus {
   .mx-lg-4 {
     margin-left: 1.5rem !important; }
   .m-lg-5 {
-    margin: 3rem !important; }
+    margin: 2rem !important; }
   .mt-lg-5,
   .my-lg-5 {
-    margin-top: 3rem !important; }
+    margin-top: 2rem !important; }
   .mr-lg-5,
   .mx-lg-5 {
-    margin-right: 3rem !important; }
+    margin-right: 2rem !important; }
   .mb-lg-5,
   .my-lg-5 {
-    margin-bottom: 3rem !important; }
+    margin-bottom: 2rem !important; }
   .ml-lg-5,
   .mx-lg-5 {
+    margin-left: 2rem !important; }
+  .m-lg-6 {
+    margin: 3rem !important; }
+  .mt-lg-6,
+  .my-lg-6 {
+    margin-top: 3rem !important; }
+  .mr-lg-6,
+  .mx-lg-6 {
+    margin-right: 3rem !important; }
+  .mb-lg-6,
+  .my-lg-6 {
+    margin-bottom: 3rem !important; }
+  .ml-lg-6,
+  .mx-lg-6 {
     margin-left: 3rem !important; }
   .p-lg-0 {
     padding: 0 !important; }
@@ -8992,18 +9147,32 @@ button.bg-dark:focus {
   .px-lg-4 {
     padding-left: 1.5rem !important; }
   .p-lg-5 {
-    padding: 3rem !important; }
+    padding: 2rem !important; }
   .pt-lg-5,
   .py-lg-5 {
-    padding-top: 3rem !important; }
+    padding-top: 2rem !important; }
   .pr-lg-5,
   .px-lg-5 {
-    padding-right: 3rem !important; }
+    padding-right: 2rem !important; }
   .pb-lg-5,
   .py-lg-5 {
-    padding-bottom: 3rem !important; }
+    padding-bottom: 2rem !important; }
   .pl-lg-5,
   .px-lg-5 {
+    padding-left: 2rem !important; }
+  .p-lg-6 {
+    padding: 3rem !important; }
+  .pt-lg-6,
+  .py-lg-6 {
+    padding-top: 3rem !important; }
+  .pr-lg-6,
+  .px-lg-6 {
+    padding-right: 3rem !important; }
+  .pb-lg-6,
+  .py-lg-6 {
+    padding-bottom: 3rem !important; }
+  .pl-lg-6,
+  .px-lg-6 {
     padding-left: 3rem !important; }
   .m-lg-n1 {
     margin: -0.25rem !important; }
@@ -9062,18 +9231,32 @@ button.bg-dark:focus {
   .mx-lg-n4 {
     margin-left: -1.5rem !important; }
   .m-lg-n5 {
-    margin: -3rem !important; }
+    margin: -2rem !important; }
   .mt-lg-n5,
   .my-lg-n5 {
-    margin-top: -3rem !important; }
+    margin-top: -2rem !important; }
   .mr-lg-n5,
   .mx-lg-n5 {
-    margin-right: -3rem !important; }
+    margin-right: -2rem !important; }
   .mb-lg-n5,
   .my-lg-n5 {
-    margin-bottom: -3rem !important; }
+    margin-bottom: -2rem !important; }
   .ml-lg-n5,
   .mx-lg-n5 {
+    margin-left: -2rem !important; }
+  .m-lg-n6 {
+    margin: -3rem !important; }
+  .mt-lg-n6,
+  .my-lg-n6 {
+    margin-top: -3rem !important; }
+  .mr-lg-n6,
+  .mx-lg-n6 {
+    margin-right: -3rem !important; }
+  .mb-lg-n6,
+  .my-lg-n6 {
+    margin-bottom: -3rem !important; }
+  .ml-lg-n6,
+  .mx-lg-n6 {
     margin-left: -3rem !important; }
   .m-lg-auto {
     margin: auto !important; }
@@ -9162,18 +9345,32 @@ button.bg-dark:focus {
   .mx-xl-4 {
     margin-left: 1.5rem !important; }
   .m-xl-5 {
-    margin: 3rem !important; }
+    margin: 2rem !important; }
   .mt-xl-5,
   .my-xl-5 {
-    margin-top: 3rem !important; }
+    margin-top: 2rem !important; }
   .mr-xl-5,
   .mx-xl-5 {
-    margin-right: 3rem !important; }
+    margin-right: 2rem !important; }
   .mb-xl-5,
   .my-xl-5 {
-    margin-bottom: 3rem !important; }
+    margin-bottom: 2rem !important; }
   .ml-xl-5,
   .mx-xl-5 {
+    margin-left: 2rem !important; }
+  .m-xl-6 {
+    margin: 3rem !important; }
+  .mt-xl-6,
+  .my-xl-6 {
+    margin-top: 3rem !important; }
+  .mr-xl-6,
+  .mx-xl-6 {
+    margin-right: 3rem !important; }
+  .mb-xl-6,
+  .my-xl-6 {
+    margin-bottom: 3rem !important; }
+  .ml-xl-6,
+  .mx-xl-6 {
     margin-left: 3rem !important; }
   .p-xl-0 {
     padding: 0 !important; }
@@ -9246,18 +9443,32 @@ button.bg-dark:focus {
   .px-xl-4 {
     padding-left: 1.5rem !important; }
   .p-xl-5 {
-    padding: 3rem !important; }
+    padding: 2rem !important; }
   .pt-xl-5,
   .py-xl-5 {
-    padding-top: 3rem !important; }
+    padding-top: 2rem !important; }
   .pr-xl-5,
   .px-xl-5 {
-    padding-right: 3rem !important; }
+    padding-right: 2rem !important; }
   .pb-xl-5,
   .py-xl-5 {
-    padding-bottom: 3rem !important; }
+    padding-bottom: 2rem !important; }
   .pl-xl-5,
   .px-xl-5 {
+    padding-left: 2rem !important; }
+  .p-xl-6 {
+    padding: 3rem !important; }
+  .pt-xl-6,
+  .py-xl-6 {
+    padding-top: 3rem !important; }
+  .pr-xl-6,
+  .px-xl-6 {
+    padding-right: 3rem !important; }
+  .pb-xl-6,
+  .py-xl-6 {
+    padding-bottom: 3rem !important; }
+  .pl-xl-6,
+  .px-xl-6 {
     padding-left: 3rem !important; }
   .m-xl-n1 {
     margin: -0.25rem !important; }
@@ -9316,18 +9527,32 @@ button.bg-dark:focus {
   .mx-xl-n4 {
     margin-left: -1.5rem !important; }
   .m-xl-n5 {
-    margin: -3rem !important; }
+    margin: -2rem !important; }
   .mt-xl-n5,
   .my-xl-n5 {
-    margin-top: -3rem !important; }
+    margin-top: -2rem !important; }
   .mr-xl-n5,
   .mx-xl-n5 {
-    margin-right: -3rem !important; }
+    margin-right: -2rem !important; }
   .mb-xl-n5,
   .my-xl-n5 {
-    margin-bottom: -3rem !important; }
+    margin-bottom: -2rem !important; }
   .ml-xl-n5,
   .mx-xl-n5 {
+    margin-left: -2rem !important; }
+  .m-xl-n6 {
+    margin: -3rem !important; }
+  .mt-xl-n6,
+  .my-xl-n6 {
+    margin-top: -3rem !important; }
+  .mr-xl-n6,
+  .mx-xl-n6 {
+    margin-right: -3rem !important; }
+  .mb-xl-n6,
+  .my-xl-n6 {
+    margin-bottom: -3rem !important; }
+  .ml-xl-n6,
+  .mx-xl-n6 {
     margin-left: -3rem !important; }
   .m-xl-auto {
     margin: auto !important; }
@@ -9581,237 +9806,6 @@ a.text-dark:hover, a.text-dark:focus {
     color: inherit;
     border-color: #dee2e6; } }
 
-/* stylelint-disable function-url-scheme-blacklist */
-/* stylelint-enable function-url-scheme-blacklist */
-.tag {
-  display: inline-block;
-  padding: 0.25rem 0.4em;
-  font-size: 75%;
-  font-weight: bold;
-  line-height: 1;
-  color: #fff;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline;
-  border-radius: 0.25rem; }
-  .tag:empty {
-    display: none; }
-
-.form-control-success,
-.form-control-warning,
-.form-control-danger {
-  padding-right: 2.25rem;
-  background-repeat: no-repeat;
-  background-position: center right calc(1.5em + 0.75rem + 2px)/4;
-  background-size: calc(1.5em + 0.75rem + 2px)/2 calc(1.5em + 0.75rem + 2px)/2; }
-
-.tag-default {
-  background-color: #6c757d; }
-  .tag-default[href]:hover, .tag-default[href]:focus {
-    background-color: #545b62; }
-
-.tag-primary {
-  background-color: #1177d1; }
-  .tag-primary[href]:hover, .tag-primary[href]:focus {
-    background-color: #0d5ca2; }
-
-.tag-success {
-  background-color: #398439; }
-  .tag-success[href]:hover, .tag-success[href]:focus {
-    background-color: #2a602a; }
-
-.tag-info {
-  background-color: #5bc0de; }
-  .tag-info[href]:hover, .tag-info[href]:focus {
-    background-color: #31b0d5; }
-
-.tag-warning {
-  background-color: #f0ad4e; }
-  .tag-warning[href]:hover, .tag-warning[href]:focus {
-    background-color: #ec971f; }
-
-.tag-danger {
-  background-color: #d43f3a; }
-  .tag-danger[href]:hover, .tag-danger[href]:focus {
-    background-color: #b42c27; }
-
-.custom-select {
-  width: auto; }
-
-.fade.in {
-  opacity: 1; }
-
-.m-a-0 {
-  margin: 0 !important; }
-
-.m-t-0,
-.m-y-0 {
-  margin-top: 0 !important; }
-
-.m-r-0,
-.m-x-0 {
-  margin-right: 0 !important; }
-
-.m-b-0,
-.m-y-0 {
-  margin-bottom: 0 !important; }
-
-.m-l-0,
-.m-x-0 {
-  margin-left: 0 !important; }
-
-.m-a-1 {
-  margin: 1rem !important; }
-
-.m-t-1,
-.m-y-1 {
-  margin-top: 1rem !important; }
-
-.m-r-1,
-.m-x-1 {
-  margin-right: 1rem !important; }
-
-.m-b-1,
-.m-y-1 {
-  margin-bottom: 1rem !important; }
-
-.m-l-1,
-.m-x-1 {
-  margin-left: 1rem !important; }
-
-.m-a-2 {
-  margin: 2rem !important; }
-
-.m-t-2,
-.m-y-2 {
-  margin-top: 2rem !important; }
-
-.m-r-2,
-.m-x-2 {
-  margin-right: 2rem !important; }
-
-.m-b-2,
-.m-y-2 {
-  margin-bottom: 2rem !important; }
-
-.m-l-2,
-.m-x-2 {
-  margin-left: 2rem !important; }
-
-.m-a-3 {
-  margin: 3rem !important; }
-
-.m-t-3,
-.m-y-3 {
-  margin-top: 3rem !important; }
-
-.m-r-3,
-.m-x-3 {
-  margin-right: 3rem !important; }
-
-.m-b-3,
-.m-y-3 {
-  margin-bottom: 3rem !important; }
-
-.m-l-3,
-.m-x-3 {
-  margin-left: 3rem !important; }
-
-.p-a-0 {
-  padding: 0 !important; }
-
-.p-t-0,
-.p-y-0 {
-  padding-top: 0 !important; }
-
-.p-r-0,
-.p-x-0 {
-  padding-right: 0 !important; }
-
-.p-b-0,
-.p-y-0 {
-  padding-bottom: 0 !important; }
-
-.p-l-0,
-.p-x-0 {
-  padding-left: 0 !important; }
-
-.p-a-1 {
-  padding: 1rem !important; }
-
-.p-t-1,
-.p-y-1 {
-  padding-top: 1rem !important; }
-
-.p-r-1,
-.p-x-1 {
-  padding-right: 1rem !important; }
-
-.p-b-1,
-.p-y-1 {
-  padding-bottom: 1rem !important; }
-
-.p-l-1,
-.p-x-1 {
-  padding-left: 1rem !important; }
-
-.p-a-2 {
-  padding: 2rem !important; }
-
-.p-t-2,
-.p-y-2 {
-  padding-top: 2rem !important; }
-
-.p-r-2,
-.p-x-2 {
-  padding-right: 2rem !important; }
-
-.p-b-2,
-.p-y-2 {
-  padding-bottom: 2rem !important; }
-
-.p-l-2,
-.p-x-2 {
-  padding-left: 2rem !important; }
-
-.p-a-3 {
-  padding: 3rem !important; }
-
-.p-t-3,
-.p-y-3 {
-  padding-top: 3rem !important; }
-
-.p-r-3,
-.p-x-3 {
-  padding-right: 3rem !important; }
-
-.p-b-3,
-.p-y-3 {
-  padding-bottom: 3rem !important; }
-
-.p-l-3,
-.p-x-3 {
-  padding-left: 3rem !important; }
-
-input[disabled] {
-  cursor: not-allowed; }
-
-.row-fluid {
-  display: flex;
-  flex-wrap: wrap;
-  margin-right: -15px;
-  margin-left: -15px; }
-
-/*rtl:raw:
-.dropdown-menu-right {
-    right: 0;
-    left: auto;
-}
-.dropdown-menu-left {
-    right: auto;
-    left: 0;
-}
-*/
 /**
  * Bootstrap overrides for RTL
  *
@@ -9834,6 +9828,14 @@ input[disabled] {
     text-align: right;
 }
 */
+/**
+ * Moodle variables
+ *
+ * Variables written for Moodle specific components
+ *
+ * Please do not override any Bootstrap variables here, custom Bootstrap variable should go in
+ * preset files instead.
+ */
 /* core.less */
 #region-main {
   overflow-x: auto;
@@ -11808,6 +11810,10 @@ div.editor_atto_toolbar button .icon {
   /* stylelint-disable-line declaration-no-important */ }
 
 .line-height-5 {
+  line-height: 2rem !important;
+  /* stylelint-disable-line declaration-no-important */ }
+
+.line-height-6 {
   line-height: 3rem !important;
   /* stylelint-disable-line declaration-no-important */ }
 
@@ -11865,6 +11871,19 @@ body.h5p-embed .h5pmessages {
   float: right !important;
   /* stylelint-disable-line declaration-no-important */ }
 
+.img-responsive {
+  max-width: 100%;
+  height: auto; }
+
+input[disabled] {
+  cursor: not-allowed; }
+
+.custom-select {
+  width: auto; }
+
+.fade.in {
+  opacity: 1; }
+
 .clamp-2 {
   display: -webkit-box;
   -webkit-box-orient: vertical;
@@ -16742,6 +16761,8 @@ textarea[data-auto-rows] {
 
 /** Atto fields do not have form-control because that would break the layout of the editor.
     So they need these extra styles to highlight the editor when there is a validation error. */
+/* stylelint-disable function-url-scheme-blacklist */
+/* stylelint-enable function-url-scheme-blacklist */
 .has-danger .editor_atto_content.form-control,
 .has-danger .editor_atto_content.form-control-danger {
   background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E");
@@ -16749,28 +16770,6 @@ textarea[data-auto-rows] {
   background-repeat: no-repeat;
   background-position: center right 1rem;
   background-size: 1.5rem; }
-  .has-danger .editor_atto_content.form-control .form-control-feedback,
-  .has-danger .editor_atto_content.form-control .form-control-label,
-  .has-danger .editor_atto_content.form-control .form-check-label,
-  .has-danger .editor_atto_content.form-control .form-check-inline,
-  .has-danger .editor_atto_content.form-control .custom-control,
-  .has-danger .editor_atto_content.form-control-danger .form-control-feedback,
-  .has-danger .editor_atto_content.form-control-danger .form-control-label,
-  .has-danger .editor_atto_content.form-control-danger .form-check-label,
-  .has-danger .editor_atto_content.form-control-danger .form-check-inline,
-  .has-danger .editor_atto_content.form-control-danger .custom-control {
-    color: #d43f3a; }
-  .has-danger .editor_atto_content.form-control .form-control,
-  .has-danger .editor_atto_content.form-control-danger .form-control {
-    border-color: #d43f3a; }
-  .has-danger .editor_atto_content.form-control .input-group-addon,
-  .has-danger .editor_atto_content.form-control-danger .input-group-addon {
-    color: #d43f3a;
-    border-color: #d43f3a;
-    background-color: #f9e2e1; }
-  .has-danger .editor_atto_content.form-control .form-control-feedback,
-  .has-danger .editor_atto_content.form-control-danger .form-control-feedback {
-    color: #d43f3a; }
 
 [data-filetypesbrowserbody] [aria-expanded="false"] > [role="group"],
 [data-filetypesbrowserbody] [aria-expanded="false"] [data-filetypesbrowserfeature="hideifcollapsed"],
@@ -17486,9 +17485,6 @@ select {
   float: left;
   margin-left: 4px; }
 
-.ie .row-fluid .desktop-first-column {
-  margin-left: 0; }
-
 .langmenu form {
   margin: 0; }
 
@@ -19130,7 +19126,7 @@ span[data-flexitour="container"] .modal-dialog {
   margin: 0; }
 
 span[data-flexitour="container"] div[data-role="arrow"] {
-  border-width: 11px; }
+  border-width: 1rem; }
 
 span[data-flexitour="container"] div[data-role="arrow"],
 span[data-flexitour="container"] div[data-role="arrow"]:after {
@@ -19145,9 +19141,9 @@ span[data-flexitour="container"] div[data-role="arrow"]:after {
 span[data-flexitour="container"][x-placement="top"], span[data-flexitour="container"][x-placement="top-start"] {
   margin-bottom: 1rem; }
   span[data-flexitour="container"][x-placement="top"] div[data-role="arrow"], span[data-flexitour="container"][x-placement="top-start"] div[data-role="arrow"] {
-    bottom: -11px;
+    bottom: -1rem;
     left: 50%;
-    margin-left: -11px;
+    margin-left: -1rem;
     border-bottom-width: 0;
     border-top-color: rgba(0, 0, 0, 0.25); }
   span[data-flexitour="container"][x-placement="top"] div[data-role="arrow"]:after, span[data-flexitour="container"][x-placement="top-start"] div[data-role="arrow"]:after {
@@ -19160,9 +19156,9 @@ span[data-flexitour="container"][x-placement="top"], span[data-flexitour="contai
 span[data-flexitour="container"][x-placement="bottom"], span[data-flexitour="container"][x-placement="bottom-start"] {
   margin-top: 1rem; }
   span[data-flexitour="container"][x-placement="bottom"] div[data-role="arrow"], span[data-flexitour="container"][x-placement="bottom-start"] div[data-role="arrow"] {
-    top: -11px;
+    top: -1rem;
     left: 50%;
-    margin-left: -11px;
+    margin-left: -1rem;
     border-top-width: 0;
     border-bottom-color: rgba(0, 0, 0, 0.25); }
   span[data-flexitour="container"][x-placement="bottom"] div[data-role="arrow"]:after, span[data-flexitour="container"][x-placement="bottom-start"] div[data-role="arrow"]:after {
@@ -19175,9 +19171,9 @@ span[data-flexitour="container"][x-placement="bottom"], span[data-flexitour="con
 span[data-flexitour="container"][x-placement="left"], span[data-flexitour="container"][x-placement="left-start"] {
   margin-right: 1rem; }
   span[data-flexitour="container"][x-placement="left"] div[data-role="arrow"], span[data-flexitour="container"][x-placement="left-start"] div[data-role="arrow"] {
-    right: -11px;
+    right: -1rem;
     top: 50%;
-    margin-top: -11px;
+    margin-top: -1rem;
     border-right-width: 0;
     border-left-color: rgba(0, 0, 0, 0.25); }
   span[data-flexitour="container"][x-placement="left"] div[data-role="arrow"]:after, span[data-flexitour="container"][x-placement="left-start"] div[data-role="arrow"]:after {
@@ -19190,9 +19186,9 @@ span[data-flexitour="container"][x-placement="left"], span[data-flexitour="conta
 span[data-flexitour="container"][x-placement="right"], span[data-flexitour="container"][x-placement="right-start"] {
   margin-left: 1rem; }
   span[data-flexitour="container"][x-placement="right"] div[data-role="arrow"], span[data-flexitour="container"][x-placement="right-start"] div[data-role="arrow"] {
-    left: -11px;
+    left: -1rem;
     top: 50%;
-    margin-top: -11px;
+    margin-top: -1rem;
     border-left-width: 0;
     border-right-color: rgba(0, 0, 0, 0.25); }
   span[data-flexitour="container"][x-placement="right"] div[data-role="arrow"]:after, span[data-flexitour="container"][x-placement="right-start"] div[data-role="arrow"]:after {
@@ -19207,114 +19203,6 @@ span[data-flexitour="container"][x-placement="right"], span[data-flexitour="cont
   margin-left: -15px;
   width: 275px; }
 
-.well {
-  border: 1px solid #dee2e6;
-  padding: 1.25rem; }
-
-.img-responsive {
-  max-width: 100%;
-  height: auto; }
-
-.text-error {
-  color: #d43f3a; }
-
-.btn-default {
-  color: #212529;
-  background-color: #ced4da;
-  border-color: #ced4da; }
-  .btn-default:hover {
-    color: #212529;
-    background-color: #b8c1ca;
-    border-color: #b1bbc4; }
-  .btn-default:focus, .btn-default.focus {
-    color: #212529;
-    background-color: #b8c1ca;
-    border-color: #b1bbc4;
-    box-shadow: 0 0 0 0.2rem rgba(180, 186, 191, 0.5); }
-  .btn-default.disabled, .btn-default:disabled {
-    color: #212529;
-    background-color: #ced4da;
-    border-color: #ced4da; }
-  .btn-default:not(:disabled):not(.disabled):active, .btn-default:not(:disabled):not(.disabled).active,
-  .show > .btn-default.dropdown-toggle {
-    color: #212529;
-    background-color: #b1bbc4;
-    border-color: #aab4bf; }
-    .btn-default:not(:disabled):not(.disabled):active:focus, .btn-default:not(:disabled):not(.disabled).active:focus,
-    .show > .btn-default.dropdown-toggle:focus {
-      box-shadow: 0 0 0 0.2rem rgba(180, 186, 191, 0.5); }
-
-.label {
-  display: inline-block;
-  padding: 0.25em 0.4em;
-  font-size: 75%;
-  font-weight: 700;
-  line-height: 1;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline;
-  border-radius: 0.25rem;
-  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-  color: #fff;
-  background-color: #6c757d; }
-  @media (prefers-reduced-motion: reduce) {
-    .label {
-      transition: none; } }
-  a.label:hover, a.label:focus {
-    color: #fff;
-    background-color: #545b62; }
-  a.label:focus, a.label.focus {
-    outline: 0;
-    box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); }
-
-.label-success {
-  color: #fff;
-  background-color: #398439; }
-  a.label-success:hover, a.label-success:focus {
-    color: #fff;
-    background-color: #2a602a; }
-  a.label-success:focus, a.label-success.focus {
-    outline: 0;
-    box-shadow: 0 0 0 0.2rem rgba(57, 132, 57, 0.5); }
-
-.label-info {
-  color: #212529;
-  background-color: #5bc0de; }
-  a.label-info:hover, a.label-info:focus {
-    color: #212529;
-    background-color: #31b0d5; }
-  a.label-info:focus, a.label-info.focus {
-    outline: 0;
-    box-shadow: 0 0 0 0.2rem rgba(91, 192, 222, 0.5); }
-
-.label-warning {
-  color: #212529;
-  background-color: #f0ad4e; }
-  a.label-warning:hover, a.label-warning:focus {
-    color: #212529;
-    background-color: #ec971f; }
-  a.label-warning:focus, a.label-warning.focus {
-    outline: 0;
-    box-shadow: 0 0 0 0.2rem rgba(240, 173, 78, 0.5); }
-
-.label-important {
-  color: #fff;
-  background-color: #d43f3a; }
-  a.label-important:hover, a.label-important:focus {
-    color: #fff;
-    background-color: #b42c27; }
-  a.label-important:focus, a.label-important.focus {
-    outline: 0;
-    box-shadow: 0 0 0 0.2rem rgba(212, 63, 58, 0.5); }
-
-.pull-left {
-  float: left !important;
-  /* stylelint-disable-line declaration-no-important */ }
-
-.pull-right {
-  float: right !important;
-  /* stylelint-disable-line declaration-no-important */ }
-
 @media print {
   body.drawer-open-left.jsenabled,
   body.drawer-open-right.jsenabled {
index fd0f96f..0c8b879 100644 (file)
@@ -115,7 +115,7 @@ if (!empty($CFG->enabledevicedetection) && empty($device)) {
                 $screenshoturl = new moodle_url('/theme/image.php',
                     array('theme' => $themename, 'image' => 'screenshot', 'component' => 'theme'));
                 // Contents of the screenshot/preview cell.
-                $screenshotcell = html_writer::empty_tag('img', array('class' => 'img-responsive img-fluid',
+                $screenshotcell = html_writer::empty_tag('img', array('class' => 'img-fluid',
                     'src' => $screenshoturl, 'alt' => $strthemename));
                 // Show the name of the picked theme.
                 $headingthemename = $OUTPUT->heading($strthemename, 3);
@@ -209,7 +209,7 @@ if (!empty($CFG->enabledevicedetection) && empty($device)) {
         $screenshotpath = new moodle_url('/theme/image.php',
             array('theme' => $themename, 'image' => 'screenshot', 'component' => 'theme'));
         // Contents of the first screenshot/preview cell.
-        $row[] = html_writer::empty_tag('img', array('class' => 'img-responsive img-fluid',
+        $row[] = html_writer::empty_tag('img', array('class' => 'img-fluid',
             'src' => $screenshotpath, 'alt' => $strthemename));
         // Contents of the second cell.
         $infocell = $OUTPUT->heading($strthemename, 3);
index 8aa4d4d..e0af226 100644 (file)
@@ -1,6 +1,28 @@
 This files describes API changes in /theme/* themes,
 information provided here is intended especially for theme designer.
 
+=== 4.0 ===
+* The Bootstrap legacy css utilities from Bootstrap 2 and 4alpha have been removed.
+The syntax for the new Bootstrap 4.5 utility classes is {property}{sides}-{breakpoint}-{size} for sm, md, lg, and xl.
+The size values are:
+1: 0.25rem
+2: 0.5rem
+3: 1rem
+4: 1.5rem
+5: 2rem
+6: 3rem
+
+In Bootstrap 4alpa a spacing utility class '.m-l-1' would mean margin-left 1rem. With the new spacing classes it should now be '.ml-3'
+
+These class names have changed:
+.row-fluid is now .row
+.text-error is now .text-danger
+
+These classes should no longer be used:
+.label .label-{type}, use .badge .badge-{type} instead
+.tag .tag-{type}, use .badge .badge-{type} instead
+.well, just set a border with .border and a background with .bg-light
+
 === 3.9 ===
 
 * Add class .d-print-block to #page, #page-wrapper and #page content to fix Firefox printing problems