From 2f1bfd3732e891e9fdbbb54ca135ca1d26d94613 Mon Sep 17 00:00:00 2001 From: "michael.danielczok" <michael@pcsg.de> Date: Thu, 23 Feb 2023 18:44:08 +0100 Subject: [PATCH] refactor: Tabs Control improved (more settings) --- bin/Controls/NavTabs.js | 1 - bricks.xml | 39 ++--- src/QUI/Menu/Controls/Tabs.css | 244 ++++++++++++++------------------ src/QUI/Menu/Controls/Tabs.html | 77 +++++----- src/QUI/Menu/Controls/Tabs.php | 52 ++++++- 5 files changed, 219 insertions(+), 194 deletions(-) diff --git a/bin/Controls/NavTabs.js b/bin/Controls/NavTabs.js index 96ec636..3502529 100644 --- a/bin/Controls/NavTabs.js +++ b/bin/Controls/NavTabs.js @@ -322,7 +322,6 @@ define('package/quiqqer/menu/bin/Controls/NavTabs', [ }, $animate: function (Target, options) { - console.log(options) return new Promise(function (resolve) { options = options || {}; options.targets = Target; diff --git a/bricks.xml b/bricks.xml index 7d72f05..6191ef6 100644 --- a/bricks.xml +++ b/bricks.xml @@ -112,46 +112,49 @@ <settings> <setting name="template" type="select"> <locale group="quiqqer/menu" - var="control.tabs.default"/> + var="control.tabs.template"/> - <option value="smallImgLeft"> + <option value="simple"> <locale group="quiqqer/menu" - var="control.tabs.tabsStyle.smallImgLeft"/> + var="control.tabs.template.simple"/> </option> </setting> - <setting name="tabImgHeight" type="number"> + <setting name="navImgHeight" type="number"> <locale group="quiqqer/menu" - var="control.tabs.tabImgHeight"/> + var="control.tabs.navImgHeight"/> <description> <locale group="quiqqer/menu" - var="control.tabs.tabImgHeight.desc"/> + var="control.tabs.navImgHeight.desc"/> </description> </setting> - <setting name="tabsImgPos" type="select"> + <!-- nav style --> + <setting name="navStyle" type="select"> <locale group="quiqqer/menu" - var="control.tabs.imagePos"/> + var="control.tabs.navStyle"/> - <option value="left"> + <option value="imgLeft"> <locale group="quiqqer/menu" - var="control.tabs.tabsImgPos.left"/> + var="control.tabs.navStyle.imgLeft"/> </option> - <option value="top"> + <option value="imgTop"> <locale group="quiqqer/menu" - var="control.tabs.tabsImgPos.top"/> + var="control.tabs.navStyle.imgTop"/> </option> - <option value="right"> - <locale group="quiqqer/menu" - var="control.tabs.tabsImgPos.right"/> - </option> - <option value="bottom"> + <option value="onlyImg"> <locale group="quiqqer/menu" - var="control.tabs.tabsImgPos.bottom"/> + var="control.tabs.navStyle.onlyImg"/> </option> </setting> + <setting name="navCenter" type="checkbox"> + <locale group="quiqqer/menu" + var="control.tabs.navCenter"/> + </setting> + + <setting name="entries" type="hidden" data-qui="package/quiqqer/menu/bin/Controls/Tabs.Settings"> <locale group="quiqqer/menu" var="control.tabs.entries"/> </setting> diff --git a/src/QUI/Menu/Controls/Tabs.css b/src/QUI/Menu/Controls/Tabs.css index 23329e6..3c833c6 100644 --- a/src/QUI/Menu/Controls/Tabs.css +++ b/src/QUI/Menu/Controls/Tabs.css @@ -10,76 +10,142 @@ padding: 0; } +/*******/ /* nav */ +/*******/ .quiqqer-tabsAdvanced-nav-inner { display: flex; flex-wrap: nowrap; - /*width: max-content;*/ - /*margin-inline: auto;*/ + overflow: hidden; } +@media screen and (max-width: 767px) { + .quiqqer-tabsAdvanced-nav-inner { + overflow: auto; + } +} + +.quiqqer-tabsAdvanced-nav-item { + /*flex: 1;*/ + min-width: 200px; +} + +@media screen and (min-width: 768px) { + .quiqqer-tabsAdvanced-nav-inner__center { + justify-content: center; + } +} + + .quiqqer-tabsAdvanced-nav-link { padding: 1rem; color: inherit; - display: flex; - align-items: center; height: 100%; - gap: 1rem; } .quiqqer-tabsAdvanced-nav-link img { - height: var(--quiqqer-tabsAdvanced-tabImgHeight, 24px); + height: var(--quiqqer-tabsAdvanced-navImgHeight, 20px); vertical-align: middle; display: block; width: auto; + margin-left: auto; + margin-right: auto; +} + +.quiqqer-tabsAdvanced-nav-link .fa { + display: block; + font-size: var(--quiqqer-tabsAdvanced-navImgHeight, 20px); } .active > .quiqqer-tabsAdvanced-nav-link { color: var(--qui-color-primary); } +/*************/ +/* nav style */ +/*************/ +/* img left */ +.navTabStyle__imgLeft.quiqqer-tabsAdvanced-nav-link { + display: flex; + align-items: center; + gap: 1rem; +} + +.navTabStyle__imgLeft.quiqqer-tabsAdvanced-nav-link > picture { + width: max-content; + min-width: max-content; +} + +/* img top */ +.navTabStyle__imgTop.quiqqer-tabsAdvanced-nav-link { + display: block; + text-align: center; +} + +.navTabStyle__imgTop.quiqqer-tabsAdvanced-nav-linkLabel { + margin-top: 0.5rem; + display: block; +} + +/* only img */ +.navTabStyle__onlyImg.quiqqer-tabsAdvanced-nav-link { + display: block; +} + +/***********/ /* content */ +/***********/ .quiqqer-tabsAdvanced-content { margin-top: var(--qui-spacing-xl, 2rem); } .quiqqer-tabsAdvanced-content-item { + --min-image-container-width: 200px; display: grid; gap: var(--qui-spacing-xl, 2rem); width: 100%; max-width: 100%; + margin-inline: auto; } -.quiqqer-tabsAdvanced-content-item:not(.no-image).left { - grid-template-areas: "image content"; - grid-template-columns: 1fr auto; +.quiqqer-tabsAdvanced-content-item.no-image { + gap: 0; + grid-template-areas: "content"; } -.quiqqer-tabsAdvanced-content-item:not(.no-image).right { - grid-template-areas: "content image"; - grid-template-columns: auto 1fr; -} +@media screen and (min-width: 768px) { -.quiqqer-tabsAdvanced-content-item:not(.no-image).top { - grid-template-areas: "image" "content"; - width: max-content; - margin-inline: auto; -} + .quiqqer-tabsAdvanced-content-item:not(.no-image).left { + grid-template-areas: "image content"; + grid-template-columns: 1fr auto; + } -.quiqqer-tabsAdvanced-content-item:not(.no-image).bottom { - grid-template-areas: "content" "image"; - width: max-content; - margin-inline: auto; -} + .quiqqer-tabsAdvanced-content-item:not(.no-image).right { + grid-template-areas: "content image"; + grid-template-columns: auto 1fr; + } -.quiqqer-tabsAdvanced-content-item.top { - width: max-content; - margin-inline: auto; -} + .quiqqer-tabsAdvanced-content-item:not(.no-image).top { + grid-template-areas: "image" "content"; + width: max-content; + margin-inline: auto; + } -.quiqqer-tabsAdvanced-content-item.bottom { - width: max-content; - margin-inline: auto; + .quiqqer-tabsAdvanced-content-item:not(.no-image).bottom { + grid-template-areas: "content" "image"; + width: max-content; + margin-inline: auto; + } + + .quiqqer-tabsAdvanced-content-item.top { + width: max-content; + margin-inline: auto; + } + + .quiqqer-tabsAdvanced-content-item.bottom { + width: max-content; + margin-inline: auto; + } } .quiqqer-tabsAdvanced-content-image { @@ -89,125 +155,35 @@ justify-content: center; } +.quiqqer-tabsAdvanced-content-image-inner { + max-width: var(--quiqqer-tabsAdvanced-contentImgMaxWidth, 700px); + min-width: 200px; +} + .quiqqer-tabsAdvanced-content-image img { - max-width: var(--quiqqer-tabsAdvanced-contentImgMaxWidth, 100%); - max-height: var(--quiqqer-tabsAdvanced-contentImgMaxHeight, 100%); width: auto; height: auto; } .quiqqer-tabsAdvanced-content-body { grid-area: content; - max-width: var(--quiqqer-tabsAdvanced-contentTextWidth, 700px); -} - - -/* test */ -/*.quiqqer-tabsAdvanced-content{*/ -/* border: 2px solid;*/ -/* border-radius: 1rem;*/ -/*}*/ -/*.quiqqer-tabsAdvanced-content-item {*/ -/* padding: 2rem;*/ -/*}*/ - - - -.quiqqer-menu-navTabsVertical .quiqqer-menu-navTabsVertical-tabs-body { - margin-bottom: 2rem; -} - -.quiqqer-menu-navTabsVertical-container .quiqqer-menu-navTabsVertical-tabs-nav, -.quiqqer-menu-navTabsVertical-container .quiqqer-tab-content { - list-style: none; - margin-left: 0; - padding-left: 0; -} - -.quiqqer-menu-navTabsVertical-container .quiqqer-tab-nav-item, -.quiqqer-menu-navTabsVertical-container .quiqqer-tab-content-item { - margin-left: 0; - padding-left: 0; -} - -.quiqqer-menu-navTabsVertical-container .quiqqer-tab-nav-item a { - display: block; - margin-bottom: 0.5rem; - padding: 1rem; -} - -.quiqqer-menu-navTabsVertical-container .quiqqer-tab-nav-item:not(.active) a { - color: inherit; } -.quiqqer-menu-navTabsVertical-container .quiqqer-tab-nav-item.active a { - -} - -.quiqqer-menu-navTabsVertical-container .quiqqer-tab-nav-item .fa, -.quiqqer-menu-navTabsVertical-container .quiqqer-tab-nav-item img { - margin-right: 1rem; -} - -.quiqqer-menu-navTabsVertical-container .quiqqer-tab-nav-item img { - width: 2rem; - height: auto; - vertical-align: middle; -} - -.quiqqer-menu-navTabsVertical-content-image { - text-align: center; - margin-bottom: 1rem; +.quiqqer-tabsAdvanced-content-body-inner { + max-width: var(--quiqqer-tabsAdvanced-contentTextWidth, 700px); + margin-inline: auto; } @media screen and (max-width: 767px) { - .quiqqer-menu-navTabsVertical-container { - flex-wrap: wrap; - gap: 0; + .quiqqer-tabsAdvanced-content-item { + display: block; } - .quiqqer-menu-navTabsVertical-tabs, - .quiqqer-menu-navTabsVertical-content { - width: 100%; - } - - .quiqqer-menu-navTabsVertical .quiqqer-menu-navTabsVertical-tabs { - margin-bottom: 0; - } - - .quiqqer-menu-navTabsVertical-tabs-nav-container { - position: relative; - } - - .quiqqer-menu-navTabsVertical-tabs-nav-container:before, - .quiqqer-menu-navTabsVertical-tabs-nav-container:after { - content: ''; - height: 100%; - position: absolute; - top: 0; - width: 40px; - } - - .quiqqer-menu-navTabsVertical-tabs-nav-container:before { - background: linear-gradient(90deg, #fff, transparent); - left: 0; - } - - .quiqqer-menu-navTabsVertical-tabs-nav-container:after { - background: linear-gradient(90deg, transparent, #fff); - right: 0; - } - - .quiqqer-menu-navTabsVertical-container .quiqqer-menu-navTabsVertical-tabs-nav { - display: flex; - overflow: auto; - padding: 2rem 1rem; - white-space: nowrap; + .quiqqer-tabsAdvanced-content-image { + margin-bottom: var(--qui-spacing-xl, 2rem); } - .quiqqer-menu-navTabsVertical-container .quiqqer-tab-nav-item { - margin-left: 0.5rem; - margin-right: 0.5rem; - flex-shrink: 0; + .quiqqer-tabsAdvanced-content-image { + text-align: center; } } \ No newline at end of file diff --git a/src/QUI/Menu/Controls/Tabs.html b/src/QUI/Menu/Controls/Tabs.html index c0a657c..f191d97 100644 --- a/src/QUI/Menu/Controls/Tabs.html +++ b/src/QUI/Menu/Controls/Tabs.html @@ -1,35 +1,39 @@ {if $this->getAttribute('showTitle') && $this->getAttribute('frontendTitle')} -<header class="control-header"> - <h1>{$this->getAttribute('frontendTitle')}</h1> -</header> + <header class="control-header"> + <h1>{$this->getAttribute('frontendTitle')}</h1> + </header> {/if} {if $this->getAttribute('content') != ""} -<div class="control-body default-content"> - {$this->getAttribute('content')} -</div> + <div class="control-body default-content"> + {$this->getAttribute('content')} + </div> {/if} <div class="control-template quiqqer-tabsAdvanced-control" style=" - {if $tabImgHeight}--quiqqer-tabsAdvanced-tabImgHeight: {$tabImgHeight}px;{/if} - {if $contentTextWidth}--quiqqer-tabsAdvanced-contentTextWidth: {$contentTextWidth}px;{/if} - {if $contentImgMaxWidth}--quiqqer-tabsAdvanced-contentImgMaxWidth: {$contentImgMaxWidth}px;{/if} - {if $contentImgMaxHeight}--quiqqer-tabsAdvanced-contentImgMaxHeight: {$contentImgMaxHeight}px;{/if} -"> +{if $navImgHeight}--quiqqer-tabsAdvanced-navImgHeight: {$navImgHeight}px;{/if} +{if $contentTextWidth}--quiqqer-tabsAdvanced-contentTextWidth: {$contentTextWidth}px;{/if} +{if $contentImgMaxWidth}--quiqqer-tabsAdvanced-contentImgMaxWidth: {$contentImgMaxWidth}px;{/if} +{if $contentImgMaxHeight}--quiqqer-tabsAdvanced-contentImgMaxHeight: {$contentImgMaxHeight}px;{/if} + "> <div class="quiqqer-tabsAdvanced-nav"> - <ul class="quiqqer-tabsAdvanced-nav-inner quiqqer-tab-nav"> + <ul class="quiqqer-tabsAdvanced-nav-inner {$navAlignment} quiqqer-tab-nav"> {foreach from=$entries item=entry key=key} - <li class="quiqqer-tabsAdvanced-nav-item quiqqer-tab-nav-item {if $key == $active - 1}active{/if}" data-entry-nav-pos="{$key}"> - <a href="#{QUI\Utils\Security\Orthos::urlEncodeString($entry.tabTitle)}" - data-qui-disableTemplateScroll="1" - class="quiqqer-tabsAdvanced-nav-link"> - {if isset($entry.tabIcon) && $entry.tabIcon} - {image src=$entry.tabIcon width="80" height="80"} - {/if} + <li class="quiqqer-tabsAdvanced-nav-item {$navTabStyleCss} + quiqqer-tab-nav-item {if $key == $active - 1}active{/if}" + data-entry-nav-pos="{$key}"> + <a href="#{QUI\Utils\Security\Orthos::urlEncodeString($entry.tabTitle)}" + data-qui-disableTemplateScroll="1" + class="quiqqer-tabsAdvanced-nav-link {$navTabStyleCss}"> + {if isset($entry.tabIcon) && $entry.tabIcon} + {image src=$entry.tabIcon width="80" height="80"} + {/if} - <span class="quiqqer-tabsAdvanced-nav-linkLabel">{$entry.tabTitle}</span> - </a> - </li> + {if $showNavText} + <span class="quiqqer-tabsAdvanced-nav-linkLabel {$navTabStyleCss}">{$entry.tabTitle}</span> + {/if} + </a> + </li> {/foreach} </ul> </div> @@ -54,7 +58,6 @@ {if (isset($entry.entryTitle) && $entry.entryTitle) || (isset($entry.entryContent) && $entry.entryContent)} {assign var=content value=true} {/if} - <li class="quiqqer-tabsAdvanced-content-item quiqqer-tab-content-item {$imgPos} {if !$imgSrc}no-image{/if} {if !$content}no-content{/if} @@ -65,24 +68,28 @@ {if $imgSrc} <div class="quiqqer-tabsAdvanced-content-image"> + <div class="quiqqer-tabsAdvanced-content-image-inner"> {image src=$imgSrc width="600" height="600"} + </div> </div> {/if} {if $content} - <div class="quiqqer-tabsAdvanced-content-body"> - {if isset($entry.entryTitle) && $entry.entryTitle} - <h2 class="quiqqer-tabsAdvanced-content-title"> - {$entry.entryTitle} - </h2> - {/if} + <div class="quiqqer-tabsAdvanced-content-body"> + <div class="quiqqer-tabsAdvanced-content-body-inner"> + {if isset($entry.entryTitle) && $entry.entryTitle} + <h2 class="quiqqer-tabsAdvanced-content-title"> + {$entry.entryTitle} + </h2> + {/if} - {if isset($entry.entryContent) && $entry.entryContent} - <div class="quiqqer-tabsAdvanced-content-text default-content"> - {$entry.entryContent} - </div> - {/if} - </div> + {if isset($entry.entryContent) && $entry.entryContent} + <div class="quiqqer-tabsAdvanced-content-text default-content"> + {$entry.entryContent} + </div> + {/if} + </div> + </div> {/if} </li> {/foreach} diff --git a/src/QUI/Menu/Controls/Tabs.php b/src/QUI/Menu/Controls/Tabs.php index cfa133c..2581e34 100644 --- a/src/QUI/Menu/Controls/Tabs.php +++ b/src/QUI/Menu/Controls/Tabs.php @@ -27,14 +27,21 @@ public function __construct($attributes = []) $this->setAttributes([ 'class' => 'quiqqer-tabs', 'qui-class' => 'package/quiqqer/menu/bin/Controls/NavTabs', - 'tabImgHeight' => 24, - 'contentImgMaxWidth' => 300, - 'contentImgMaxHeight' => 500, - 'contentTextWidth' => 700, 'activeEntry' => 1, // number - 'imageMaxHeight' => false, 'entries' => [], 'template' => 'simple', + + // tabs nav + 'navImgHeight' => 20, // number + 'navStyle' => 'imgLeft', // imgLeft, imgTop, onlyImg + 'navCenter' => false, + + // tabs content + 'contentImgMaxWidth' => 600, // number + 'contentImgMaxHeight' => 300, // number + 'contentTextWidth' => 600, // number + + ]); parent::__construct($attributes); @@ -65,17 +72,50 @@ public function getBody() array_push($enabledEntries, $entry); } +// foreach ($entries as $entry) { +// array_push($enabledEntries, $entry); +// } +// +// foreach ($entries as $entry) { +// array_push($enabledEntries, $entry); +// } + $active = 1; if ($this->getAttribute('activeEntry') && $this->getAttribute('activeEntry') > 0) { $active = $this->getAttribute('activeEntry'); } + /* template */ + $template = 'simple'; + + /* nav */ + $showNavText = true; + $navTabStyleCss = 'navTabStyle__imgLeft'; + $navAlignment = 'quiqqer-tabsAdvanced-nav-inner__left'; + + switch ($this->getAttribute('navStyle')) { + case 'imgTop': + $navTabStyleCss = 'navTabStyle__imgTop'; + break; + case 'onlyImg': + $navTabStyleCss = 'navTabStyle__onlyImg'; + $showNavText = false; + } + + if ($this->getAttribute('navCenter')) { + $navAlignment = 'quiqqer-tabsAdvanced-nav-inner__center'; + } + $Engine->assign([ 'this' => $this, 'entries' => $enabledEntries, 'active' => $active, - 'tabImgHeight' => $this->getAttribute('tabImgHeight'), + 'navImgHeight' => $this->getAttribute('navImgHeight'), + 'navStyle' => $this->getAttribute('navStyle'), + 'navTabStyleCss' => $navTabStyleCss, + 'showNavText' => $showNavText, + 'navAlignment' => $navAlignment, 'contentTextWidth' => $this->getAttribute('contentTextWidth'), 'contentImgMaxWidth' => $this->getAttribute('contentImgMaxWidth'), 'contentImgMaxHeight' => $this->getAttribute('contentImgMaxHeight') -- GitLab