# 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');" \
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
- >
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
// 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',
]
)
);
+
+ // 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'),
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 '';
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 '';
$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(
{{/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}}
<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>
<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>
<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>
<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>
{{#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>
<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}}
<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}}
{{/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>
<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}}
<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}}
"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>
{{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>
{{#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>
}
}}
<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>
</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">
'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;
}
}
}
$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>.';
$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'),
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() {
} else {
input.classList.add('is-invalid');
validationArea.innerText = result.message;
- validationArea.classList.add('text-error');
+ validationArea.classList.add('text-danger');
}
return;
}).catch();
<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">
<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">
<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}}
}
}
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;
$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.';
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') + '">' +
};
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">' +
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++) {
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>' +
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>';
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>';
'<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) {
* @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') + '" />');
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'));
$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;
}
<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">
</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>
</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}}
"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>
'type' => PARAM_RAW,
'default' => '',
],
+ 'daytitle' => [
+ 'type' => PARAM_RAW,
+ ]
]);
return $return;
$return['popovertitle'] = $popovertitle;
}
+ $return['daytitle'] = $this->get_day_title();
+
return $return;
}
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;
+ }
}
}} 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"{{!
<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>
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}}"
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>
<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}}
});
}).then(function(modal) {
modal.setSaveButtonText(saveButtonText);
- modal.getRoot().on(ModalEvents.save, function() {
+ modal.getRoot().on(ModalEvents.save, function(e) {
// The action is now confirmed, sending an action for it.
- var newname = $("#newname").val();
- return renameContent(contentid, newname);
+ var newname = $("#newname").val().trim();
+ if (newname) {
+ renameContent(contentid, newname);
+ } else {
+ var errorStrings = [
+ {
+ key: 'error',
+ },
+ {
+ key: 'emptynamenotallowed',
+ component: 'core_contentbank',
+ },
+ ];
+ Str.get_strings(errorStrings).then(function(langStrings) {
+ Notification.alert(langStrings[0], langStrings[1]);
+ }).catch(Notification.exception);
+ e.preventDefault();
+ }
});
// Handle hidden event.
};
var requestType = 'success';
Ajax.call([request])[0].then(function(data) {
- if (data) {
+ if (data.result) {
return 'contentrenamed';
}
requestType = 'error';
- return 'contentnotrenamed';
+ return data.warnings[0].message;
}).then(function(message) {
var params = null;
* @throws \coding_exception if not loaded.
*/
public function set_name(string $name): bool {
+ $name = trim($name);
if (empty($name)) {
return false;
}
$content = new $contentclass($record);
// Check capability.
if ($contenttype->can_manage($content)) {
- // This content can be renamed.
- if ($contenttype->rename_content($content, $params['name'])) {
- $result = true;
- } else {
+ if (empty(trim($name))) {
+ // If name is empty don't try to rename and return a more detailed message.
$warnings[] = [
'item' => $contentid,
- 'warningcode' => 'contentnotrenamed',
- 'message' => get_string('contentnotrenamed', 'core_contentbank')
+ 'warningcode' => 'emptynamenotallowed',
+ 'message' => get_string('emptynamenotallowed', 'core_contentbank')
];
+ } else {
+ // This content can be renamed.
+ if ($contenttype->rename_content($content, $params['name'])) {
+ $result = true;
+ } else {
+ $warnings[] = [
+ 'item' => $contentid,
+ 'warningcode' => 'contentnotrenamed',
+ 'message' => get_string('contentnotrenamed', 'core_contentbank')
+ ];
+ }
}
} else {
// The user has no permission to manage this content.
'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'],
];
}
*/
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],
];
}
* @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();
// 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);
}
*/
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],
];
}
*
* @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();
// 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);
$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(),
/** 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':
}
}}
{{#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>
</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}}
<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>
<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>
</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>
{{#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}}">
<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}}
<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>
}
});
});
-{{/js}}
\ No newline at end of file
+{{/js}}
<?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>
$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
);
// --- 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;
// 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 , (for comma separated csv files)
- //Note: semicolon within a field should be encoded as ; (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 {
}
}
+ $csvimport->close();
echo $OUTPUT->single_button($returnurl, get_string('continue'), 'get');
echo $OUTPUT->footer();
die;
/// Print the form
echo $OUTPUT->header();
echo $OUTPUT->heading_with_help($strimportgroups, 'importgroups', 'core_group');
-$mform_post ->display();
+$importform->display();
echo $OUTPUT->footer();
}
require_once($CFG->libdir.'/formslib.php');
+require_once($CFG->libdir . '/csvlib.class.php');
/**
* Groups import form class
$mform->addElement('hidden', 'id');
$mform->setType('id', PARAM_INT);
+ $choices = csv_import_reader::get_delimiter_list();
+ $mform->addElement('select', 'delimiter_name', get_string('csvdelimiter', 'group'), $choices);
+ if (array_key_exists('cfg', $choices)) {
+ $mform->setDefault('delimiter_name', 'cfg');
+ } else if (get_string('listsep', 'langconfig') == ';') {
+ $mform->setDefault('delimiter_name', 'semicolon');
+ } else {
+ $mform->setDefault('delimiter_name', 'comma');
+ }
+
+ $choices = core_text::get_encodings();
+ $mform->addElement('select', 'encoding', get_string('encoding', 'group'), $choices);
+ $mform->setDefault('encoding', 'UTF-8');
$this->add_action_buttons(true, get_string('importgroups', 'core_group'));
$this->set_data($data);
}}
<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">
$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:';
$string['contentsmoved'] = 'Content bank contents moved to {$a}.';
$string['contenttypenoaccess'] = 'You cannot view this {$a} instance.';
$string['contenttypenoedit'] = 'You can not edit this content';
+$string['emptynamenotallowed'] = 'Empty name is not allowed';
$string['eventcontentcreated'] = 'Content created';
$string['eventcontentdeleted'] = 'Content deleted';
$string['eventcontentupdated'] = 'Content updated';
$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';
$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>
$string['creategroupinselectedgrouping'] = 'Create group in grouping';
$string['createingrouping'] = 'Grouping of auto-created groups';
$string['createorphangroup'] = 'Create orphan group';
+$string['csvdelimiter'] = 'CSV delimiter';
$string['databaseupgradegroups'] = 'Groups version is now {$a}';
$string['defaultgrouping'] = 'Default grouping';
$string['defaultgroupingname'] = 'Grouping';
$string['editusersgroupsa'] = 'Edit groups for "{$a}"';
$string['enablemessaging'] = 'Group messaging';
$string['enablemessaging_help'] = 'If enabled, group members can send messages to the others in their group via the messaging drawer.';
+$string['encoding'] = 'Encoding';
$string['enrolmentkey'] = 'Enrolment key';
$string['enrolmentkey_help'] = 'An enrolment key enables access to the course to be restricted to only those who know the key. If a group enrolment key is specified, then not only will entering that key let the user into the course, but it will also automatically make them a member of this group.
$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');
}
}
'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',
'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',
'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',
'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',
'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',
'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.
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);
},
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>' +
'</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">' +
'</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">' +
'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>' +
'<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">' +
'</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>' +
'</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>' +
'</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>' +
'</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>' +
'</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>' +
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;
}
$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);
$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 = [
<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>
<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>
$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',
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">
var root = $('#message-index-{{uniqid}}');
MessageDrawer.init(root, '{{uniqid}}', true, {{{route}}});
});
-{{/js}}
\ No newline at end of file
+{{/js}}
<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}}
<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 }}
{{#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}}
<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 }}
$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) {
$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');
}
}
}}
<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>
<td>
{{# str }} course {{/ str }}:
</td>
- <td class="p-l-1">
+ <td class="pl-3">
{{{ coursename }}}
</td>
</tr>
<td>
{{# str }} modulename, mod_book {{/ str }}:
</td>
- <td class="p-l-1">
+ <td class="pl-3">
{{{ modulename }}}
</td>
</tr>
<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}}
}}
<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">
\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'));
</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">
{{{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}}
{{/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}}
{{/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>
<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}}
}}
<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>
{{/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>
$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',
'<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);
}
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>';
}
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>';
}
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'));
}
}
}
$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">';
$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');
$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;
}
</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">
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"
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,
$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();
.que.ddimageortext div.droparea .dropzones {
position: absolute;
top: 0;
+ /*rtl:ignore*/
left: 0;
}
max-width: none;
}
-.que.ddimageortext .dropbackground.img-responsive.img-fluid {
- width: 100%;
-}
-
.que.ddimageortext .dropzone {
display: none;
position: absolute;
$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');
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,
</p>
{{/pushratingstouserplans}}
</div>
-<div class="row-fluid">
+<div class="row">
<span class="col-md-6">
<table class="table table-bordered">
<summary class="accesshide">
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(
$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";
@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";
.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;
}
}
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;
}
}
.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;
+++ /dev/null
-// 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();
-}
+++ /dev/null
-$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;
-}
-*/
.drop-target {
box-sizing: border-box;
- border: 1px dashed $brand-primary;
+ border: 1px dashed $primary;
}
}
// 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;
// My Moodle
.path-my .coursebox {
- margin: $spacer-y 0;
+ margin: $spacer 0;
padding: 0;
.overview {
/* 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.
.sr-only-focusable {
&:active,
&:focus {
- z-index: $zindex-navbar-fixed + 1;
+ z-index: 1031;
position: fixed;
background: #fff;
padding: 7px;
.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;
.editing .section .activity:hover,
.editing .section .activity.action-menu-shown {
- background-color: $table-bg-accent;
+ background-color: $table-accent-bg;
}
.course-content .current {
.course-content .current::before {
content: "";
- border-left: $brand-primary 2px solid;
+ border-left: $primary 2px solid;
position: absolute;
left: -$card-spacer-x;
top: 0;
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;
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);
.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;
}
}
> div,
> div:hover,
&[data-selected='1'] > div {
- background-color: $table-bg-hover;
+ background-color: $table-hover-bg;
}
}
}
}
#adminsettings .error {
- color: $state-danger-text;
+ color: $danger;
}
.mform ul.file-list {
.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;
.form-autocomplete-suggestions li[aria-selected=true] {
background-color: darken($dropdown-bg, 5%);
- color: $gray;
+ color: $gray-700;
}
.form-autocomplete-downarrow {
/** 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;
&.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 {
margin-left: 4px;
}
-.ie .row-fluid .desktop-first-column {
- margin-left: 0;
-}
-
.langmenu form {
margin: 0;
}
}
> tbody > tr:nth-of-type(even) {
- background-color: $table-bg-accent;
+ background-color: $table-accent-bg;
}
.rblock label {
span.qnbutton {
cursor: default;
- background-color: $input-bg-disabled;
- color: $gray;
+ background-color: $input-disabled-bg;
+ color: $gray-700;
}
a.qnbutton:hover,
.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;
}
}
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);
}
.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;
}
}
}
div[data-role="arrow"] {
- border-width: #{$popover-arrow-outer-width};
+ border-width: $popover-arrow-width;
}
div[data-role="arrow"],
&[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};
}
--- /dev/null
+/**
+ * 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
), $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";
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 {
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 {
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 {
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
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
*
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;
/* 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 */ }
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;
/** 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");
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"],
float: left;
margin-left: 4px; }
-.ie .row-fluid .desktop-first-column {
- margin-left: 0; }
-
.langmenu form {
margin: 0; }
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 {
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 {
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 {
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 {
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 {
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 {
), $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";
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 {
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 {
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 {
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
.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; }
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
*
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;
/* 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 */ }
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;
/** 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");
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"],
float: left;
margin-left: 4px; }
-.ie .row-fluid .desktop-first-column {
- margin-left: 0; }
-
.langmenu form {
margin: 0; }
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 {
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 {
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 {
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 {
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 {
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 {
$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);
$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);
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