From c5a0abc51c74791d54038943883796d0177ece55 Mon Sep 17 00:00:00 2001 From: Gareth Barnard <1058419+gjb2048@users.noreply.github.com> Date: Sun, 16 Jun 2024 21:44:54 +0100 Subject: [PATCH] V404.1.0 --- Changes.md | 24 ++ Support.md => SupportAndSponsorship.md | 0 classes/output/core_renderer_layout.php | 5 + classes/output/core_renderer_toolbox.php | 268 ++++++++++++++++-- classes/toolbox.php | 20 +- config.php | 1 + lang/en/theme_adaptable.php | 35 ++- pix/layout-builder/12-0-0-0.png | Bin 1357 -> 4163 bytes pix/layout-builder/12-0-0-0.svg | 56 ++++ pix/layout-builder/3-3-3-3.png | Bin 1954 -> 6972 bytes pix/layout-builder/3-3-3-3.svg | 86 ++++++ pix/layout-builder/3-3-6-0.png | Bin 1909 -> 3477 bytes pix/layout-builder/3-3-6-0.svg | 76 +++++ pix/layout-builder/3-6-3-0.png | Bin 1896 -> 4685 bytes pix/layout-builder/3-6-3-0.svg | 76 +++++ pix/layout-builder/3-9-0-0.png | Bin 1771 -> 9536 bytes pix/layout-builder/3-9-0-0.svg | 68 +++++ pix/layout-builder/4-4-4-0.png | Bin 1853 -> 4884 bytes pix/layout-builder/4-4-4-0.svg | 79 ++++++ pix/layout-builder/4-8-0-0.png | Bin 1894 -> 9185 bytes pix/layout-builder/4-8-0-0.svg | 68 +++++ pix/layout-builder/5-7-0-0.png | Bin 6920 -> 5169 bytes pix/layout-builder/5-7-0-0.svg | 66 +++++ pix/layout-builder/6-3-3-0.png | Bin 1907 -> 3521 bytes pix/layout-builder/6-3-3-0.svg | 79 ++++++ pix/layout-builder/6-6-0-0.png | Bin 1644 -> 2285 bytes pix/layout-builder/6-6-0-0.svg | 68 +++++ pix/layout-builder/7-5-0-0.png | Bin 7060 -> 5122 bytes pix/layout-builder/7-5-0-0.svg | 68 +++++ pix/layout-builder/8-4-0-0.png | Bin 1813 -> 9118 bytes pix/layout-builder/8-4-0-0.svg | 66 +++++ pix/layout-builder/9-3-0-0.png | Bin 1708 -> 8010 bytes pix/layout-builder/9-3-0-0.svg | 66 +++++ scss/settings/adaptable.scss | 37 ++- scss/settings/blocks.scss | 43 ++- settings.php | 3 +- settings/array_definitions.php | 1 + settings/information.php | 10 +- settings/information_blocks.php | 81 ++++++ .../core_message/message_drawer.mustache | 4 +- templates/tool_usertours/tourstep.mustache | 2 +- version.php | 6 +- 42 files changed, 1390 insertions(+), 72 deletions(-) rename Support.md => SupportAndSponsorship.md (100%) create mode 100644 pix/layout-builder/12-0-0-0.svg create mode 100644 pix/layout-builder/3-3-3-3.svg create mode 100644 pix/layout-builder/3-3-6-0.svg create mode 100644 pix/layout-builder/3-6-3-0.svg create mode 100644 pix/layout-builder/3-9-0-0.svg create mode 100644 pix/layout-builder/4-4-4-0.svg create mode 100644 pix/layout-builder/4-8-0-0.svg create mode 100644 pix/layout-builder/5-7-0-0.svg create mode 100644 pix/layout-builder/6-3-3-0.svg create mode 100644 pix/layout-builder/6-6-0-0.svg create mode 100644 pix/layout-builder/7-5-0-0.svg create mode 100644 pix/layout-builder/8-4-0-0.svg create mode 100644 pix/layout-builder/9-3-0-0.svg create mode 100644 settings/information_blocks.php diff --git a/Changes.md b/Changes.md index f92ef32..1b1743a 100644 --- a/Changes.md +++ b/Changes.md @@ -1,3 +1,27 @@ +Change Log in version 404.1.0 (2024032802) - In development. +============================================================ +1. Fix header information overridden when set in the context header leading to missing output. +2. Add 'Information blocks'. This is designed to be a replacement for the marketing blocks that are + now deprecated. The code that they use has always been problematic and subject to contained file + based content being lost on occasion, or rather not lost but misplaced in terms of linkage at times. + I've never been able to entirely rectify or resolve the issues. Therefore instead of reinventing the + wheel, I've gone for a block region based solution whereby proven and tested block code is employed. + Instead of defining the content in the theme settings, you'll create blocks and place them in the + 'information' region on the front page. Of course you'll find all of the other settings in place + to control the layout and visiblity as before, on the theme's 'Information blocks' settings tab. + When editing you'll see the full block header with each block having the same width to allow easy + manipulation, i.e. the layout you set is not applied. Its only when editing is off that the layout + is applied and the block titles removed. If you see the word 'Overflow' then that means that you have + more blocks than you've defined in the layout rows to allow. Admins will see 'Marketing blocks are + deprecated, please migrate to using the Information block region.'. When editing, block regions will + have their name at the top. In testing with re-ordering the blocks I did find this problematic and + could not work out entiry why as the theme code is doing what it should do, the core code is telling + the backend via an AJAX call about the reordering, just that after doing so then it seemed that cron + had to run for the changes to become permanent. It is my intention that other settings employing the + same code as the marketing blocks will also migrate to this improved solution. +3. Improve the look of the calendar block controls and fix the next and previous icons. +4. Improve the layout builder to have new clearer responsive images. + Change Log in version 404.0.2 (2024032801) =========================================== 1. Reduce drawer flicker on page load when the navbar is sticky. diff --git a/Support.md b/SupportAndSponsorship.md similarity index 100% rename from Support.md rename to SupportAndSponsorship.md diff --git a/classes/output/core_renderer_layout.php b/classes/output/core_renderer_layout.php index 543c215..1d1fb46 100644 --- a/classes/output/core_renderer_layout.php +++ b/classes/output/core_renderer_layout.php @@ -1202,6 +1202,11 @@ public function frontpage_layout() { echo ''; } + // If Information Blocks are enabled then let's show them. + if (!empty($themesettings->informationblocksenabled)) { + echo $this->get_flexible_blocks('information'); + } + // If Marketing Blocks are enabled then let's show them. if (!empty($themesettings->frontpagemarketenabled)) { echo $this->get_marketing_blocks(); diff --git a/classes/output/core_renderer_toolbox.php b/classes/output/core_renderer_toolbox.php index 6d4a827..9b1b616 100644 --- a/classes/output/core_renderer_toolbox.php +++ b/classes/output/core_renderer_toolbox.php @@ -485,19 +485,21 @@ public function block(block_contents $bc, $region) { $bc->add_class('mb-3'); if (empty($skiptitle)) { - $output = ''; - $skipdest = ''; - } else { - $output = html_writer::link( - '#sb-' . $bc->skipid, - get_string('skipa', 'access', $skiptitle), - ['class' => 'skip skip-block', 'id' => 'fsb-' . $bc->skipid] - ); - $skipdest = html_writer::span( - '', - 'skip-block-to', - ['id' => 'sb-' . $bc->skipid] - ); + $skiptitle = get_string('skipblock', 'theme_adaptable', $bc->blockinstanceid); + } + $output = html_writer::link( + '#sb-' . $bc->skipid, + get_string('skipa', 'access', $skiptitle), + ['class' => 'skip skip-block', 'id' => 'fsb-' . $bc->skipid] + ); + $skipdest = html_writer::span( + '', + 'skip-block-to', + ['id' => 'sb-' . $bc->skipid] + ); + + if (!empty($bc->attributes['notitle'])) { + $bc->title = ''; } $output .= html_writer::start_tag('section', $bc->attributes); @@ -1045,16 +1047,185 @@ public function get_missing_block_regions($blocksarray, $classes = [], $displaya } /** - * Renders marketing blocks on front page + * Get the HTML for block title in the given region. + * + * @param string $region The region to get HTML for. + * + * @return string HTML. + */ + protected function block_region_title($region) { + return html_writer::tag( + 'p', + get_string('region-' . $region, 'theme_adaptable'), + ['class' => 'block-region-title col-12 text-center font-italic font-weight-bold'] + ); + } + + /** + * Renders flexible blocks on front page. + * + * @param string $region + * @param string $layoutrow + * @param string $settingname + * @param array $classes + * @param string $tag + * @return string Markup. + */ + public function get_flexible_blocks( + $region, + $layoutrow = 'informationblockslayoutrow', + $settingname = 'information', + $classes = [], + $tag = 'aside') { + $editing = $this->page->user_is_editing(); + $themesettings = \theme_adaptable\toolbox::get_settings(); + + if (!$editing) { + $visiblestate = 3; + if (!empty($themesettings->informationblocksvisible)) { + $visiblestate = $themesettings->informationblocksvisible; + } + if ($visiblestate != 3) { + $loggedin = isloggedin(); + if ((($visiblestate == 1) && ($loggedin)) || (($visiblestate == 2) && (!$loggedin))) { + return ''; + } + } + } + + $content = ''; + $classes = (array)$classes; + $classes[] = 'block-region'; + + if ($editing) { + $content .= $this->block_region_title($region); + $classes[] = 'editing-flexible-blocks'; + } + + $attributes = [ + 'id' => 'block-region-' . $region, + 'class' => join(' ', $classes), + 'data-blockregion' => $region, + 'data-droptarget' => '1', + ]; + + if ($this->page->blocks->region_has_content($region, $this)) { + $content .= html_writer::tag('h2', get_string('blocks'), ['class' => 'sr-only']); + + $blockcontents = $this->page->blocks->get_content_for_region($region, $this); + $lastblock = null; + $zones = []; + foreach ($blockcontents as $bc) { + if ($bc instanceof block_contents) { + $zones[] = $bc->title; + } + } + + if (!$editing) { + $blockrows = []; + $blocksequence = []; + $blocksequencecount = 0; + $blockspacescount = 0; + + $content .= '
'; + + for ($i = 1; $i <= 5; $i++) { + $blockrowsetting = $layoutrow . $i; + $blockrowvalue = $themesettings->$blockrowsetting; + if ($blockrowvalue != '0-0-0-0') { + $blockrows[] = $blockrowvalue; + } + } + + foreach ($blockrows as $blockrow) { + $blocksequence[] = '+'; // Row start. + $vals = explode('-', $blockrow); + foreach ($vals as $val) { + if ($val > 0) { + $blocksequence[] = $val; // Block width. + $blockspacescount++; + } + } + $blocksequence[] = '-'; // Row end. + } + } + + $blockspacesexceeded = false; + $blockcount = 0; + foreach ($blockcontents as $bc) { + if ($bc instanceof block_contents) { + if (!$editing) { + if (!empty($blocksequence[$blocksequencecount])) { + if ($blocksequence[$blocksequencecount] == '+') { + $content .= '
'; + $blocksequencecount++; + } + $bc->attributes['class'] .= ' col-'.$blocksequence[$blocksequencecount]; // Will be a number. + } else { + if ((!$blockspacesexceeded) && ($blockcount >= $blockspacescount)) { + $blockspacesexceeded = true; + html_writer::tag( + 'p', + get_string('flexibleblocksoverflow', 'theme_adaptable'), + ['class' => 'block-region-overflow col-12 text-center font-italic font-weight-bold'] + ); + $content .= '
'; + if (is_siteadmin()) { + $content .= html_writer::tag( + 'p', + get_string('flexibleblocksoverflow', 'theme_adaptable'), + ['class' => 'block-region-overflow col-12 text-center font-italic font-weight-bold'] + ); + } + } + $bc->attributes['class'] .= ' col-4'; + } + $bc->attributes['notitle'] = true; + } + $content .= $this->block($bc, $region); + $lastblock = $bc->title; + $blockcount++; + if ((!$editing) && (!$blockspacesexceeded)) { + $blocksequencecount++; + // Could be a end of row next. + if ($blocksequence[$blocksequencecount] == '-') { + $content .= '
'; + $blocksequencecount++; + } + } + } else if ($bc instanceof block_move_target) { + $content .= $this->block_move_target($bc, $zones, $lastblock, $region); + } else { + throw new coding_exception( + 'Unexpected type of thing (' . get_class($bc) . ') found in list of block contents.'); + } + } + + if (!$editing) { + if ($blockspacesexceeded) { + $content .= '
'; // End of flexible-blocks-overflow. + } + $content .= '
'; // End of container. + } + } else { + $content .= html_writer::tag('h2', get_string('blocks'), ['class' => 'sr-only']); + } + + return html_writer::tag($tag, $content, $attributes); + } + + /** + * Renders marketing blocks on front page. * * @param string $layoutrow * @param string $settingname * @return string Markup. */ public function get_marketing_blocks($layoutrow = 'marketlayoutrow', $settingname = 'market') { + $themesettings = \theme_adaptable\toolbox::get_settings(); $visiblestate = 3; - if (!empty($this->page->theme->settings->marketingvisible)) { - $visiblestate = $this->page->theme->settings->marketingvisible; + if (!empty($themesettings->marketingvisible)) { + $visiblestate = $themesettings->marketingvisible; } if ($visiblestate != 3) { $loggedin = isloggedin(); @@ -1066,13 +1237,21 @@ public function get_marketing_blocks($layoutrow = 'marketlayoutrow', $settingnam $fields = []; $blockcount = 0; - $extramarketclass = $this->page->theme->settings->frontpagemarketoption; + $extramarketclass = $themesettings->frontpagemarketoption; $retval = '
'; + if (is_siteadmin()) { + $retval .= html_writer::tag( + 'p', + get_string('marketingdeprecated', 'theme_adaptable'), + ['class' => 'marketing-deprecated col-12 text-center font-italic font-weight-bold'] + ); + } + for ($i = 1; $i <= 5; $i++) { $marketrow = $layoutrow . $i; - $marketrow = $this->page->theme->settings->$marketrow; + $marketrow = $themesettings->$marketrow; if ($marketrow != '0-0-0-0') { $fields[] = $marketrow; } @@ -1086,7 +1265,7 @@ public function get_marketing_blocks($layoutrow = 'marketlayoutrow', $settingnam $retval .= '
'; $blockcount++; $fieldname = $settingname . $blockcount; - if (isset($this->page->theme->settings->$fieldname)) { + if (isset($themesettings->$fieldname)) { // Add HTML format. $retval .= \theme_adaptable\toolbox::get_setting($fieldname, 'format_moodle'); } @@ -2005,16 +2184,17 @@ protected function get_course_title() { } /** - * Currently not called, but will leave for reference! + * Renders the context header for the page. * - * @param array $headerinfo Array of things, see parent. - * @param int $headinglevel Heading level, see parent. - * - * @return string Markup. + * @param array $headerinfo Heading information. + * @param int $headinglevel What 'h' level to make the heading. + * @return string A rendered context header. */ public function context_header($headerinfo = null, $headinglevel = 1): string { - $headerinfo = []; - $headerinfo['heading'] = $this->get_course_title(); + if (empty($headerinfo)) { + $headerinfo = []; + $headerinfo['heading'] = $this->get_course_title(); + } return parent::context_header($headerinfo, $headinglevel); } @@ -2743,6 +2923,42 @@ protected function theme_switch_links() { return ''; } + /** + * Get the HTML for blocks in the given region. + * + * @since Moodle 2.5.1 2.6 + * @param string $region The region to get HTML for. + * @param array $classes Wrapping tag classes. + * @param string $tag Wrapping tag. + * @param boolean $fakeblocksonly Include fake blocks only. + * @return string HTML. + */ + public function blocks($region, $classes = [], $tag = 'aside', $fakeblocksonly = false) { + $displayregion = $this->page->apply_theme_region_manipulations($region); + $editing = $this->page->user_is_editing(); + $classes = (array)$classes; + $classes[] = 'block-region'; + $attributes = [ + 'id' => 'block-region-'.preg_replace('#[^a-zA-Z0-9_\-]+#', '-', $displayregion), + 'class' => join(' ', $classes), + 'data-blockregion' => $displayregion, + 'data-droptarget' => '1', + ]; + + $content = ''; + if ($editing) { + $content = $this->block_region_title($region); + } + + if ($this->page->blocks->region_has_content($displayregion, $this)) { + $content .= html_writer::tag('h2', get_string('blocks'), ['class' => 'sr-only']) . + $this->blocks_for_region($displayregion, $fakeblocksonly); + } else { + $content .= html_writer::tag('h2', get_string('blocks'), ['class' => 'sr-only']); + } + return html_writer::tag($tag, $content, $attributes); + } + /** * Output all the blocks in a particular region. * diff --git a/classes/toolbox.php b/classes/toolbox.php index 4386965..880de8b 100644 --- a/classes/toolbox.php +++ b/classes/toolbox.php @@ -1137,11 +1137,12 @@ public static function apply_template_override($templatename, $data) { * @return array of the imgblder and totalblocks. */ public static function admin_settings_layout_builder($settingpage, $adminsettingname, $admindefaults, $adminchoices) { - global $CFG, $PAGE; + global $OUTPUT; $totalblocks = 0; - $imgpath = $CFG->wwwroot . '/theme/adaptable/pix/layout-builder/'; - $imgblder = ''; + $imgblder = '
'; + $themesettings = self::get_settings(); + for ($i = 1; $i <= 5; $i++) { $name = 'theme_adaptable/' . $adminsettingname . $i; $title = get_string($adminsettingname, 'theme_adaptable'); @@ -1152,22 +1153,23 @@ public static function admin_settings_layout_builder($settingpage, $adminsetting $settingname = $adminsettingname . $i; - if (!isset($PAGE->theme->settings->$settingname)) { - $PAGE->theme->settings->$settingname = '0-0-0-0'; + if (!isset($themesettings->$settingname)) { + $themesettings->$settingname = '0-0-0-0'; } - if ($PAGE->theme->settings->$settingname != '0-0-0-0') { - $imgblder .= ''; + if ($themesettings->$settingname != '0-0-0-0') { + $imgurl = $OUTPUT->image_url('layout-builder/'.$themesettings->$settingname, 'theme_adaptable'); + $imgblder .= ''; } - $vals = explode('-', $PAGE->theme->settings->$settingname); + $vals = explode('-', $themesettings->$settingname); foreach ($vals as $val) { if ($val > 0) { $totalblocks++; } } } + $imgblder .= '
'; return ['imgblder' => $imgblder, 'totalblocks' => $totalblocks]; } diff --git a/config.php b/config.php index 36b049d..1cfeeb0 100644 --- a/config.php +++ b/config.php @@ -58,6 +58,7 @@ 'frnt-market-r', 'frnt-market-s', 'frnt-market-t', + 'information', 'news-slider-a', 'course-tab-one-a', 'course-tab-two-a', diff --git a/lang/en/theme_adaptable.php b/lang/en/theme_adaptable.php index f2d4340..50a7b91 100644 --- a/lang/en/theme_adaptable.php +++ b/lang/en/theme_adaptable.php @@ -69,6 +69,7 @@ $string['region-side-post'] = 'Right'; $string['region-side-pre'] = 'Left'; +$string['region-information'] = 'Information'; $string['side-post1'] = 'Side bar in footer'; $string['cachedef_adaptablefontawesomeiconmapping'] = 'Caches font awesome icons'; @@ -117,6 +118,8 @@ $string['orphanedblock'] = 'ORPHANED BLOCK - Originally displays in: {$a}'; +$string['skipblock'] = 'Skip block {$a}'; + // Settings page headings ******************************************. $string['settingsmaincolors'] = 'Main colours'; $string['settingsheadercolors'] = 'Header colours'; @@ -146,7 +149,6 @@ $string['dashboardblockregionsettings'] = 'Dashboard block region builder'; $string['coursepageblockregionsettings'] = 'Course page block region builder'; $string['frontpageblocksettings'] = 'Marketing blocks'; -$string['newstickersettings'] = 'News ticker'; $string['frontpageslidersettings'] = 'Frontpage slider'; $string['frontpagecoursesettings'] = 'Frontpage courses list'; $string['frontpagesettingsheading'] = 'Frontpage rendering'; @@ -157,10 +159,12 @@ $string['frontpagerendereroption2'] = 'Tiles w/ overlay'; $string['frontpagerendereroption3'] = 'Moodle default'; $string['frontpagerendereroption4'] = 'Coventry tiles'; +$string['informationblocksettings'] = 'Information blocks'; +$string['newstickersettings'] = 'News ticker'; // Information. $string['settingsinformation'] = 'Information'; -$string['themesupport'] = 'Support'; +$string['themesupportsponsorship'] = 'Support and sponsorship'; $string['themechanges'] = 'Changes'; $string['themereadme'] = 'Readme'; @@ -338,6 +342,27 @@ $string['sidebaricon'] = 'Show / hide the sidebar'; +// Flexible blocks. +$string['flexibleblocksoverflow'] = 'Overflow'; + +// Information Blocks. +$string['informationsettingsheading'] = 'Customize the information block region that appears on the front page.'; +$string['informationsettingsdesc'] = 'There is a layout builder allowing you to decide how many blocks you need and define your own layout.
Please see the \'Readme\' section on the \'Information\' settings tab for additional information.'; + +$string['informationblocksenabled'] = 'Enable information blocks'; +$string['informationblocksenableddesc'] = 'Set the information blocks in the frontpage.'; +$string['informationblocksvisible'] = 'Show the information blocks when'; +$string['informationblocksvisibledesc'] = 'Show the information blocks when \'Logged out\', \'Logged in\' or \'Logged in or out\'.'; +$string['informationblocksvisibleloggedout'] = 'Logged out'; +$string['informationblocksvisibleloggedin'] = 'Logged in'; +$string['informationblocksvisibleloggedinout'] = 'Logged in or out'; + +$string['informationblocksbuilderheading'] = 'Information block layout builder'; +$string['informationblocksbuilderdesc'] = 'Use the tool below to setup your information blocks. Once defined the blocks will follow the layout when editing is off.'; + +$string['informationblockslayoutrow'] = 'Information block row'; +$string['informationblockslayoutrowdesc'] = 'Add / set the layout for this information block row on front page.'; + // Marketing Blocks & Info Box. $string['marketingsettings'] = 'Marketing blocks'; $string['marketingsettingsheading'] = 'Customize the marketing blocks that appear on the front page.'; @@ -349,7 +374,7 @@ $string['marketingvisibleloggedin'] = 'Logged in'; $string['marketingvisibleloggedinout'] = 'Logged in or out'; -$string['marketingbuilderheading'] = 'Marketing block layout builder'; +$string['marketingbuilderheading'] = 'Marketing block layout builder - deprecated, please transition to using the Information block region'; $string['marketingbuilderdesc'] = 'Use the tool below to setup your marketing blocks. Once defined the block settings will appear further down the page.'; $string['marketlayoutrow'] = 'Marketing block row'; @@ -362,6 +387,8 @@ $string['layoutaddcontentdesc1'] = 'You have configured '; $string['layoutaddcontentdesc2'] = ' marketing blocks. If you are happy with this layout add content to the blocks below.
If you are not happy use the layout builder above to make changes.'; +$string['marketingdeprecated'] = 'Marketing blocks are deprecated, please migrate to using the Information block region.'; + $string['infobox'] = 'Frontpage info box'; $string['infoboxdesc'] = 'Frontpage info block HTML. Please see the \'Readme\' section on the \'Information\' settings tab for additional information.
Note: This element is only used for compatibility with BCU and will be removed in coming versions.'; @@ -371,7 +398,7 @@ $string['infobox2'] = 'Frontpage secondary info box'; $string['infobox2desc'] = 'Frontpage secondary info box. Please see the \'Readme\' section on the \'Information\' settings tab for additional information.
Note: This element is only used for compatibility with BCU and will be removed in coming versions.'; -$string['frontpagemarketenabled'] = 'Enable marketing blocks'; +$string['frontpagemarketenabled'] = 'Enable marketing blocks - deprecated, please transition to using the Information block region'; $string['frontpagemarketenableddesc'] = 'Set the marketing blocks in the frontpage.'; $string['frontpagemarketoption'] = 'Choose style for marketing blocks'; diff --git a/pix/layout-builder/12-0-0-0.png b/pix/layout-builder/12-0-0-0.png index b4068660772dab1e3c011bf1190e18b141b187f7..c476e2816340e2fe398076917a340e9fb1c1a040 100644 GIT binary patch literal 4163 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 Jq7#>X`5&;rHJAVZ literal 1357 zcmaJ>ZA?>V6uyYcRNx0&0wM)W5a^;{SO-iL=0M9u3ao<2Vq0KzwLn2jKd5|W%fLk^ z2^1?Wlu2wW7x_?>Qu;BnB@zVepqgq6h2a4CC~OqypaXW_ia+*exw-ee=bYz#&N=Tn z@BJYu0q?Tkb3X(@E^urN5rTH}(KYUaz36vzJ+m7Xdo$1BW1wyD{G^uEpq71CV$%vB z=)i~Ib%2ER9;nfY1ryFVO*kBKgThl|D{rDE3_bZGD>|RSpyshq6@sFf)C?9i%a==M zUG~Mpgruw>suLRXAsll$xzJ!9`!Zj5(fjG|di>Sn2Dj!69P8};@r)T;8J~GxfVty3 zyT@$kzNL2m{`#((vk@<|_h<{a4=9=Qm$ulG$?d^G(-|JilAg8#6_tOkBWrB7U{cD7To+W|R%#;|K*y1{`7iH|u{=VDt938Cj46N;96byG+Z+-2E8hR;M3+|x51G>D@k$C`MUdi~?#1!S~FSmi# zq5bPx!^`X^MNZZxy6~ovfoP@i!0{(c(x(Lpuv3eDc{coMdm&n+A+ z(I0`IRcaE)tsF4V<@uf!he>+sMqym@V}|HP*AR}tLB|g&cdF$Hoxx;7;dgfGPQ@OP zAe@}-Ww5iC+&9m@(2^pQ!qrEG(*Eu-=|=7|5E*KG!ETsh))5y=7rF|0*MwKST)+*2 z!eg6}>@X7OU3q0;r5msn4O!}WVr~xJ9_rP6c4vP}XXgq@;D`0uh%6a59t0>2-J^m< z63o8AN=CXEL55Hr?llHDypyNtA@P85BK>{c5v~CU@0)Qe+yFRV;0$u12Ke{aR zf5Q>Ybz;#=3PHt0J^S_mHBMoBXq=pyr9ZujOR^LBN)Tj>1$qm4Pwq76Q*FUC&(w+` z07QCw%aDKj^XDU6QuV#!x3-m%d>TOiEzR&4VUwg)GJc$~OL5s4ugl^BM`2Q(tpE7C zdE)KVT}vb)+48mEd;nNrtH`t`UrFdfKZ-N|snIxUGMQ|>O>O7(tLmIL;nN%s@Aill zP1R;`Rmu3$)cVe?+7X(S)BwIoT_lJyY1Dd6_-FmvVDhMPZBZNLBmbXmNpbyiuRGCh z%~9GZTBA8sTeg7>)9V!)jmF&vgPHQd + + + + + + + + + diff --git a/pix/layout-builder/3-3-3-3.png b/pix/layout-builder/3-3-3-3.png index 9248eb997491a626e4c624d5def0fed46ef9de65..8034a3dd7bb3249d8cfa84da22e53a35f36cd039 100644 GIT binary patch literal 6972 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 literal 1954 zcmah~3se$W7#=mH7iP!IO2rPO_EfVyX{LpVYg(GRT3Vs4Nur3a6d$Ot+h&xRm1Wz@ z=wZ6H%9;WhrtK*sdr51`%7~SZER|9#wm@L-4B4sEp0jt(%>C!TbMO7`_x=Ar`-1{~ zu~X+wg&+v)x1JONLB{pKUN_kUJhOT5ZP1xSZ}25SI^^QsC@%({Daq?2c08)y+I@o^Y?%4PxTnS&^(b1u_g0-smE#zOQqAJh? z>Kr;~I-$b0y16Yju~j#i)Z|dMo~7Lhc7@C7s*S%Ey-w0vTm_mFQPIwGK0(qu_X|BYEGlb{w}728b>@(*W=H{N3d7F~+X)3m zIXmG^BX|;QP-nw7qGv2XMXNi$ArUpU-nVl_jjAw`M?(d3RBRhuLV1ukKHAs4$@r$U zjRDayMA$&Z<#7J~U0So7<(CiSe#WVPILFH&x>CT zM!|x)RAx<4#bLv=0)Y`&TxKf4>?J_dU3uviSFRt5ciC_06qW64EMY)^6GENb&XwqW z`k{TveafX{_>k235SfO|A}*1wN&X+cYQjkoCCfz(2mib&cO}Ac69|Gxq=b&4@b0eL z*DB9UCi+q*2A+xcK-lAyxy3CD?)0XRN>-V%tNAv77_J4~$$AQL1t4qtgIz}kvSI)c zb;!uGh4hRTtVE(U=-lI?KcO{G5xK<>p@~SV??VzB;_?r0ikt==eF>~w4405EGexN- z&WKr57Aj3o5W@SS%tG0`qXStR%iD^F$|tzlC$Lm=rY<51KVuAXGi2|o9(Y?ZHP}(;yH!l znGr9D(De>fy3KVrfIbfaT`9{?`;-nG0aWNky{H#ejft6YPaibN4FV>43W5fz>OX3Q z^z4qscznLvGQH?~t;+NZjSiO`3n5Eu2*r#ZF_F{hc6zuEt!5+!$eeuGcAtICfzf2L#p-CtdL23&Y zF}{*>pJlq!?1F{+Ze6?fO@KLbIN`j_DQ{ns8+bGaL&?m~;69AbCwkv{?hK@RoN0aJ z+l(9@bBSJA(6A7{y9KLHKi@dfhD3J$)ujb@T|N_b`#%U%^`+az2@4)(+jQrbAO zmGXgZ56bcD#3VxQ3s+D{`HEYNH^akAFSosF$&ZAQipiG`ptTRJ&TzkgH74rn?!L43 zX~TXFhvmV-JzblXnw*otv`WfTFAH%W=hb{#C&#@ocI~)XMCrM{TUQ0JOeR~IpstN| zP-{1%)xDi@j)zocRsu8SWr+tKr@@B!+cy3qktTqBMU9#f&!Qa7tS{>~pNwJ>$&}#7 z0y4f!F3%mqhJ`gJyLq@ZHZ>KgH0oCEn;t=V)7j9lGo7m1=WjKa6_LTSM&G?^D`pbc zJkf7jh2n`9p&g@25s^K7&l-^s3Vd>NCTd7F>x?g{f{rU6sTqjF&nJ*ny>7?P{{jW) Bhs*!~ diff --git a/pix/layout-builder/3-3-3-3.svg b/pix/layout-builder/3-3-3-3.svg new file mode 100644 index 0000000..94f26be --- /dev/null +++ b/pix/layout-builder/3-3-3-3.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + diff --git a/pix/layout-builder/3-3-6-0.png b/pix/layout-builder/3-3-6-0.png index b3bd1fa4fcdab38d5a573bc4703721bfae8b5910..889bea101f3afea7f5801ae70381426be0ff6c01 100644 GIT binary patch literal 3477 zcmY*b3p~?nAOFiKr?-puoJ3Tdb1YLy7YZSDD)}F=+;1`ER*{uUV>8z2bUFyNg@mo7 z6m5!1tZgb0avd$PP428VWwWuF_y3=IKkxhfe6~INJ-_F9e)r!m^@!`C75_5$7XSb& zK&J!l0H8&L*86^30)20LRP6`-EIs4o7YhI@U%?-Z2F$%sh^QZT&^OKl6CQ^>783?w zu~_qy(UGws$IgVAV`3umMRo?zjlY2h_IV~0eC9P{3b4$EFKrgAp@B_LTsYSXLOWjm zs#oRo&kBuV9jfmAX7hjle89{3R3-6&#uJio8g;Mc&0=f(N@QfQ(-rp@_y5vqKZz@G z(fP3M=s;?r<=J}5s7<=*>v*T$_pVfZnUv(%WD&zxZOYWM5ai9QM%hap^52!SkAz-K z{z}#g*F~dTSz|wJs_L^C^eO-O}{ypx639`$wW{C z67SDvrl#6+%DCMe7-ej(fcOhjnku6#E> zfko2rABsVh0rjwPW110FCPVvw@OAS+!6;vaqj_hkZAIZDyBM9dJG1O}#o{ada*XD) zaa2c48^ylLD!;`Guj`0HiR)PkUJ9Gp6J?&H^qC+W71yQ8q628=Mwo`oTLf@AkioBv zaL!zBd)o&sR)DOO&$B`_m&0LPWQsS;@Sh0F38$fLMLvHA^ss)jpml2OHafYyCo1_2 zGns(eZdIkElGXAAAtm+oj(7L;3Ac=lLtIEdJFP@30F9Na*THK&>{cNMx+JXEPMy)Nun9F>keo7 zZ*6|BFgp2pW2L-~JsnrB>FKmX@)+Me^G7ThX!>pq~@0p=|U8G}||t5q-Fw ziznssue!BR5+{YPSh-?FO9Emk5O}xa1p7!%#+O3dORVa6VXg80{lW>ur4ScDys>VN zGRB{F?!)I(n?M}-)N|9c<8g7lFNXG0Czb+nH<483yGSr7pF%NDFG?sDCBmnGdniWW zT^^lO>;U4BCL#wCq9uGPxbT98dKY-OBcn!ZVF?7sTWhWXYTjD3DW}(l^(07IZLL1N zf1bGiY4rLx^uYb`S&L!Ly;@_11$N2Xz>v_;XHKM!j?-sXZUf@zr4v1Qo>?fDz}Bv= zVNb6xjpb@?QkfVqbapSWvnd>!ShQy0Euv^}dGNR8&X?b*!5L#TJWTxs+(9lbVY4GV zNJXY;HKUNQH<$SVngH<7j6ld(u3g^z@^`7~Qo=wiWL>y$LHnJ(HuPw)#`3*d ziSmzl65^m+68_AYNlzw6E#qF7G@_8IJK^Qjv}*uDy@!2Htk#-`eYU=OOfs1cg$eeH3K%{t?LO zdmF4%RDU#8G^MWcK;wq9S7`=3jlvOMsjc zD+3VCyEz_+jTHpNWVWW3VNK^f{4WbTfcK@v+ZL9!1|N-YYTRtLH2AF7RI!~EJKAnl z6}>(o^u&okp0WCYBji_?(5_|Ou8csJ4IsunL+_y5<;-Z?>&2#NH;_L7dpgOeWZ@G; zxeE%Fd(h3!U1q1gyQ_p}&WZK`JE;ifs#P*0kQ82-_^|cGHyM2OBVb3vc<@szu!Lwn z_11zt=jgY~kU7=5!gd#ie}xvHRT0TO!V6Ig(yoC+BD0JRcdpUbHz$S0#RU{-E(Z$B zN^$2*x(7WxaxHeo+jx1Y;|Bn)3{BV)8%R1xlq<5j2KFnAn+iDg)dHh%R=Sn==()4{fPH{<}GMSLaHl4J<5vd1nr z^x4Q+=!P+Oh&}G|ix(=1bah_dNoGg1&lHF*6XgNKwG1IWqo)dUD6L37*x%oOA-)Z^ z09-8g879jq2+&POV7P9botM}WmIi1iK+cDR);tU~)Q#1BYmC@crfJ1&HZoHKQm8-t zTdpiy78V{6kVoCBMIlVrIo);(Od3e-;Ka9eGe`KYX&?7ray0?#8?X^`IPG5O!e=&y z;G*{JtyDIt;z7(nT~}^U;&5GU&X)WjBcu6=BwnlrF#n;aGB-vt764WtPd@j|vB|0P ztA%7bVhjb??s_OvM_*p_CMiu$4t?rbhDF+Vi9KPNf%a;sX^=bJJxRm0=P%JMCk%g7p8$y6#}=vxl=zPFA5Q>dJ2D&<7b~JJi~DROEl?O3 z>Kpj`$eh&dT|<)}b2+D;K*8k!cIJBy9(2>WeYgEoSihH6AAH;sk1i-sqzji?!Ao4E@B9s(%Q*SYB zx15Ya;^(oiGF$SkLWS?nfBLY~Q|7B?j3e?J8wa(>mX3~prz7;&^K?f6&Ap?grIbQY zDu=4$VV6KxFE4fc005$Tc4hw~#Op>f2c( z;${{2T^k_f?&0Aet+}F3-sVm&_s!&FjhUIJxUKc6E93y#VO|t8OWA{+QM=kU=+hI| z!R*%{_VpoW9y$;R2gAetF^_w@lRCMjcoU$%UQ`nqGX1&tYLThR+S*zk%$tH=ha>pP zB_kFRbk})ZrKP2X>b6}0Zvb&d>gqBEkjY!4|1h_zZxC-u`wdE%)DT#qXMSp3&7i8C z*VE%YGTMATf@;6L^Mt1!HQ~4ILz6JnSwop?FyNAwx2aK zv%_J2rnxzKS}Gl*jRzS+WK}=z*sZr$jiFhjs)*a$`(`j}tH{eHW@zZfcy?I!#fzK3 zX+%bD(~bs`^|FL)sP#6^i|6DGvO68}(c7v~ib8O0_$&3`w@H%2=w=$tjj<$>v2h4A zN6dYpZmpI!>zbC~d&<`2FVos0+jE~ViBm08&8m7_BtzDJp?B)yRx?pyV?L%8I>q~w zFJ-eM%ebeqxhna8%XwFY*6d}|=1nwjMU6sl4$ps_A}zIGKH+T6Rd$y`gC!%Ld52xw zeM96{cE{muc5=ew|C@_);Zcp`X%l<5dibIq|N3dOxis&x=OU0eGjq{Y2#0NyN6#heb9v; zYI5*hqg-|}p4Z-fWbgyctZcFU0+_BMds*K+4c!^gQBn&Vg^+{C_HFNbHkjGAll3)w zD+}9SyWfW%03aKu+Srv2>69N5gtVUdphl~A0liGYyo%S5D@mr6lwg~2A?f&(IpL=i z+OQ$@sMj3>1A`mY=M)?&Kfjx!xHmAsH&UJPhNfU$X^u+8k`LtV2%1XPeCByj)C{_n8pnrhVGW(;X<$ql8(Jk7U-yANf83fUh>7 zCk7PWGe(lwM7*~Lb_}y+lkslDE3fj9lxd{@$;3l(5ELGph&&>7FNTLDhM(PjDKhc= zc2B(b(X%$;SOj4h?|#5PnJeT4#hHX_{P;S;b!)~S$0|vexmDvv)+-dGr z?RV|=q^=L(J|=nTU3cLK9KFR^{1VT)!{-8Z+i_Ydki+FfvRO!5H%yOnlV$f%-Fl)L zm#2ETw5|b)!?Y~8dLXK;Dycc}-E(%qF7{lhHlG&Vc&Y}H$OfX2`|;`lqMRRW*&%vo zapJ@YD$~k#b8bIL{wGzgfa6jUQko?pM5IOq*WNqd$ToPqe<%t0NKSzjb7j!r#}ZLK zD`<_`S?k=1xdx+&s;WiBBP+J`=G=u;e)0nZ=~(nA9crm%SJn#=&}dkmz6y@4w9$>) zak^qYlg;DtB5XT7d`qpaGu=id<3T9!kV2MiR?le0bM{IH>7(T<&veY%86g>6K`>WE zg$yYbve_ht3{r|1`KcZ`pJ|!#VS&MGw+kssr;KdmS8vwH`^Sp29#}&RC60du0yg)*P(XJ*j0fm31k|SAd`tRrd>wBjjIs$u@C?pi9`;Jr8l>>bVfCH zR_EsC%j`@+>pk^qI9WH1+A8Lxy)m)I7#qR*p)dx7&O~{F_&Z(Flw#);a)Wf`ce+Fa zmj~Id!)gFvnI0#}G#T43_~3~53%Jz|P#l(_Na%V|2c^QYN@3}J5e(q#Qxwkg6LzG4 zvIUPwkdMH`H~~NiDjI3~RW>{OG7=DeQj==j3HA|S+BCzaVc0ry3swUqmFd|^Pi5)F zm#~HQ3<_nhPx1J0L&UDC&ih~}34k#}u`qZ98($J;+$Tv}u1zooG*bZfJ!SIL3U#Q1 zN`fe)Gc7fh!eBUAYTyiMrYxE!VD%4l$i15D>T2sx)y&Pj*%3Z{l?Tp5sF~h1KQvk) zmL;Z%-GRkZnkI^Rr-f?>ww_B!FD{R?qxKwI(lX72kj=AA&KF@ESU26!c#Lp|gYtv?%J%0fcLxi6FBil`cE7 zC+zBMZ2WG!4(Z{N)bicJ+byKE)Orm{h+3gLVw_M;nU&S17*?1)#k;V)WB5w(Q_CrU zHvavTB*~x&qyJlMp*cPvKwlH>0Pt+0%TA)c2f)K|jKdd!zh%d}73cZqZxlt}wi2+R zUw?u?g`;*&5;a2)e#)V+{I(2gt-uZyh~-aXLYxmwlvCaa>@udkuXnM6I+sLew?xj( zPIEQ}OdJI-T7_^8`idbBW;Pj&?Qh4G3R)I|CUGj(@z+ur*bx=28)S9hcNZPu#YKAv zb~Mb)L3RU&!$oEzxrB&}nSA~O>2`HMaN4|gXCIbdTE*8|wq>2F(|eiG+wQR)92sLSv5MKoystzdB1^&ONh z3--XwLtmJNngLGNOx}!|i=GgRG!xm&9=`X+dtub78ina?D$9*(AV4| zqJB7rCV}4yTDp;$av};YmAX7pT0pXA4xS$i zIpr*7h=tE_x`#$3N=Y`meq~%q9wzbl)X2tD!ogleO0v(-{{UZRGL3)SpvbVrp#2K{ frO!~+H{4<68lMOEd9+gICNzQfAiCEc49)rr`L&KA diff --git a/pix/layout-builder/3-3-6-0.svg b/pix/layout-builder/3-3-6-0.svg new file mode 100644 index 0000000..8d7a498 --- /dev/null +++ b/pix/layout-builder/3-3-6-0.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + diff --git a/pix/layout-builder/3-6-3-0.png b/pix/layout-builder/3-6-3-0.png index c7258201735dda2a622d3a8c2b5c08e6c99e1eb2..dd0846a3eb06dfc29da7efc6c3ec82d9ae36048b 100644 GIT binary patch literal 4685 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 H&RqQ;9Otg! literal 1896 zcma)6X;4#V6#Zh@WV2R4MX3r@(P02BMPw0`M3TX{N3fMeB+_UC$daHzNKtDsu0YiS zLXB1&s6k0d6pVo2QbBQnB0Lgel%)fYAb}vpkbdvs#Ll!oI+>Su-~E<*=G=2n_Qv%g zHkOW-000{*g|ry})0;3RS(w59VDBxx@MRVg8bSgF?DvbTBo}6;CQ`O117I}+dk7%E za28COr%-8Rb0xvi-qA8=b;NR*a$;@`PYF(7vl;Oz@Dtvc#Mqg_h@H=6rhGR)gi6~O z>%lOG6`H7|)mzg#Pcjx@EsJhYgw3D$1gwoKeczrkB&x z2v5nX7TTB9G5#()isC}=3^z%A{WPPJ4bmc7%oMRn;qp!X(e^6t zaqDan504&jD&VSxZjIrQJ4iVUTT=kuOQhx7ZnU#9QSvEH>O;%Tz;!8c-Re7$ z*HrJ{`#F@9yj6V&c-|5$2f=X?BH+uMqAiE(Gv*;xJ|x20hX3X&2XZtCylxVB9NoUT zbV-G~;JOmlan5#`~Jf>|7ohb({g{a3(!pZAh>RsQqEiHaL7j_CeDg56wO`IC_6P1fpBO~6Cg~cKH z2d>VE?)yYy7b+C>Q>-`fpBdYI%LSy}7P`BHz6ehrrMps9tDr~}wzV^wI8eVKS4)=& zOPw1lECkB{7|Bd9kIoazyJ~TsyeJSY7R_=sNEZmxvZIjFgNlEt zsY?8ujyj)Hs6&eXXUkcjjIX(jP^ zGA`{ksT>D7DR#RmQ + + + + + + + + + + + diff --git a/pix/layout-builder/3-9-0-0.png b/pix/layout-builder/3-9-0-0.png index 487e8dafa7b9fda41a0ed345821dc43cb11af98b..03d35387ee4f06cc0868e33e7b7de15cba5d6667 100644 GIT binary patch literal 9536 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�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 S_xKM5YG!0Z zmn@P?Wod|3ni$VgNDL)%DJIp(&g`h!_eEQe{bRp*zVDpxoH^%rzH@%>NjijgR8rJb zL=Z&DX}{fJ1X&1IRu@>S@5kFyB!^#*uLA-VY) zz$i~~!r9A@N@=R;ZPs#)QU)gN0N0}w+YmCD6iflHAmbU5H-+S-@KpozY8K?YPRShXZxR*7?GF(xY9!b^)R&|6oWzMZr zr#7;Ax4>Ivf8erE_RicEW4(ty!J=7xAJ=ESxNhR%!+4e_k;oBSe@t9R-)j&4D;~mM z?Tr*Kkp0f-7$vbi{|yIO$a5Asy0nzBihwb2b)a6b2dc;W`TTfRRY>qyHJ$Fr(&!7k zHFT%m=>746Vg8rsfeAGos+lj%7%d+bK%|#h)cg%>_xQ9>`0$D&#C>dD>2_^kCbIm$ zaV14B1gp#cjr5&_?-ULP^)0q7?8fc>88L0hk(kTU%RVTiXM{ zus4jD?O4zsueF6L^0^GsHg1!lQlWp7EFcvCFRG}p#9)$laM6Myv)Gfry}~dUX(N2# zv#C}~7!TVzE^kxazymN0DOs}Et0ddB%?U7jX7-T+WrBQ#N5bU%5et4cVQXL3cr7|$*lX%d0 zz|wd@JKAbzHX)1TYG9E5ZukoDA<-l-EVrLph;a0P6>Eo~{9-`cujlF?!EHEK!0|Ip zVrIBVOqF}WDpkFb%S}vdXl}k>wzxQ_BUZV2tSUl*@9*J^G7>t4P}!f? zE!cxkgH2I{XqT)oaksUW?w#BNW22*^&m~@1#@xx4n0b@172p^Bm5J)Y`TAAc_L)VF uDyp2%&F+$h-7z-I*#ad}NdGjPM>Hwf8MpMJABFH>B2M;ryX*VB;{E|&4f%Qi diff --git a/pix/layout-builder/3-9-0-0.svg b/pix/layout-builder/3-9-0-0.svg new file mode 100644 index 0000000..1b124e4 --- /dev/null +++ b/pix/layout-builder/3-9-0-0.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + diff --git a/pix/layout-builder/4-4-4-0.png b/pix/layout-builder/4-4-4-0.png index 66f04fffd5b3deb972c03adceed0ea192f44de7e..52e576cda1109d7f41305afb66b60cadd9b9d965 100644 GIT binary patch literal 4884 zcmbVP3pATqyH0=ePp6j|ziCUWMTbu54I@g6#I&Q;qD)chQd*Zp38`x&kw*WH(kez< zG(xmhj3LPo_eS)FDv>G@k&+fgki;bk5=qXdX8xJ8&a8FLI^SAiXJ>!!_wMI?pYM70 z%^zJIzuc(15d;E#dHR%tI|#Hs85ke?;&b5BysFU$__yK8DW6yn=&Kj2f9u+jzk~pj zJK|29kMlsn;!u}jLP01L%JgznL~QV-E1{;y7&uX6rwamo{qVHIG0(&T;Sm1kcOP*E zvn-KND3I75XK%Rt)1C!d=2XMp+f@-m8$5mvN`nO7*>IY0qcpSE^{s2!nX;(%utNyr z$U#?p*W+mCh_Y`&u2@j2;GiG=bqAz*?9zUZ?R&00+I_Gi;51wFrzo*30jXGzDic$F z(j z&y2e#go8R--o`g@E$%zyegtlv!&ZG)Qss{gvD55l>KuabL)yTd?Wj`s9lkb=OY?as z{~?6-VoA4l&!AU1LLLOGQ|oG}O%9W(R5*9SUOnf53~4@}c?6md^;R^0b+VjYq*YDNP zqQ#dUTI80(?FkLQ!@-S9Z}SrTZJ_~4R_N;EAL{F)^j0({;JkRG!@KN!ot`POr`2IY z!>fy^`apMTp6l2vxzZ`L7a0nBVrwXJIx{WU=Pyk$+sr8Fz#cNx{XJ08+=|8=!8X?TmKLk+ZW zyOn$SW~rMgV?L*yW2FnBj@=jXS6A!@^YFLBl)Vx2KLZgJHPV2ULMp>l38Zo->@=&Vxgix9AY@qwo@m!9%)Z1=PeKOKzQq!mcm$Xi9_o63*wm1C*xVei z$~F?f_%y39*koDV$zB)zr7oHds*~nYeARx2eM-J<={zZWd+5=;^BW^jJA34Tq#ZtSsvdm6nD6V(Pu^R21 zdyneE^kpOsuc!G~^XW1_G;HTCe<{Bj9l<_G-*>pe-_*1lrhLb0#CnyS8Fl~-|CN1~bq%EOz!yIFCo3V){1Kh^G+j+(Qv}#h+!S4Kzge<2%O5e)W^=zDg45IbAj_mg_8Z z$-wrp9rmno-0byEJlJiRX-!pDAOglrjJ*A;By|Y3ltW!Yp`WVsZ>OM6#&c3IM8i5bUcGM2Rk#LKJYgxTQ084SWnzRNK>_iFBO8bt(zsHBqU? zN2v?(2euk=5Y5d(T2ANkRlSWVGUP*4Few?BlKFsDF0L^a<8xxU4uR<$Tv- zQ;w66%IgwkCsF+-^aa8~F2n+Vb>Eb<=8VMxr$HvAqf2)1j35y36GyrH?Sc($UX*xO?*WePsEIjjPy?MwFZtmyye78D@B zbofv#D?Ku_qlKAUMA`s)0Po(5+X8z3oZ+*w!Co8CT;NJZWxvg1)Qk>(>-<^?ppza{ zwY@WsMVuypK$HK#>;-{nr}>|O8X88H66d%cWx8&|c=fdo=&_Fb&;qn@x<(NI609X3Nn4%sXrCsy}9tdzKbKrjzDKMu4RWPWK;6nwS< z&_WSu$u#i3257hSr|tJ~t({W<<#aANzAT^iR=JjY-scGb9CZHz;PHz7Tj8}$5ByDA zpd7&Zbd_L5=;(RZ#1R@qPrUGao%!1E`@Ac_&OcrM`%)986j&+VT0bOHg<1K{ zz4?KfG}A@EME+f^szVnH4M+0u%kyembMq@vne9M5o&Qr$qX&Q2L94TS-=X-d$!k78?F1SM~H@gn1weqAlC0}~ja*_%=U3Oq$j%@9k{yu{@C zfVzuAO(kWUQX2KX0wqU1`gE)03@AB$-?{xn-Tv^}vj@XZ17+IvXNUVoQ`WCx0lEm= zS|5qUaD%hX;lo27?XeU;5Ax@BTHfzbz$xc&zct1R97E~ax3XhF`j z-{+ry-p!ml@*h?MZH@cPaxJ_6)(1(z?9-pFuMbRz(YD#5^p!5;I(&`$j+NdvjAzfzc}!1`Y_*=C44k{42TQxLS;^z?t z%E{LQzg^&6X-2|Ei87w177(ZK7cCkSryzq zd5Vr}Td$ki<+W?7rM@z@8(CA&W@i>uetnD!ox9l| zz5LO+l&uL(G|AM55_(7YSE+_50OzW%F%n|ijHdsua$ouO4Q=JRr?hUTu@qwT$v=yaXD(Y&jITjkQK z;MyfwJ%3Q~-r;mm+azJ%n&&Ge9o2()unIB(xlGW+fm0aeNLNRGpLN;qIyu2W=I+lq z({c_l;rBW}vQ9YIsg^$Ym(=u!hkB*>`$#d0ou0)#uX8wvx3WO9B+opQ|HvA)Y2$1uEfkX;@ZcYZVuzT0=e!1mbaWSC% zHtF4G2nsIu3ftpE5+b0H3tMX0IX9J?pc1o@@;FvEv6eM zG7lB0w2)D1RWII-aE{8+5e;7$$~P82Obu8*Z$`=i#W1wh{xZ(JX--)+K*Hu#2-8P2aE(e6{K(zKDrcEpNg9Y%FG} zS6;~x0i?>jK&TSVtpsvYb=sl%N>L#HXQnN-j+CSbuJz>=GBGQ2-bfahN4elA?i$yF zU_>2#mA+*3L8A1{52+O3mq1mhG@VOVD%|))V=+KBI?`g=Of`~vpbY<#$g3AiI5ZkW zF;itW(Seyv02ZewO|1iWo;9kM1Ar_S(8Mwdr;9_KHuXQioLowbbw9wGdm@qWVXEtY~ zJtx`+>6*19g)f1N8fE?tFTGou>Iudb++9eQ?rmB1Elg*(<@HFP@69BObP+ z+Y1-I*xNTfTFeFLgS%YRZ2k@L99iV1=z6drqiyMYyGpO~E^6}4?5vA0+v|X?5F3Jo zuv8Fi0-}u)4Y+eJY;?#7>EWK*!GX=9Y%ktnkwlOeb753BgMB+-R5r6b*La3V`Spau z3=g$ic_Muie?5_jYaCwhR`@F_VD!%7s}xQ{b1_(V5pfcFH@e4CX8^nBh&i-87HyyeaG_!)6tv7jV?r!P5KhY+JPPx_JO+hU6Zget?MNq)2x(c+D*!tV6B4rs$!oKT zSqIndL}PX*dlD?63>VSC+x8uis)yv^V+YJ`j!N=GE+c!;z8-h%vYXWgTv*$oSWGO% zJ(7oRZnymISe)%AcN@K^FSpb_z5IA=M4i)8k+kx}N2VO8L`qRA!{`?g5us)1<`k|y z6VqpKGA(s5jW;>JpEGc%P0C8eVLg`f+uJd5C6}Ej^hPKce>FhwBY{SBg(yM(C?A;^~@n7>CqPOWSPI z`E+LH{7{LA9PdqF_~QRbbuFnTfwsYt)h{t8~3FQyyE z3NF*no(h2LxH>D=(hPIQI18OY4;H$`{cwz`B5iKTv&oyxb9@bY_MzN_m^`G*Y}#U? z5P6;8W16sHT)PrG#2UT4Rj#eH0%7L^ECJmPkfYak84S5=xH6BDo*bcI)sQ9BU~Q`s z;Kc}hU$@JLbAeciVRU_h85lbtMu^zvqKbih0P>0TattFk zCrrkT!{TbMY&dBK_73X?HiYc)bp*bJ0eUkO@V$ewnY`wSmH64f{}bJsefTdt8(F0* zj%uj_m7c!d3^))LtM2Mq+U~qaRA}7MkyW7PCfgiB!1UY5N`6dt?neNJl*R2PlHy;J z6nUiE8q{jSM$U2g&nzT2nxD&vg_&!w}Py!!TAR6bZOcVTc0@WOjplFn$ zhP1T9!(Mgu8-B8XXvRdxUzN-vfyxiuj;<66`vpX&S}6H_#`ANEN55@@X<^3IuSNi* zGQ+o8J6|!NaDaECxB)y3$f%z0b?pcYtRcw~aQ`E!XtW;`k3RmkwgKSh{;nq}7bD}= z)px&X_?l1?Gw)CYNdV@mOz2OeUDOZ0pgp-3K55Pa_#&uoNQ7mr{%EPa^PPkQUt3Uy zf+&XwR5VbRfQ*XH(R06Q$yBNW1t5ikbux145X4emnl~*678Kv85jaLo><0L5IwQC8 zk{i+*RNP|I5i0?*&iOxjiqZhg%tw2RTTcEOFu4{7+tj0wCH(6D+x6U`qm5f%Jt~_Rnvi!`A6&+l;R@bEV zHlPlgY^q4jxsg=J;c)(7Tq%BKNB7zD<*-jt^XbMxf?lU1L;m42*3;ADllQgeg`d5> z{X72LMk*J6_KUpewUylpaNhjNrqvQHt+z}Z*-}&b z&;Oi_y6e?tRb|$ygp83hz?fhcoO|nvkiYh44+(hV=*aUEZa|FA`5=3IG5A diff --git a/pix/layout-builder/4-4-4-0.svg b/pix/layout-builder/4-4-4-0.svg new file mode 100644 index 0000000..64d429b --- /dev/null +++ b/pix/layout-builder/4-4-4-0.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + diff --git a/pix/layout-builder/4-8-0-0.png b/pix/layout-builder/4-8-0-0.png index 1272f57776bdaf6a8d16166557d4df5f4730e477..de0993fe6d8075f1d96aa99fa30ff51e3e5e28df 100644 GIT binary patch literal 9185 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 Jox67T{{T56jg9~S literal 1894 zcmcIkdr(qo6#wj@Tc+*Q<|E8($6~c|jZ8BQOD#hOEgz*Wsg;jV(NbJrj5@ZvZBzE} zF{Gr}D7s={MO31s&5pH7Mh^LcB;7F3QpyK}i0pTvntlAe_s+fFx##=tIlptx@0@c7 z1O3dFuU!rRFvA`24F+H-7s}pW8N>ILt1(aDVthQn&ll*ByP8*D0yWD{9f(K=z;re8 z7=emwR#0g|#^Lvw3>&Rov(8*ZS~&()>xiM@WS>+LDK3Q!KLPMbi#tY+i?z!nl26+C z;qV7zo#ITOhc2A&-q0-3#87u2D#G^hNdIh^-N>fZ-+tJ@P}pt7tF+O$pdid{8n}I~ z`}t0*ojedo|kHX&}!igGr z^KfG?R;-kqbm=;8`TZT@4Vhk*$U&BM-Yo>D5dUmvx*Kjv@G6fl71k@vAE)NeZ}WQh z&U0?4V|~6@HcmziC2AxRvF)Yl$)T3e4BjEsP+z)UtvA+deqF0lv?X9^L(gPh z+EOMn#f_WFYU52}AFgT)z_v?j3Cnu*n4gU-%Si?Ewz_>=I z%ciCV~ ze$bt}1oXXd!E;#w!h7fH8PL}7m~2`jAXtEK!K0C5N~KEZQgmW3^c8dFO*(1_+^S}uUwVR4dHWkqR0?QP<@=Py+rSLX032hsxV<8_B0L3kv0L<{T0x`q?%H7kHprz zDWWDB?O7QifKgj99dR&u7cX7JR0f8$5==o(=l`D~aRw2EE(d#}KVd+)&@GFgsM9>` zQ5TJdY2(~yS)P&ymcfyFkmD4IJua-@_&AWe8&Vdx*0^9tWng{87K=fVs7t9-KHjYl z+NV;$yRZuMxzGja6mscUY;ozIg)jx}Ap%+Ef7r7F78bc?B1>M{N_Nu)!i=L)ipiX2 z3ovu}Glycaw9$|9?@BuDJNO(>O*K%ntR?`&;PJxR39bu?mKC`cnyJdew&|Y685PXh z*x1IW=6huv^{_yy<9ZT%AHqvwG9AOh7_1~qgvC&qNnQp80C@4AOV?Q3@_UQe7600P zHIO%IW?MN`@T{|QO|XBtK&GA=<>#M`1u+~h3pR_}#cq@s@9pd z>Tz$-QwU41ioYE$9pzI8B@)R4G}1INzfCt&4=rl1h=+B@<~=22aQ>$eq7OI7raeCQ z)tAgv6r~^tLC#HFu}~<4bs~ygn=&(b2v`0va3u_f(apR2t@nz@l-Fh<$tyM_FAc_b zqk&j)mqe>0t_li(p|lI1$}+TV>iLE3)TN-0oqy^wkH>p~e;xic^peF?&%bxh)o50J zYC0~fg!@nn=QtR+s(#tC5rG0`zJQu|)U%OMx`oOQ?R~9z)$R7oek(&dKAt!mT?^+= zBuOA{%Da_m`Y^Wv`7}&Hk<63sH6V{75Txtd7PxnEHA+(6z+m=FOGn2(Eal^68V#jC zNsr4-^|Vb$NI=)vR`yOrC32!UidVAu4zF-h^4kThLW2xB#Hu!6;*5H}xADUM8eP8i zXm46GW?nL!&mpkpt@Wlf5*GV#3Pu&&$V+Ns&GmEJ1e%4-I?wx9Nwy3W2?a+`(8~xuQ oUh*Fs*;}K}*Qxq61JC4aFC(*KXmFN@UV-f3_67Q~ykiRg0wU^c6#xJL diff --git a/pix/layout-builder/4-8-0-0.svg b/pix/layout-builder/4-8-0-0.svg new file mode 100644 index 0000000..8be8b27 --- /dev/null +++ b/pix/layout-builder/4-8-0-0.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + diff --git a/pix/layout-builder/5-7-0-0.png b/pix/layout-builder/5-7-0-0.png index 2b8b07656f7ce399d1fd88065b39a5d1cc767903..a73dc0089b4bea834991831454503b19da18169e 100644 GIT binary patch literal 5169 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 IbJy?u7h1Eong9R* diff --git a/pix/layout-builder/5-7-0-0.svg b/pix/layout-builder/5-7-0-0.svg new file mode 100644 index 0000000..60d9336 --- /dev/null +++ b/pix/layout-builder/5-7-0-0.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + diff --git a/pix/layout-builder/6-3-3-0.png b/pix/layout-builder/6-3-3-0.png index 192253be8fd220dc0ac1c598fa284dc8bb92e51f..5ce2bf71e362c074b078030e61369a2e2d760312 100644 GIT binary patch literal 3521 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 literal 1907 zcmb_dc~BE)6#tMytO|76dH^Df1soIt6%-2!S`i2mM5<^ga>^MJ6e19=Fs2=9tswU; zSguhFQ37O=2+CL$N(fja0hbUgA_!RmA|N89-vV`G_?BD@_8XvB|U8@eS8To#X;Y~f@sFMRwVnvWH24U>;iw>gTF_a8*f3hCffIq~ zeik2ugB~OVheIdgo}p5in=WCS+F)Spo^_deYrZo3!H9mbpq~VQxnImPe>@y9q2$YDPKC110fwijR;GNNF=Y=wfXy-A#C4~!9l-qa;ZH- zB(RQ*$>rR_5Fz8ReeQ{($wtWag|Qn!N+H=wCw)4-lp#8|PyRHxHE<+mE(g=3=0U4T z;ZmQ>7wzFWMMXu5+_Ai#@DawZwGtkW*Ei3{v@nCaps_ov#%K#a^}S_J_VT1jM!R8s-rQWF?OM=ZkfiekiC2r zY&E(^SGp{D<3-5qqZK|3$Y`WQzv(`vy+Pd*Qf~98U$YER>80iyPWPEA%<)llI&bdP(d<|%};J{dnnHB)LJF2Vakv4*hNwW=RW%M`~8C3@< zSE|CAmjEU>#ZF1?pQ8VwrSJ+B3k$@v3}aJceb1b! zq##?j>Cr7z0ia!7_H)k7hY1*bDaI_sn-4)y@(qb5 zVaVQxk~qi@=b!v!8B!3hjR0J$uL|3}E!}pmYj?CQ^y!zt&0Ao&SHZv*4-G7*?XBk> zNc_2wy+yl=n3ZSv+o>E)!L*A8SN^ka{o?JAIu{}nIwV+iGX&=Mm*cQ3*mR1 zk;ZTK+r0LJ+oJ|6&ISIN!s>4C;?j`a1r_4(lkhd>YUEqbtbt`h?5?Q)|L8HPtaz&f ztB;nunw>JS*XC(@u0%q}Y^1Q@Og!e*ZKa+5xFjL8FVU{EVWnJ%+`JbP>{K+K5(EQ$ z;9^25S}rZw>-329NZeY!D~TzYZEP$EM~A(7;A>;YY)? z2h}>zJKF4npJw|qh?&JDCBySAE#j^yo>0Jz;I%}|?T-v^UeBdfHxG0mOtcJ|RA;lHVV1;yGpsIbF5S?h#e|IfAC#MIk zWy9$!AL1vulUYi-(oWw#IdQUTb82dzOeULOkKd8?RL^$o!+)bLNjQKYNV}|4WHWce tK3aecZ)$83HlMk%3uVcQl|k9%uT&GPt@jKSTC`(K5{|ez)PC!C@h{8ejpqOW diff --git a/pix/layout-builder/6-3-3-0.svg b/pix/layout-builder/6-3-3-0.svg new file mode 100644 index 0000000..45e6175 --- /dev/null +++ b/pix/layout-builder/6-3-3-0.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + diff --git a/pix/layout-builder/6-6-0-0.png b/pix/layout-builder/6-6-0-0.png index 038a8eaba4961c1f13874f7e13f6b6825322d9c2..54d2668b0a88058fd6963700428d4e5c9caac7bd 100644 GIT binary patch literal 2285 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 + + + + + + + + + + diff --git a/pix/layout-builder/7-5-0-0.png b/pix/layout-builder/7-5-0-0.png index c85f9b1bb58cf3ce76154ee48cd058af77f77aaf..9f76d1306701bea26226205a56feac240d3268ee 100644 GIT binary patch literal 5122 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 + + + + + + + + + + diff --git a/pix/layout-builder/8-4-0-0.png b/pix/layout-builder/8-4-0-0.png index bac0520a1979fa2d06889b37f41c3b966f5c3639..d7c2c56494e3a54ae3d6fdf1a6127701af82626b 100644 GIT binary patch literal 9118 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 + + + + + + + + + + diff --git a/pix/layout-builder/9-3-0-0.png b/pix/layout-builder/9-3-0-0.png index 6df7dfd3c4efd657a6a31547a8f5e4b4f97f70e5..e6dc43364ded42572b92c6b9949350c3ed05b2ff 100644 GIT binary patch literal 8010 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 + + + + + + + + + + diff --git a/scss/settings/adaptable.scss b/scss/settings/adaptable.scss index 371bc26..66ed585 100644 --- a/scss/settings/adaptable.scss +++ b/scss/settings/adaptable.scss @@ -461,9 +461,17 @@ a.component-expand .badge { margin-top: 20px; } +.flexibleblocks, #marketblocks { background-color: [[setting:marketblocksbackgroundcolor]]; padding-bottom: 10px; + + h3 { + font-size: 24px; + font-weight: normal; + line-height: 48px; + margin: 10px auto; + } } #marketblocks .internalmarket { @@ -473,23 +481,36 @@ a.component-expand .badge { text-align: center; } -.marketimage { +.marketimage { // Deprecated. border: 0; display: block; width: 100%; } -#marketblocks h3 { - font-size: 24px; - font-weight: normal; - line-height: 48px; - margin: 10px auto; -} - +.flexiblerow, .marketrow { margin-top: 20px; } +.editing-flexible-blocks, +.flexible-blocks-overflow { + column-gap: 0.25rem; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: start; + + .block { + flex: 0 0 calc(25% - 0.5rem); + max-width: 25%; + } +} + +.flexible-blocks-overflow { + margin-right: -15px; + margin-left: -15px; +} + img.emoticon { height: [[setting:emoticonsize]]; width: [[setting:emoticonsize]]; diff --git a/scss/settings/blocks.scss b/scss/settings/blocks.scss index 1c78a25..8e5da60 100644 --- a/scss/settings/blocks.scss +++ b/scss/settings/blocks.scss @@ -289,22 +289,41 @@ text-decoration: none; } -.block .calendar-controls .previous:before { - content: "\f053"; // chevron-left <- chevron-left. - font-family: "Font Awesome 6 Free"; -} - -.block .calendar-controls .next:before { - content: "\f054"; // chevron-right <- chevron-right. - font-family: "Font Awesome 6 Free"; +.block .calendar-controls { + .previous, + .next { + font-size: 0.8rem; + margin-top: 0.125rem; + .arrow { + display: none; + } + &:before, + &:after { + font-family: "Font Awesome 6 Free"; + font-weight: 900; + } + } + .previous { + &:before { + content: "\f053"; // chevron-left. + } + } + .next { + &:after { + content: "\f054"; // chevron-right. + } + } } -.block .calendar-controls .previous .arrow, -.block .calendar-controls .next .arrow { - display: none; +@media (min-width: 768px) { + section:not(#region-main) .block.block_calendar_month .maincalendar .calendarwrapper { + .previous, + .next { + font-size: .8rem; + } + } } - // Comments block. .block_comments div.content li { list-style-type: none; diff --git a/settings.php b/settings.php index 795f683..c627971 100644 --- a/settings.php +++ b/settings.php @@ -59,11 +59,11 @@ include(dirname(__FILE__) . '/settings/footer.php'); include(dirname(__FILE__) . '/settings/frontpage_courses.php'); include(dirname(__FILE__) . '/settings/frontpage_slider.php'); - include(dirname(__FILE__) . '/settings/news_ticker.php'); include(dirname(__FILE__) . '/settings/header.php'); include(dirname(__FILE__) . '/settings/header_menus.php'); include(dirname(__FILE__) . '/settings/header_social.php'); include(dirname(__FILE__) . '/settings/header_user.php'); + include(dirname(__FILE__) . '/settings/information_blocks.php'); include(dirname(__FILE__) . '/settings/layout.php'); include(dirname(__FILE__) . '/settings/layout_responsive.php'); include(dirname(__FILE__) . '/settings/login.php'); @@ -72,6 +72,7 @@ include(dirname(__FILE__) . '/settings/navbar_mycourses.php'); include(dirname(__FILE__) . '/settings/navbar_links.php'); include(dirname(__FILE__) . '/settings/navbar_styles.php'); + include(dirname(__FILE__) . '/settings/news_ticker.php'); include(dirname(__FILE__) . '/settings/navbar_tools_menu.php'); include(dirname(__FILE__) . '/settings/print.php'); include(dirname(__FILE__) . '/settings/templates.php'); diff --git a/settings/array_definitions.php b/settings/array_definitions.php index aaa1af4..eb2e90c 100644 --- a/settings/array_definitions.php +++ b/settings/array_definitions.php @@ -249,6 +249,7 @@ $bootstrap12defaults = ['3-3-3-3', '4-4-4-0', '3-3-3-3', '0-0-0-0', '0-0-0-0']; + $informationblocksbuilderdefaults = ['3-3-3-3', '0-0-0-0', '0-0-0-0', '0-0-0-0', '0-0-0-0']; $marketingfooterbuilderdefaults = ['3-3-3-3', '0-0-0-0', '0-0-0-0', '0-0-0-0', '0-0-0-0']; // Adaptable Tabbed Layout changes. 0 signifies the course content or dashboard main content. diff --git a/settings/information.php b/settings/information.php index b7fe829..3f76e3d 100644 --- a/settings/information.php +++ b/settings/information.php @@ -38,11 +38,11 @@ get_string('settingsinformation', 'theme_adaptable') ); - // Support.md. - $name = 'theme_adaptable/themesupport'; - $title = get_string('themesupport', 'theme_adaptable'); - $description = 'Support.md'; - $setting = new admin_setting_markdown($name, $title, $description, 'Support.md'); + // SupportAndSponsorship.md. + $name = 'theme_adaptable/themesupportsponsorship'; + $title = get_string('themesupportsponsorship', 'theme_adaptable'); + $description = 'SupportAndSponsorship.md'; + $setting = new admin_setting_markdown($name, $title, $description, 'SupportAndSponsorship.md'); $page->add($setting); // Changes.md. diff --git a/settings/information_blocks.php b/settings/information_blocks.php new file mode 100644 index 0000000..010bda2 --- /dev/null +++ b/settings/information_blocks.php @@ -0,0 +1,81 @@ +. + +/** + * Information blocks + * + * @package theme_adaptable + * @copyright 2024 G J Barnard + * {@link https://moodle.org/user/profile.php?id=442195} + * {@link https://gjbarnard.co.uk} + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later. + */ +defined('MOODLE_INTERNAL') || die; + +// Information blocks section. +if ($ADMIN->fulltree) { + $page = new \theme_adaptable\admin_settingspage('theme_adaptable_information_blocks', + get_string('informationblocksettings', 'theme_adaptable')); + + $page->add(new admin_setting_heading( + 'theme_adaptable_information', + get_string('informationsettingsheading', 'theme_adaptable'), + format_text(get_string('informationsettingsdesc', 'theme_adaptable'), FORMAT_MARKDOWN) + )); + + $name = 'theme_adaptable/informationblocksenabled'; + $title = get_string('informationblocksenabled', 'theme_adaptable'); + $description = get_string('informationblocksenableddesc', 'theme_adaptable'); + $setting = new admin_setting_configcheckbox($name, $title, $description, $default, true, false); + $page->add($setting); + + $name = 'theme_adaptable/informationblocksvisible'; + $title = get_string('informationblocksvisible', 'theme_adaptable'); + $description = get_string('informationblocksvisibledesc', 'theme_adaptable'); + $options = [ + 1 => get_string('informationblocksvisibleloggedout', 'theme_adaptable'), + 2 => get_string('informationblocksvisibleloggedin', 'theme_adaptable'), + 3 => get_string('informationblocksvisibleloggedinout', 'theme_adaptable'), + ]; + $setting = new admin_setting_configselect($name, $title, $description, 3, $options); + $page->add($setting); + + $page->add(new admin_setting_heading( + 'theme_adaptable_informationblocksbuilder', + get_string('informationblocksbuilderheading', 'theme_adaptable'), + format_text(get_string('informationblocksbuilderdesc', 'theme_adaptable'), FORMAT_MARKDOWN) + )); + + // Information block region builder. + ['imgblder' => $imgblder, 'totalblocks' => $totalblocks] = \theme_adaptable\toolbox::admin_settings_layout_builder( + $page, + 'informationblockslayoutrow', + $informationblocksbuilderdefaults, + $bootstrap12 + ); + + if ($totalblocks > 0) { + $page->add(new admin_setting_heading( + 'theme_adaptable_informationblocklayoutcheck', + get_string('layoutcheck', 'theme_adaptable'), + format_text(get_string('layoutcheckdesc', 'theme_adaptable'), FORMAT_MARKDOWN) + )); + + $page->add(new admin_setting_heading('theme_adaptable_layoutbuilder', '', $imgblder)); + } + + $asettings->add($page); +} diff --git a/templates/core_message/message_drawer.mustache b/templates/core_message/message_drawer.mustache index a4487b8..f225bdc 100644 --- a/templates/core_message/message_drawer.mustache +++ b/templates/core_message/message_drawer.mustache @@ -39,9 +39,7 @@

{{#str}} messagingcategory, admin {{/str}}

diff --git a/templates/tool_usertours/tourstep.mustache b/templates/tool_usertours/tourstep.mustache index 3ef3000..b686669 100644 --- a/templates/tool_usertours/tourstep.mustache +++ b/templates/tool_usertours/tourstep.mustache @@ -50,7 +50,7 @@
diff --git a/version.php b/version.php index 2d713e2..af4a31d 100644 --- a/version.php +++ b/version.php @@ -33,17 +33,17 @@ $plugin->component = 'theme_adaptable'; // Adaptable version date (YYYYMMDDrr where rr is the release number). -$plugin->version = 2024032801; +$plugin->version = 2024032802; $plugin->requires = 2024042200.00; // 4.4 (Build: 20240422). $plugin->supported = [404, 404]; // Adaptable version using SemVer (https://semver.org). -$plugin->release = '404.0.2'; +$plugin->release = '404.1.0'; // Adaptable maturity (do not use ALPHA or BETA versions in production sites). -$plugin->maturity = MATURITY_RC; +$plugin->maturity = MATURITY_STABLE; // Adaptable dependencies (Only Boost as it's the parent theme). $plugin->dependencies = [