Merge branch 'MDL-75762-master' of https://github.com/laurentdavid/moodle

This commit is contained in:
Jun Pataleta 2023-08-17 12:01:03 +08:00 committed by Sara Arjona
commit 04ee9570ac
No known key found for this signature in database
23 changed files with 342 additions and 166 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -54,7 +54,6 @@ export default class Component extends BaseComponent {
SECTION_CMLIST: `[data-for='cmlist']`,
COURSE_SECTIONLIST: `[data-for='course_sectionlist']`,
CM: `[data-for='cmitem']`,
PAGE: `#page`,
TOGGLER: `[data-action="togglecoursecontentsection"]`,
COLLAPSE: `[data-toggle="collapse"]`,
TOGGLEALL: `[data-toggle="toggleall"]`,
@ -146,10 +145,13 @@ export default class Component extends BaseComponent {
// Capture page scroll to update page item.
this.addEventListener(
document.querySelector(this.selectors.PAGE),
document,
"scroll",
this._scrollHandler
);
setTimeout(() => {
this._scrollHandler();
}, 500);
}
/**
@ -339,7 +341,7 @@ export default class Component extends BaseComponent {
* Check the current page scroll and update the active element if necessary.
*/
_scrollHandler() {
const pageOffset = document.querySelector(this.selectors.PAGE).scrollTop;
const pageOffset = window.scrollY;
const items = this.reactive.getExporter().allItemsArray(this.reactive.state);
// Check what is the active element now.
let pageItem = null;

View File

@ -40,6 +40,7 @@ class behat_grade extends behat_base {
* @param string $itemname
*/
public function i_give_the_grade($grade, $userfullname, $itemname) {
$this->execute('behat_navigation::i_close_block_drawer_if_open');
$gradelabel = $userfullname . ' ' . $itemname;
$fieldstr = get_string('useractivitygrade', 'gradereport_grader', $gradelabel);
@ -58,6 +59,7 @@ class behat_grade extends behat_base {
* @param TableNode $data
*/
public function i_set_the_following_settings_for_grade_item(string $gradeitem, string $type, string $page, TableNode $data) {
$this->execute("behat_navigation::i_close_block_drawer_if_open");
if ($this->running_javascript()) {
$this->execute("behat_grades::i_click_on_grade_item_menu", [$gradeitem, $type, $page]);

View File

@ -237,7 +237,7 @@ class behat_grades extends behat_base {
* @throws Exception
*/
public function i_click_on_grade_item_menu(string $itemname, string $itemtype, string $page) {
$this->execute("behat_navigation::i_close_block_drawer_if_open");
if ($itemtype == 'gradeitem') {
$itemid = $this->get_grade_item_id($itemname);
} else if ($itemtype == 'category') {
@ -265,6 +265,8 @@ class behat_grades extends behat_base {
} else {
throw new Exception('Unknown page: ' . $page);
}
$node = $this->get_selected_node("xpath_element", $this->escape($xpath));
$this->execute_js_on_node($node, '{{ELEMENT}}.scrollIntoView({ block: "center", inline: "center" })');
$this->execute("behat_general::i_click_on", [$this->escape($xpath), "xpath_element"]);
}
}

View File

@ -29,7 +29,6 @@ require_once(__DIR__ . '/../../behat/behat_base.php');
use Behat\Mink\Element\NodeElement;
use Behat\Mink\Exception\ExpectationException as ExpectationException;
use Behat\Mink\Exception\DriverException as DriverException;
use Behat\Mink\Exception\ElementNotFoundException as ElementNotFoundException;
/**
@ -1510,4 +1509,36 @@ class behat_navigation extends behat_base {
);
}
}
/**
* Close the block drawer if it is open.
*
* This is necessary as in Behat the block drawer is open at each page load (disregarding user's settings)
* As the block drawer is positioned at the front of some contextual dialogs on the grade report for example.
* @Given I close block drawer if open
* @return void
*/
public function i_close_block_drawer_if_open() {
if ($this->running_javascript()) {
$xpath = "//button[contains(@data-action,'closedrawer')][contains(@data-placement,'left')]";
$node = $this->getSession()->getPage()->find('xpath', $xpath);
if ($node && $node->isVisible()) {
$ishidden = $node->getAttribute('aria-hidden-tab-index');
if (!$ishidden) {
$this->execute('behat_general::i_click_on', [$node, 'NodeElement']);
}
}
}
}
/**
* I close the block drawer and keep it closed.
*
* @Given I keep block drawer closed
* @return void
*/
public function i_keep_block_drawer_closed() {
set_user_preference('behat_keep_drawer_closed', 1);
$this->i_close_block_drawer_if_open();
}
}

View File

@ -83,6 +83,9 @@ information provided here is intended especially for developers.
* help_icon constructor has a new optional $a parameter to allow variables with translation strings.
* The random_bytes_emulate() function has been deprecated, because it's not required anymore. PHP native function random_bytes()
should be used instead.
* New behat behat_navigation::i_close_block_drawer_if_open() and behat_navigation::i_keep_block_drawer_closed()
to ensure in some test that the block drawer is closed. This helps with random failures due to the block drawer
being forced open in all behat tests.
=== 4.2 ===

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -5,6 +5,6 @@ define("theme_boost/footer-popover",["exports","jquery","./popover"],(function(_
* @module theme_boost/footer-popover
* @copyright 2021 Bas Brands
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/Object.defineProperty(_exports,"__esModule",{value:!0}),Object.defineProperty(_exports,"Popover",{enumerable:!0,get:function(){return _popover.default}}),_exports.init=void 0,_jquery=_interopRequireDefault(_jquery),_popover=_interopRequireDefault(_popover);const SELECTORS_FOOTERCONTAINER='[data-region="footer-container-popover"]',SELECTORS_FOOTERCONTENT='[data-region="footer-content-popover"]',SELECTORS_FOOTERBUTTON='[data-action="footer-popover"]';let footerIsShown=!1;_exports.init=()=>{const container=document.querySelector(SELECTORS_FOOTERCONTAINER),footerButton=document.querySelector(SELECTORS_FOOTERBUTTON);(0,_jquery.default)(footerButton).popover({content:getFooterContent,container:container,html:!0,placement:"top",customClass:"footer",trigger:"click"}),document.addEventListener("click",(e=>{footerIsShown&&!e.target.closest(SELECTORS_FOOTERCONTAINER)&&(0,_jquery.default)(footerButton).popover("hide")}),!0),document.addEventListener("keydown",(e=>{footerIsShown&&"Escape"===e.key&&((0,_jquery.default)(footerButton).popover("hide"),footerButton.focus())})),document.addEventListener("focus",(e=>{footerIsShown&&!e.target.closest(SELECTORS_FOOTERCONTAINER)&&(0,_jquery.default)(footerButton).popover("hide")}),!0),(0,_jquery.default)(footerButton).on("show.bs.popover",(()=>{footerIsShown=!0})),(0,_jquery.default)(footerButton).on("hide.bs.popover",(()=>{footerIsShown=!1}))};const getFooterContent=()=>document.querySelector(SELECTORS_FOOTERCONTENT).innerHTML}));
*/Object.defineProperty(_exports,"__esModule",{value:!0}),Object.defineProperty(_exports,"Popover",{enumerable:!0,get:function(){return _popover.default}}),_exports.init=void 0,_jquery=_interopRequireDefault(_jquery),_popover=_interopRequireDefault(_popover);const SELECTORS_FOOTERCONTAINER='[data-region="footer-container-popover"]',SELECTORS_FOOTERCONTENT='[data-region="footer-content-popover"]',SELECTORS_FOOTERBUTTON='[data-action="footer-popover"]';let footerIsShown=!1;_exports.init=()=>{const container=document.querySelector(SELECTORS_FOOTERCONTAINER),footerButton=document.querySelector(SELECTORS_FOOTERBUTTON);(0,_jquery.default)(footerButton).popover({content:getFooterContent,container:container,html:!0,placement:"top",customClass:"footer",trigger:"click",boundary:"viewport",popperConfig:{modifiers:{preventOverflow:{boundariesElement:"viewport",padding:48},offset:{},flip:{behavior:"flip"},arrow:{element:".arrow"}}}}),document.addEventListener("click",(e=>{footerIsShown&&!e.target.closest(SELECTORS_FOOTERCONTAINER)&&(0,_jquery.default)(footerButton).popover("hide")}),!0),document.addEventListener("keydown",(e=>{footerIsShown&&"Escape"===e.key&&((0,_jquery.default)(footerButton).popover("hide"),footerButton.focus())})),document.addEventListener("focus",(e=>{footerIsShown&&!e.target.closest(SELECTORS_FOOTERCONTAINER)&&(0,_jquery.default)(footerButton).popover("hide")}),!0),(0,_jquery.default)(footerButton).on("show.bs.popover",(()=>{footerIsShown=!0})),(0,_jquery.default)(footerButton).on("hide.bs.popover",(()=>{footerIsShown=!1}))};const getFooterContent=()=>document.querySelector(SELECTORS_FOOTERCONTENT).innerHTML}));
//# sourceMappingURL=footer-popover.min.js.map

View File

@ -1 +1 @@
{"version":3,"file":"footer-popover.min.js","sources":["../src/footer-popover.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Shows the footer content in a popover.\n *\n * @module theme_boost/footer-popover\n * @copyright 2021 Bas Brands\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport Popover from './popover';\n\nconst SELECTORS = {\n FOOTERCONTAINER: '[data-region=\"footer-container-popover\"]',\n FOOTERCONTENT: '[data-region=\"footer-content-popover\"]',\n FOOTERBUTTON: '[data-action=\"footer-popover\"]'\n};\n\nlet footerIsShown = false;\n\nexport const init = () => {\n const container = document.querySelector(SELECTORS.FOOTERCONTAINER);\n const footerButton = document.querySelector(SELECTORS.FOOTERBUTTON);\n\n // All jQuery in this code can be replaced when MDL-71979 is integrated.\n $(footerButton).popover({\n content: getFooterContent,\n container: container,\n html: true,\n placement: 'top',\n customClass: 'footer',\n trigger: 'click'\n });\n\n document.addEventListener('click', e => {\n if (footerIsShown && !e.target.closest(SELECTORS.FOOTERCONTAINER)) {\n $(footerButton).popover('hide');\n }\n },\n true);\n\n document.addEventListener('keydown', e => {\n if (footerIsShown && e.key === 'Escape') {\n $(footerButton).popover('hide');\n footerButton.focus();\n }\n });\n\n document.addEventListener('focus', e => {\n if (footerIsShown && !e.target.closest(SELECTORS.FOOTERCONTAINER)) {\n $(footerButton).popover('hide');\n }\n },\n true);\n\n $(footerButton).on('show.bs.popover', () => {\n footerIsShown = true;\n });\n\n $(footerButton).on('hide.bs.popover', () => {\n footerIsShown = false;\n });\n};\n\n/**\n * Get the footer content for popover.\n *\n * @returns {String} HTML string\n * @private\n */\nconst getFooterContent = () => {\n return document.querySelector(SELECTORS.FOOTERCONTENT).innerHTML;\n};\n\nexport {\n Popover\n};\n"],"names":["SELECTORS","footerIsShown","container","document","querySelector","footerButton","popover","content","getFooterContent","html","placement","customClass","trigger","addEventListener","e","target","closest","key","focus","on","innerHTML"],"mappings":";;;;;;;4QA0BMA,0BACe,2CADfA,wBAEa,yCAFbA,uBAGY,qCAGdC,eAAgB,gBAEA,WACVC,UAAYC,SAASC,cAAcJ,2BACnCK,aAAeF,SAASC,cAAcJ,4CAG1CK,cAAcC,QAAQ,CACpBC,QAASC,iBACTN,UAAWA,UACXO,MAAM,EACNC,UAAW,MACXC,YAAa,SACbC,QAAS,UAGbT,SAASU,iBAAiB,SAASC,IAC3Bb,gBAAkBa,EAAEC,OAAOC,QAAQhB,gDACjCK,cAAcC,QAAQ,WAGhC,GAEAH,SAASU,iBAAiB,WAAWC,IAC7Bb,eAA2B,WAAVa,EAAEG,0BACjBZ,cAAcC,QAAQ,QACxBD,aAAaa,YAIrBf,SAASU,iBAAiB,SAASC,IAC3Bb,gBAAkBa,EAAEC,OAAOC,QAAQhB,gDACjCK,cAAcC,QAAQ,WAGhC,uBAEED,cAAcc,GAAG,mBAAmB,KAClClB,eAAgB,yBAGlBI,cAAcc,GAAG,mBAAmB,KAClClB,eAAgB,YAUlBO,iBAAmB,IACdL,SAASC,cAAcJ,yBAAyBoB"}
{"version":3,"file":"footer-popover.min.js","sources":["../src/footer-popover.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Shows the footer content in a popover.\n *\n * @module theme_boost/footer-popover\n * @copyright 2021 Bas Brands\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport Popover from './popover';\n\nconst SELECTORS = {\n FOOTERCONTAINER: '[data-region=\"footer-container-popover\"]',\n FOOTERCONTENT: '[data-region=\"footer-content-popover\"]',\n FOOTERBUTTON: '[data-action=\"footer-popover\"]'\n};\n\nlet footerIsShown = false;\n\nexport const init = () => {\n const container = document.querySelector(SELECTORS.FOOTERCONTAINER);\n const footerButton = document.querySelector(SELECTORS.FOOTERBUTTON);\n\n // All jQuery in this code can be replaced when MDL-71979 is integrated.\n $(footerButton).popover({\n content: getFooterContent,\n container: container,\n html: true,\n placement: 'top',\n customClass: 'footer',\n trigger: 'click',\n boundary: 'viewport',\n popperConfig: {\n modifiers: {\n preventOverflow: {\n boundariesElement: 'viewport',\n padding: 48\n },\n offset: {},\n flip: {\n behavior: 'flip'\n },\n arrow: {\n element: '.arrow'\n },\n }\n }\n });\n\n document.addEventListener('click', e => {\n if (footerIsShown && !e.target.closest(SELECTORS.FOOTERCONTAINER)) {\n $(footerButton).popover('hide');\n }\n },\n true);\n\n document.addEventListener('keydown', e => {\n if (footerIsShown && e.key === 'Escape') {\n $(footerButton).popover('hide');\n footerButton.focus();\n }\n });\n\n document.addEventListener('focus', e => {\n if (footerIsShown && !e.target.closest(SELECTORS.FOOTERCONTAINER)) {\n $(footerButton).popover('hide');\n }\n },\n true);\n\n $(footerButton).on('show.bs.popover', () => {\n footerIsShown = true;\n });\n\n $(footerButton).on('hide.bs.popover', () => {\n footerIsShown = false;\n });\n};\n\n/**\n * Get the footer content for popover.\n *\n * @returns {String} HTML string\n * @private\n */\nconst getFooterContent = () => {\n return document.querySelector(SELECTORS.FOOTERCONTENT).innerHTML;\n};\n\nexport {\n Popover\n};\n"],"names":["SELECTORS","footerIsShown","container","document","querySelector","footerButton","popover","content","getFooterContent","html","placement","customClass","trigger","boundary","popperConfig","modifiers","preventOverflow","boundariesElement","padding","offset","flip","behavior","arrow","element","addEventListener","e","target","closest","key","focus","on","innerHTML"],"mappings":";;;;;;;4QA0BMA,0BACe,2CADfA,wBAEa,yCAFbA,uBAGY,qCAGdC,eAAgB,gBAEA,WACVC,UAAYC,SAASC,cAAcJ,2BACnCK,aAAeF,SAASC,cAAcJ,4CAG1CK,cAAcC,QAAQ,CACpBC,QAASC,iBACTN,UAAWA,UACXO,MAAM,EACNC,UAAW,MACXC,YAAa,SACbC,QAAS,QACTC,SAAU,WACVC,aAAc,CACVC,UAAW,CACPC,gBAAiB,CACbC,kBAAmB,WACnBC,QAAS,IAEbC,OAAQ,GACRC,KAAM,CACFC,SAAU,QAEdC,MAAO,CACHC,QAAS,cAMzBpB,SAASqB,iBAAiB,SAASC,IAC3BxB,gBAAkBwB,EAAEC,OAAOC,QAAQ3B,gDACjCK,cAAcC,QAAQ,WAGhC,GAEAH,SAASqB,iBAAiB,WAAWC,IAC7BxB,eAA2B,WAAVwB,EAAEG,0BACjBvB,cAAcC,QAAQ,QACxBD,aAAawB,YAIrB1B,SAASqB,iBAAiB,SAASC,IAC3BxB,gBAAkBwB,EAAEC,OAAOC,QAAQ3B,gDACjCK,cAAcC,QAAQ,WAGhC,uBAEED,cAAcyB,GAAG,mBAAmB,KAClC7B,eAAgB,yBAGlBI,cAAcyB,GAAG,mBAAmB,KAClC7B,eAAgB,YAUlBO,iBAAmB,IACdL,SAASC,cAAcJ,yBAAyB+B"}

View File

@ -5,6 +5,6 @@ define("theme_boost/sticky-footer",["exports","core/pending","core/sticky-footer
* @module theme_boost/sticky-footer
* @copyright 2022 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=_exports.enableStickyFooter=_exports.disableStickyFooter=void 0,_pending=(obj=_pending)&&obj.__esModule?obj:{default:obj};const SELECTORS_STICKYFOOTER=".stickyfooter",SELECTORS_PAGE="#page",CLASSES_HASSTICKYFOOTER="hasstickyfooter";let initialized=!1,previousScrollPosition=0,enabled=!1;const scrollSpy=()=>{if(!enabled)return;if(document.body.clientWidth>=768)return;let scrollPosition=(()=>{const page=document.querySelector(SELECTORS_PAGE);return page?page.scrollTop:window.pageYOffset})();scrollPosition>previousScrollPosition?hideStickyFooter():showStickyFooter(),previousScrollPosition=scrollPosition},showStickyFooter=()=>{const pendingPromise=new _pending.default("theme_boost/sticky-footer:enabling"),footer=document.querySelector(SELECTORS_STICKYFOOTER),page=document.querySelector(SELECTORS_PAGE);footer&&page&&(document.body.classList.add(CLASSES_HASSTICKYFOOTER),page.classList.add(CLASSES_HASSTICKYFOOTER)),setTimeout((()=>pendingPromise.resolve()),1e3)},hideStickyFooter=()=>{document.body.classList.remove(CLASSES_HASSTICKYFOOTER);const page=document.querySelector(SELECTORS_PAGE);null==page||page.classList.remove(CLASSES_HASSTICKYFOOTER)},enableStickyFooter=()=>{enabled=!0,showStickyFooter()};_exports.enableStickyFooter=enableStickyFooter;const disableStickyFooter=()=>{enabled=!1,hideStickyFooter()};_exports.disableStickyFooter=disableStickyFooter;_exports.init=()=>{var _document$querySelect;if(initialized||document.body.classList.contains("behat-site"))return void(0,_stickyFooter.init)();initialized=!0,(()=>{const footer=document.querySelector(SELECTORS_STICKYFOOTER);return!!footer&&!!footer.dataset.disable})()||enableStickyFooter();(null!==(_document$querySelect=document.querySelector(SELECTORS_PAGE))&&void 0!==_document$querySelect?_document$querySelect:document.body).addEventListener("scroll",scrollSpy),(0,_stickyFooter.registerManager)({enableStickyFooter:enableStickyFooter,disableStickyFooter:disableStickyFooter})}}));
*/Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=_exports.enableStickyFooter=_exports.disableStickyFooter=void 0,_pending=(obj=_pending)&&obj.__esModule?obj:{default:obj};const SELECTORS_STICKYFOOTER=".stickyfooter",SELECTORS_PAGE="#page",CLASSES_HASSTICKYFOOTER="hasstickyfooter";let initialized=!1,previousScrollPosition=0,enabled=!1;const scrollSpy=()=>{if(!enabled)return;if(document.body.clientWidth>=768)return;let scrollPosition=window.scrollY;scrollPosition>previousScrollPosition?hideStickyFooter():showStickyFooter(),previousScrollPosition=scrollPosition},showStickyFooter=()=>{const pendingPromise=new _pending.default("theme_boost/sticky-footer:enabling"),footer=document.querySelector(SELECTORS_STICKYFOOTER),page=document.querySelector(SELECTORS_PAGE);footer&&page&&(document.body.classList.add(CLASSES_HASSTICKYFOOTER),page.classList.add(CLASSES_HASSTICKYFOOTER)),setTimeout((()=>pendingPromise.resolve()),1e3)},hideStickyFooter=()=>{document.body.classList.remove(CLASSES_HASSTICKYFOOTER);const page=document.querySelector(SELECTORS_PAGE);null==page||page.classList.remove(CLASSES_HASSTICKYFOOTER)},enableStickyFooter=()=>{enabled=!0,showStickyFooter()};_exports.enableStickyFooter=enableStickyFooter;const disableStickyFooter=()=>{enabled=!1,hideStickyFooter()};_exports.disableStickyFooter=disableStickyFooter;_exports.init=()=>{initialized||document.body.classList.contains("behat-site")?(0,_stickyFooter.init)():(initialized=!0,(()=>{const footer=document.querySelector(SELECTORS_STICKYFOOTER);return!!footer&&!!footer.dataset.disable})()||enableStickyFooter(),document.addEventListener("scroll",scrollSpy),(0,_stickyFooter.registerManager)({enableStickyFooter:enableStickyFooter,disableStickyFooter:disableStickyFooter}))}}));
//# sourceMappingURL=sticky-footer.min.js.map

File diff suppressed because one or more lines are too long

View File

@ -40,15 +40,35 @@ const SELECTORS = {
OPENBTN: '[data-toggler="drawers"][data-action="opendrawer"]',
TOGGLEBTN: '[data-toggler="drawers"][data-action="toggle"]',
DRAWERS: '[data-region="fixed-drawer"]',
CONTAINER: '#page.drawers',
DRAWERCONTENT: '.drawercontent',
PAGECONTENT: '#page-content',
};
const CLASSES = {
SCROLLED: 'scrolled',
SHOW: 'show',
NOTINITIALISED: 'not-initialized',
TOGGLERIGHT: '.drawer-right-toggle',
};
/**
* Pixel thresshold to auto-hide drawers.
*
* @type {Number}
*/
const THRESHOLD = 20;
/**
* Try to get the drawer z-index from the page content.
*
* @returns {Number|null} the z-index of the drawer.
* @private
*/
const getDrawerZIndex = () => {
const drawer = document.querySelector(SELECTORS.DRAWERS);
if (!drawer) {
return null;
}
return parseInt(window.getComputedStyle(drawer).zIndex, 10);
};
/**
@ -62,6 +82,10 @@ const getBackdrop = () => {
backdropPromise = Templates.render('core/modal_backdrop', {})
.then(html => new ModalBackdrop(html))
.then(modalBackdrop => {
const drawerZindex = getDrawerZIndex();
if (drawerZindex) {
modalBackdrop.setZIndex(getDrawerZIndex() - 1);
}
modalBackdrop.getAttachmentPoint().get(0).addEventListener('click', e => {
e.preventDefault();
Drawers.closeAllDrawers();
@ -239,6 +263,12 @@ export default class Drawers {
*/
drawerNode = null;
/**
* The drawer page bounding box dimensions.
* @var {DOMRect} boundingRect
*/
boundingRect = null;
constructor(drawerNode) {
// Some behat tests may use fake drawer divs to test components in drawers.
if (drawerNode.dataset.behatFakeDrawer !== undefined) {
@ -415,6 +445,8 @@ export default class Drawers {
page.classList.add(state);
}
this.boundingRect = this.drawerNode.getBoundingClientRect();
if (isSmall()) {
getBackdrop().then(backdrop => {
backdrop.show();
@ -486,7 +518,7 @@ export default class Drawers {
if (isSmall()) {
const pageWrapper = document.getElementById('page');
pageWrapper.style.overflow = 'auto';
pageWrapper.style.overflow = 'visible';
}
return backdrop;
})
@ -518,6 +550,65 @@ export default class Drawers {
}
}
/**
* Displaces the drawer outsite the page.
*
* @param {Number} scrollPosition the page current scroll position
*/
displace(scrollPosition) {
let displace = scrollPosition;
let openButton = getDrawerOpenButton(this.drawerNode.id);
if (scrollPosition === 0) {
this.drawerNode.style.transform = '';
if (openButton) {
openButton.style.transform = '';
}
return;
}
const state = this.drawerNode.dataset?.state;
const drawrWidth = this.drawerNode.offsetWidth;
let scrollThreshold = drawrWidth;
let direction = -1;
if (state === 'show-drawer-right') {
direction = 1;
scrollThreshold = THRESHOLD;
}
if (scrollPosition > scrollThreshold) {
displace = drawrWidth + THRESHOLD;
}
displace *= direction;
const transform = `translateX(${displace}px)`;
if (openButton) {
openButton.style.transform = transform;
}
this.drawerNode.style.transform = transform;
}
/**
* Prevent drawer from overlapping an element.
*
* @param {HTMLElement} currentFocus
*/
preventOverlap(currentFocus) {
if (!this.isOpen) {
return;
}
const drawrWidth = this.drawerNode.offsetWidth;
const element = currentFocus.getBoundingClientRect();
const drawer = this.boundingRect;
const overlapping = (
(element.right + THRESHOLD) > drawer.left &&
(element.left - THRESHOLD) < drawer.right
);
if (overlapping) {
// Force drawer to displace out of the page.
this.displace(drawrWidth + 1);
} else {
// Reset drawer displacement.
this.displace(window.scrollX);
}
}
/**
* Close all drawers.
*/
@ -541,41 +632,34 @@ export default class Drawers {
drawerInstance.closeDrawer();
});
}
}
/**
* Activate the scroller helper for the drawer layout.
*
* @private
*/
const scroller = () => {
const body = document.querySelector('body');
const drawerLayout = document.querySelector(SELECTORS.CONTAINER);
if (drawerLayout) {
// If there is not visible scrollbar then remove extra margin from right drawer.
const drawerRight = document.querySelector(SELECTORS.CONTAINER + ' ' + CLASSES.TOGGLERIGHT);
if (!scrollbarVisible(drawerLayout) && drawerRight) {
drawerRight.style.marginRight = '0';
/**
* Prevent drawers from covering the focused element.
*/
static preventCoveringFocusedElement() {
const currentFocus = document.activeElement;
// Focus on page layout elements should be ignored.
const pagecontent = document.querySelector(SELECTORS.PAGECONTENT);
if (!currentFocus || !pagecontent?.contains(currentFocus)) {
Drawers.displaceDrawers(window.scrollX);
return;
}
drawerLayout.addEventListener("scroll", () => {
if (drawerLayout.scrollTop >= window.innerHeight) {
body.classList.add(CLASSES.SCROLLED);
} else {
body.classList.remove(CLASSES.SCROLLED);
}
drawerMap.forEach(drawerInstance => {
drawerInstance.preventOverlap(currentFocus);
});
}
};
/**
* Check if there is a visible scrollbar in the given html element.
*
* @param {object} htmlNode The html element.
* @returns {boolean} true if the scroll height is greater than client height.
*/
const scrollbarVisible = (htmlNode) => {
return htmlNode.scrollHeight > htmlNode.clientHeight;
};
/**
* Prevent drawer from covering the content when the page content covers the full page.
*
* @param {Number} displace
*/
static displaceDrawers(displace) {
drawerMap.forEach(drawerInstance => {
drawerInstance.displace(displace);
});
}
}
/**
* Set the last used attribute for the last used toggle button for a drawer.
@ -684,10 +768,25 @@ const registerListeners = () => {
}
};
document.addEventListener('scroll', () => {
const body = document.querySelector('body');
if (window.scrollY >= window.innerHeight) {
body.classList.add(CLASSES.SCROLLED);
} else {
body.classList.remove(CLASSES.SCROLLED);
}
// Horizontal scroll listener to displace the drawers to prevent covering
// any possible sticky content.
Drawers.displaceDrawers(window.scrollX);
});
const preventOverlap = debounce(Drawers.preventCoveringFocusedElement, 100);
document.addEventListener('focusin', preventOverlap);
document.addEventListener('focusout', preventOverlap);
window.addEventListener('resize', debounce(closeOnResizeListener, 400));
};
scroller();
registerListeners();
const drawers = document.querySelectorAll(SELECTORS.DRAWERS);

View File

@ -43,7 +43,23 @@ export const init = () => {
html: true,
placement: 'top',
customClass: 'footer',
trigger: 'click'
trigger: 'click',
boundary: 'viewport',
popperConfig: {
modifiers: {
preventOverflow: {
boundariesElement: 'viewport',
padding: 48
},
offset: {},
flip: {
behavior: 'flip'
},
arrow: {
element: '.arrow'
},
}
}
});
document.addEventListener('click', e => {

View File

@ -39,19 +39,6 @@ let previousScrollPosition = 0;
let enabled = false;
/**
* Return the current page scroll position.
* @package
* @returns {number} the current scroll position
*/
const getScrollPosition = () => {
const page = document.querySelector(SELECTORS.PAGE);
if (page) {
return page.scrollTop;
}
return window.pageYOffset;
};
/**
* Scroll handler.
* @package
@ -65,7 +52,7 @@ const scrollSpy = () => {
return;
}
// Detect if scroll is going down.
let scrollPosition = getScrollPosition();
let scrollPosition = window.scrollY;
if (scrollPosition > previousScrollPosition) {
hideStickyFooter();
} else {
@ -139,9 +126,8 @@ export const init = () => {
if (!isDisabledByDefault()) {
enableStickyFooter();
}
const content = document.querySelector(SELECTORS.PAGE) ?? document.body;
content.addEventListener("scroll", scrollSpy);
document.addEventListener("scroll", scrollSpy);
registerManager({
enableStickyFooter,

View File

@ -41,7 +41,7 @@ if (isloggedin()) {
$blockdraweropen = false;
}
if (defined('BEHAT_SITE_RUNNING')) {
if (defined('BEHAT_SITE_RUNNING') && get_user_preferences('behat_keep_drawer_closed') != 1) {
$blockdraweropen = true;
}

View File

@ -159,9 +159,8 @@ $right-drawer-width: 320px;
}
@mixin drawer() {
@include transition(left 0.2s ease, right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease);
background-color: $drawer-bg-color;
z-index: $zindex-modal;
z-index: $zindex-fixed;
position: fixed;
height: 100vh;
top: 0;
@ -173,6 +172,7 @@ $right-drawer-width: 320px;
@mixin drawertypes() {
&.drawer-right {
@include transition(right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease, transform 0.5s ease);
width: $drawer-right-width;
max-width: $drawer-right-width;
right: calc(-#{$drawer-right-width} + -10px);
@ -190,6 +190,7 @@ $right-drawer-width: 320px;
}
}
&.drawer-left {
@include transition(left 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease);
width: $drawer-left-width;
max-width: $drawer-left-width;
left: calc(-#{$drawer-left-width} + -10px);
@ -221,15 +222,15 @@ $right-drawer-width: 320px;
@include media-breakpoint-up(lg) {
.drawer {
z-index: inherit;
// Make sure that in large screens the drawer goes under the drop down menus.
z-index: $zindex-dropdown - 1;
// Workaround to display the skip link elements from the blocks drawer infront of the navbar.
// As the skip link is in a fixed position and z-index for this element is ignored
// then it is hidden behind the top navbar.
// The workaround is to actually give a z-index to the drawer so it appears in front of the
// navbar (https://developer.mozilla.org/en-US/docs/Web/CSS/z-index).
&#theme_boost-drawers-blocks:focus-within {
position: absolute;
.drawercontent {
z-index: auto;
}
z-index: $zindex-fixed + 1;
}
&.not-initialized {

View File

@ -526,7 +526,7 @@
tr.heading {
position: sticky;
top: 0;
top: $navbar-height;
z-index: 4;
}

View File

@ -181,9 +181,6 @@
#page.drawers .main-inner {
margin-top: 1.5rem;
}
#page.drawers .drawer-right-toggle {
margin-right: 0.7rem;
}
}
@include media-breakpoint-up(md) {
@ -218,9 +215,8 @@
#page.drawers {
position: relative;
overflow-y: auto;
overflow-y: visible;
@include transition(0.2s);
height: calc(100vh - #{$navbar-height});
left: 0;
right: 0;
&.show-drawer-left {
@ -241,7 +237,7 @@
margin-right: $drawer-right-width;
}
&.hasstickyfooter {
height: calc(100vh - #{$navbar-height} - #{$stickyfooter-height});
margin-bottom: $stickyfooter-height;
}
}
}

View File

@ -14,7 +14,7 @@ body {
height: $stickyfooter-height;
bottom: calc(#{$stickyfooter-height} * -1);
transition: bottom .5s;
z-index: $zindex-dropdown;
z-index: $zindex-fixed;
overflow: hidden;
box-shadow: 0 0 1rem rgba($black, .15);
font-size: calc(#{$font-size-base} * 1.10);

View File

@ -29724,27 +29724,27 @@ body.drawer-ease {
}
.drawer {
transition: left 0.2s ease, right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease;
background-color: #f8f9fa;
z-index: 1050;
z-index: 1030;
position: fixed;
height: 100vh;
top: 0;
}
@media (prefers-reduced-motion: reduce) {
.drawer {
transition: none;
}
}
.drawer.not-initialized {
display: none;
}
.drawer.drawer-right {
transition: right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease, transform 0.5s ease;
width: 315px;
max-width: 315px;
right: calc(-315px + -10px);
visibility: hidden;
}
@media (prefers-reduced-motion: reduce) {
.drawer.drawer-right {
transition: none;
}
}
.drawer.drawer-right.show {
right: 0;
visibility: visible;
@ -29754,11 +29754,17 @@ body.drawer-ease {
margin-right: 5px;
}
.drawer.drawer-left {
transition: left 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease;
width: 285px;
max-width: 285px;
left: calc(-285px + -10px);
visibility: hidden;
}
@media (prefers-reduced-motion: reduce) {
.drawer.drawer-left {
transition: none;
}
}
.drawer.drawer-left.show {
left: 0;
visibility: visible;
@ -29776,13 +29782,10 @@ body.drawer-ease {
@media (min-width: 992px) {
.drawer {
z-index: inherit;
z-index: 999;
}
.drawer#theme_boost-drawers-blocks:focus-within {
position: absolute;
}
.drawer#theme_boost-drawers-blocks:focus-within .drawercontent {
z-index: auto;
z-index: 1031;
}
.drawer.not-initialized {
display: block;
@ -29807,35 +29810,35 @@ body.drawer-ease {
@media (max-width: 991.98px) {
.drawer-md {
display: block;
transition: left 0.2s ease, right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease;
background-color: #f8f9fa;
z-index: 1050;
z-index: 1030;
position: fixed;
height: 100vh;
top: 0;
}
}
@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {
.drawer-md {
transition: none;
}
}
@media (max-width: 991.98px) {
.drawer-md.not-initialized {
display: none;
}
}
@media (max-width: 991.98px) {
.drawer-md.drawer-right {
transition: right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease, transform 0.5s ease;
width: 315px;
max-width: 315px;
right: calc(-315px + -10px);
visibility: hidden;
}
}
@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {
.drawer-md.drawer-right {
transition: none;
}
}
@media (max-width: 991.98px) {
.drawer-md.drawer-right.show {
right: 0;
visibility: visible;
}
}
@media (max-width: 991.98px) {
.drawer-md.drawer-right .drawertoggle {
margin-left: auto;
margin-right: 5px;
@ -29843,15 +29846,25 @@ body.drawer-ease {
}
@media (max-width: 991.98px) {
.drawer-md.drawer-left {
transition: left 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease;
width: 285px;
max-width: 285px;
left: calc(-285px + -10px);
visibility: hidden;
}
}
@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {
.drawer-md.drawer-left {
transition: none;
}
}
@media (max-width: 991.98px) {
.drawer-md.drawer-left.show {
left: 0;
visibility: visible;
}
}
@media (max-width: 991.98px) {
.drawer-md.drawer-left .drawertoggle {
margin-right: auto;
margin-left: 5px;
@ -29868,35 +29881,35 @@ body.drawer-ease {
@media (max-width: 767.98px) {
.drawer-sm {
display: block;
transition: left 0.2s ease, right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease;
background-color: #f8f9fa;
z-index: 1050;
z-index: 1030;
position: fixed;
height: 100vh;
top: 0;
}
}
@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
.drawer-sm {
transition: none;
}
}
@media (max-width: 767.98px) {
.drawer-sm.not-initialized {
display: none;
}
}
@media (max-width: 767.98px) {
.drawer-sm.drawer-right {
transition: right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease, transform 0.5s ease;
width: 315px;
max-width: 315px;
right: calc(-315px + -10px);
visibility: hidden;
}
}
@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
.drawer-sm.drawer-right {
transition: none;
}
}
@media (max-width: 767.98px) {
.drawer-sm.drawer-right.show {
right: 0;
visibility: visible;
}
}
@media (max-width: 767.98px) {
.drawer-sm.drawer-right .drawertoggle {
margin-left: auto;
margin-right: 5px;
@ -29904,15 +29917,25 @@ body.drawer-ease {
}
@media (max-width: 767.98px) {
.drawer-sm.drawer-left {
transition: left 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease;
width: 285px;
max-width: 285px;
left: calc(-285px + -10px);
visibility: hidden;
}
}
@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
.drawer-sm.drawer-left {
transition: none;
}
}
@media (max-width: 767.98px) {
.drawer-sm.drawer-left.show {
left: 0;
visibility: visible;
}
}
@media (max-width: 767.98px) {
.drawer-sm.drawer-left .drawertoggle {
margin-right: auto;
margin-left: 5px;
@ -35364,7 +35387,7 @@ p.arrow_button {
}
.path-grade-report-grader .gradeparent tr.heading {
position: sticky;
top: 0;
top: 60px;
z-index: 4;
}
.path-grade-report-grader .gradeparent tr.userrow th {
@ -35848,7 +35871,7 @@ body {
height: max(96px, 0.9375rem * 3);
bottom: calc(max(96px, 0.9375rem * 3) * -1);
transition: bottom 0.5s;
z-index: 1000;
z-index: 1030;
overflow: hidden;
box-shadow: 0 0 1rem rgba(0, 0, 0, 0.15);
font-size: calc(0.9375rem * 1.10);
@ -36592,9 +36615,6 @@ span[data-flexitour=container][x-placement=right] div[data-role=arrow]:after, sp
#page.drawers .main-inner {
margin-top: 1.5rem;
}
#page.drawers .drawer-right-toggle {
margin-right: 0.7rem;
}
}
@media (min-width: 768px) {
#page.drawers {
@ -36622,9 +36642,8 @@ span[data-flexitour=container][x-placement=right] div[data-role=arrow]:after, sp
}
#page.drawers {
position: relative;
overflow-y: auto;
overflow-y: visible;
transition: 0.2s;
height: calc(100vh - 60px);
left: 0;
right: 0;
}
@ -36659,7 +36678,7 @@ span[data-flexitour=container][x-placement=right] div[data-role=arrow]:after, sp
}
@media (min-width: 992px) {
#page.drawers.hasstickyfooter {
height: calc(100vh - 60px - max(96px, 0.9375rem * 3));
margin-bottom: max(96px, 0.9375rem * 3);
}
}
.drawercontrolbuttons {

View File

@ -29724,27 +29724,27 @@ body.drawer-ease {
}
.drawer {
transition: left 0.2s ease, right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease;
background-color: #f8f9fa;
z-index: 1050;
z-index: 1030;
position: fixed;
height: 100vh;
top: 0;
}
@media (prefers-reduced-motion: reduce) {
.drawer {
transition: none;
}
}
.drawer.not-initialized {
display: none;
}
.drawer.drawer-right {
transition: right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease, transform 0.5s ease;
width: 315px;
max-width: 315px;
right: calc(-315px + -10px);
visibility: hidden;
}
@media (prefers-reduced-motion: reduce) {
.drawer.drawer-right {
transition: none;
}
}
.drawer.drawer-right.show {
right: 0;
visibility: visible;
@ -29754,11 +29754,17 @@ body.drawer-ease {
margin-right: 5px;
}
.drawer.drawer-left {
transition: left 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease;
width: 285px;
max-width: 285px;
left: calc(-285px + -10px);
visibility: hidden;
}
@media (prefers-reduced-motion: reduce) {
.drawer.drawer-left {
transition: none;
}
}
.drawer.drawer-left.show {
left: 0;
visibility: visible;
@ -29776,13 +29782,10 @@ body.drawer-ease {
@media (min-width: 992px) {
.drawer {
z-index: inherit;
z-index: 999;
}
.drawer#theme_boost-drawers-blocks:focus-within {
position: absolute;
}
.drawer#theme_boost-drawers-blocks:focus-within .drawercontent {
z-index: auto;
z-index: 1031;
}
.drawer.not-initialized {
display: block;
@ -29807,35 +29810,35 @@ body.drawer-ease {
@media (max-width: 991.98px) {
.drawer-md {
display: block;
transition: left 0.2s ease, right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease;
background-color: #f8f9fa;
z-index: 1050;
z-index: 1030;
position: fixed;
height: 100vh;
top: 0;
}
}
@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {
.drawer-md {
transition: none;
}
}
@media (max-width: 991.98px) {
.drawer-md.not-initialized {
display: none;
}
}
@media (max-width: 991.98px) {
.drawer-md.drawer-right {
transition: right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease, transform 0.5s ease;
width: 315px;
max-width: 315px;
right: calc(-315px + -10px);
visibility: hidden;
}
}
@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {
.drawer-md.drawer-right {
transition: none;
}
}
@media (max-width: 991.98px) {
.drawer-md.drawer-right.show {
right: 0;
visibility: visible;
}
}
@media (max-width: 991.98px) {
.drawer-md.drawer-right .drawertoggle {
margin-left: auto;
margin-right: 5px;
@ -29843,15 +29846,25 @@ body.drawer-ease {
}
@media (max-width: 991.98px) {
.drawer-md.drawer-left {
transition: left 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease;
width: 285px;
max-width: 285px;
left: calc(-285px + -10px);
visibility: hidden;
}
}
@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {
.drawer-md.drawer-left {
transition: none;
}
}
@media (max-width: 991.98px) {
.drawer-md.drawer-left.show {
left: 0;
visibility: visible;
}
}
@media (max-width: 991.98px) {
.drawer-md.drawer-left .drawertoggle {
margin-right: auto;
margin-left: 5px;
@ -29868,35 +29881,35 @@ body.drawer-ease {
@media (max-width: 767.98px) {
.drawer-sm {
display: block;
transition: left 0.2s ease, right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease;
background-color: #f8f9fa;
z-index: 1050;
z-index: 1030;
position: fixed;
height: 100vh;
top: 0;
}
}
@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
.drawer-sm {
transition: none;
}
}
@media (max-width: 767.98px) {
.drawer-sm.not-initialized {
display: none;
}
}
@media (max-width: 767.98px) {
.drawer-sm.drawer-right {
transition: right 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease, transform 0.5s ease;
width: 315px;
max-width: 315px;
right: calc(-315px + -10px);
visibility: hidden;
}
}
@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
.drawer-sm.drawer-right {
transition: none;
}
}
@media (max-width: 767.98px) {
.drawer-sm.drawer-right.show {
right: 0;
visibility: visible;
}
}
@media (max-width: 767.98px) {
.drawer-sm.drawer-right .drawertoggle {
margin-left: auto;
margin-right: 5px;
@ -29904,15 +29917,25 @@ body.drawer-ease {
}
@media (max-width: 767.98px) {
.drawer-sm.drawer-left {
transition: left 0.2s ease, top 0.2s ease, bottom 0.2s ease, visibility 0.2s ease;
width: 285px;
max-width: 285px;
left: calc(-285px + -10px);
visibility: hidden;
}
}
@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
.drawer-sm.drawer-left {
transition: none;
}
}
@media (max-width: 767.98px) {
.drawer-sm.drawer-left.show {
left: 0;
visibility: visible;
}
}
@media (max-width: 767.98px) {
.drawer-sm.drawer-left .drawertoggle {
margin-right: auto;
margin-left: 5px;
@ -35364,7 +35387,7 @@ p.arrow_button {
}
.path-grade-report-grader .gradeparent tr.heading {
position: sticky;
top: 0;
top: 50px;
z-index: 4;
}
.path-grade-report-grader .gradeparent tr.userrow th {
@ -35782,7 +35805,7 @@ body {
height: max(96px, 0.9375rem * 3);
bottom: calc(max(96px, 0.9375rem * 3) * -1);
transition: bottom 0.5s;
z-index: 1000;
z-index: 1030;
overflow: hidden;
box-shadow: 0 0 1rem rgba(0, 0, 0, 0.15);
font-size: calc(0.9375rem * 1.10);
@ -36526,9 +36549,6 @@ span[data-flexitour=container][x-placement=right] div[data-role=arrow]:after, sp
#page.drawers .main-inner {
margin-top: 1.5rem;
}
#page.drawers .drawer-right-toggle {
margin-right: 0.7rem;
}
}
@media (min-width: 768px) {
#page.drawers {
@ -36556,9 +36576,8 @@ span[data-flexitour=container][x-placement=right] div[data-role=arrow]:after, sp
}
#page.drawers {
position: relative;
overflow-y: auto;
overflow-y: visible;
transition: 0.2s;
height: calc(100vh - 50px);
left: 0;
right: 0;
}
@ -36593,7 +36612,7 @@ span[data-flexitour=container][x-placement=right] div[data-role=arrow]:after, sp
}
@media (min-width: 992px) {
#page.drawers.hasstickyfooter {
height: calc(100vh - 50px - max(96px, 0.9375rem * 3));
margin-bottom: max(96px, 0.9375rem * 3);
}
}
.drawercontrolbuttons {