Finalize searchbar position on different page layouts

This commit is contained in:
Björn Fromme
2021-09-02 15:32:41 +02:00
parent 9e5cedf9ac
commit eb7d91a458
15 changed files with 98 additions and 56 deletions
@@ -83,7 +83,7 @@ class SearchbarController extends ActionController
$this->view->assignMultiple([ $this->view->assignMultiple([
'filterOptions' => $filterOptions, 'filterOptions' => $filterOptions,
'searchParams' => $searchParams, 'searchParams' => $searchParams,
'fixed' => (bool)$this->settings['fixed'], 'collapsed' => (bool)$this->settings['collapsed'],
]); ]);
} }
} }
@@ -17,5 +17,5 @@ lib.searchBar {
view =< plugin.tx_epproducts.view view =< plugin.tx_epproducts.view
} }
lib.searchBarFixed < lib.searchBar lib.searchBarCollapsed < lib.searchBar
lib.searchBarFixed.settings.fixed = 1 lib.searchBarCollapsed.settings.collapsed = 1
@@ -0,0 +1,14 @@
import { Controller } from 'stimulus'
import { useDispatch } from 'stimulus-use'
export default class extends Controller {
initialize() {
useDispatch(this)
}
toggle(e) {
e.preventDefault()
this.dispatch('toggle')
}
}
@@ -5,10 +5,9 @@ export default class extends Controller {
static debounces = [ 'toggle' ] static debounces = [ 'toggle' ]
static classes = [ 'sticky' ]
static values = { static values = {
sticky: Boolean, sticky: Boolean,
classes: String,
offset: Number, offset: Number,
disabled: Boolean, disabled: Boolean,
} }
@@ -37,7 +36,11 @@ export default class extends Controller {
} }
stickyValueChanged() { stickyValueChanged() {
let stickyClass = this.hasStickyClass ? this.stickyClass : 'sticky' if (!this.hasClassesValue) {
this.element.classList.toggle(stickyClass, this.stickyValue) return
}
this.classesValue.split(' ').forEach(className => {
this.element.classList.toggle(className, this.stickyValue)
})
} }
} }
@@ -2,6 +2,10 @@
@apply hidden relative lg:block lg:container -mt-20 mb-8; @apply hidden relative lg:block lg:container -mt-20 mb-8;
&.sticky { &.sticky {
@apply fixed z-50 top-0 left-0 mt-8 mb-0 inset-x-0 max-w-full px-0 shadow-lg; @apply fixed z-50 top-0 left-0 mt-8 mb-0 inset-x-0 shadow-lg;
}
&.reduced {
@apply max-w-full px-0 mt-8 mb-0;
} }
} }
@@ -1,7 +1,7 @@
@import "~@splidejs/splide/dist/css/splide-core.min.css"; @import "~@splidejs/splide/dist/css/splide-core.min.css";
.slider-pagination { .slider-pagination {
@apply absolute bottom-0 left-1/2 transform -translate-x-1/2 md:mb-4; @apply absolute bottom-0 left-1/2 transform -translate-x-1/2 md:mb-8;
@apply list-none p-0; @apply list-none p-0;
@apply flex items-center space-x-2; @apply flex items-center space-x-2;
} }
@@ -4,13 +4,11 @@
<f:render partial="GoogleTagManager" arguments="{googleTagManagerId: settings.googleTagManagerId}"/> <f:render partial="GoogleTagManager" arguments="{googleTagManagerId: settings.googleTagManagerId}"/>
<f:render partial="FacebookPixelCode"/> <f:render partial="FacebookPixelCode"/>
<div class="lg:mt-24"> <div class="lg:mt-8">
<f:if condition="{data.tx_eptheme_hide_searchbar}"> <f:cObject typoscriptObjectPath="lib.searchBarCollapsed"/>
<f:else> <f:alias map="{searchbarCollapsed: 1}">
<f:cObject typoscriptObjectPath="lib.searchBarFixed"/> <f:render partial="Mainnav" section="Main" arguments="{_all}"/>
</f:else> </f:alias>
</f:if>
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
<f:render section="Content"/> <f:render section="Content"/>
<f:render section="Teasers"/> <f:render section="Teasers"/>
<f:render partial="Footer" arguments="{_all}"/> <f:render partial="Footer" arguments="{_all}"/>
@@ -4,14 +4,14 @@
<f:render partial="GoogleTagManager" arguments="{googleTagManagerId: settings.googleTagManagerId}"/> <f:render partial="GoogleTagManager" arguments="{googleTagManagerId: settings.googleTagManagerId}"/>
<f:render partial="FacebookPixelCode"/> <f:render partial="FacebookPixelCode"/>
<div class="lg:mt-32"> <div class="lg:mt-8">
<f:if condition="{data.tx_eptheme_hide_searchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBarFixed"/>
</f:else>
</f:if>
<f:render partial="Mainnav" section="Main" arguments="{_all}"/> <f:render partial="Mainnav" section="Main" arguments="{_all}"/>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/> <f:render partial="HeaderSliderSmall" arguments="{_all}"/>
<f:if condition="{data.tx_eptheme_hide_searchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBar"/>
</f:else>
</f:if>
<f:render section="Content"/> <f:render section="Content"/>
<f:render section="Teasers"/> <f:render section="Teasers"/>
<f:render partial="Footer" arguments="{_all}"/> <f:render partial="Footer" arguments="{_all}"/>
@@ -5,13 +5,13 @@
<f:render partial="GoogleTagManager" arguments="{googleTagManagerId: settings.googleTagManagerId}"/> <f:render partial="GoogleTagManager" arguments="{googleTagManagerId: settings.googleTagManagerId}"/>
<f:render partial="FacebookPixelCode"/> <f:render partial="FacebookPixelCode"/>
<div class="lg:mt-8"> <div class="lg:mt-8">
<f:if condition="{data.tx_eptheme_hide_searchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBarFixed"/>
</f:else>
</f:if>
<f:render partial="Mainnav" section="Main" arguments="{_all}"/> <f:render partial="Mainnav" section="Main" arguments="{_all}"/>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/> <f:render partial="HeaderSliderSmall" arguments="{_all}"/>
<f:if condition="{data.tx_eptheme_hide_searchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBar"/>
</f:else>
</f:if>
<f:render section="Header" optional="true"/> <f:render section="Header" optional="true"/>
<div class="container grid grid-cols-3 gap-8"> <div class="container grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-1"> <div class="col-span-3 lg:col-span-1">
@@ -4,14 +4,14 @@
<f:render partial="GoogleTagManager" arguments="{googleTagManagerId: settings.googleTagManagerId}"/> <f:render partial="GoogleTagManager" arguments="{googleTagManagerId: settings.googleTagManagerId}"/>
<f:render partial="FacebookPixelCode"/> <f:render partial="FacebookPixelCode"/>
<div class="lg:mt-32"> <div class="lg:mt-8">
<f:if condition="{data.tx_eptheme_hide_searchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBarFixed"/>
</f:else>
</f:if>
<f:render partial="Mainnav" section="Main" arguments="{_all}"/> <f:render partial="Mainnav" section="Main" arguments="{_all}"/>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/> <f:render partial="HeaderSliderSmall" arguments="{_all}"/>
<f:if condition="{data.tx_eptheme_hide_searchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBar"/>
</f:else>
</f:if>
<f:render section="Header" optional="true"/> <f:render section="Header" optional="true"/>
<div class="container grid grid-cols-3 gap-8"> <div class="container grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-2"> <div class="col-span-3 lg:col-span-2">
@@ -3,7 +3,7 @@
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"> xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:if condition="{slide}"> <f:if condition="{slide}">
<div class="relative max-w-screen-2xl mx-auto h-80 lg:h-96 mb-8 lg:-mt-8"> <div class="relative max-w-screen-2xl mx-auto h-80 lg:h-96 mb-8">
<f:alias map="{image: slide.image.0}"> <f:alias map="{image: slide.image.0}">
<f:if condition="{image}"> <f:if condition="{image}">
<picture> <picture>
@@ -41,7 +41,7 @@
<f:if condition="{settings.showSkipassBadge}"> <f:if condition="{settings.showSkipassBadge}">
<f:link.typolink parameter="{settings.skipassPageUid}" title="Skipass inklusive"> <f:link.typolink parameter="{settings.skipassPageUid}" title="Skipass inklusive">
<f:image src="EXT:ep_theme/Resources/Public/images/badge_skipass.png" alt="Skipass inklusive" <f:image src="EXT:ep_theme/Resources/Public/images/badge_skipass.png" alt="Skipass inklusive"
class="absolute top-0 lg:top-8 right-8 lg:right-28 w-20 lg:w-auto" /> class="absolute top-0 right-8 lg:right-28 w-20 lg:w-auto" />
</f:link.typolink> </f:link.typolink>
</f:if> </f:if>
<f:if condition="{badge}"> <f:if condition="{badge}">
@@ -49,7 +49,7 @@
<f:if condition="{topitem.children}"> <f:if condition="{topitem.children}">
<f:then> <f:then>
<a href="{f:uri.typolink(parameter: topitem.data.uid)}" <a href="{f:uri.typolink(parameter: topitem.data.uid)}"
class="block text-gray-800 uppercase lg:text-lg flex items-center" class="block text-gray-800 uppercase lg:text-lg font-bold flex items-center"
title="{topitem.title}"> title="{topitem.title}">
<span>{topitem.title}</span> <span>{topitem.title}</span>
<svg class="ml-1 w-4 h-4 transform group-hover:rotate-180"> <svg class="ml-1 w-4 h-4 transform group-hover:rotate-180">
@@ -68,6 +68,25 @@
</f:if> </f:if>
</li> </li>
</f:for> </f:for>
<li class="pb-4">
<f:if condition="{searchbarCollapsed}">
<f:then>
<button data-controller="searchbar-toggle"
data-action="searchbar-toggle#toggle">
<svg class="w-6 h-6">
<use href="#icon-search"></use>
</svg>
</button>
</f:then>
<f:else>
<f:link.typolink parameter="{settings.defaultSearchPageUid}">
<svg class="w-6 h-6">
<use href="#icon-search"></use>
</svg>
</f:link.typolink>
</f:else>
</f:if>
</li>
</ul> </ul>
</nav> </nav>
</f:section> </f:section>
@@ -6,7 +6,7 @@
<f:if condition="{settings.hideAreaNavigation}"> <f:if condition="{settings.hideAreaNavigation}">
<f:else> <f:else>
<div class="hidden lg:block w-full fixed top-0 inset-x-0 z-50 bg-cover bg-center" style="background-image: url({f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/polygon.jpg')})"> <div class="hidden lg:block w-full fixed top-0 inset-x-0 z-50 bg-cover bg-center shadow" style="background-image: url({f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/polygon.jpg')})">
<div class="container"> <div class="container">
<nav role="navigation" class="flex justify-between m-0 p-0 w-full divide-x divide-gray-300 border-r border-l"> <nav role="navigation" class="flex justify-between m-0 p-0 w-full divide-x divide-gray-300 border-r border-l">
<f:link.typolink parameter="9" class="flex items-center justify-center w-16 h-8 text-white hover:text-white focus:text-white hover:bg-ep-secondary" title="E&amp;P"> <f:link.typolink parameter="9" class="flex items-center justify-center w-16 h-8 text-white hover:text-white focus:text-white hover:bg-ep-secondary" title="E&amp;P">
@@ -3,9 +3,11 @@
<f:layout name="Default"/> <f:layout name="Default"/>
<f:section name="Main"> <f:section name="Main">
<div data-controller="searchbar" <div data-controller="searchbar collapse"
data-action="datepicker:range-select->searchbar#setDateRange" <f:if condition="{collapsed}">
data-searchbar-uri-value="{ep:uri.ajax(controller: 'Searchbar', action: 'index', pageUid: settings.defaultAjaxUid, format: 'html')}"> data-collapse-collapsed-value="true"
</f:if>
data-action="datepicker:range-select->searchbar#setDateRange searchbar-toggle:toggle@window->collapse#toggle">
<f:form action="processSearch" controller="Search" method="post" name="searchParams" <f:form action="processSearch" controller="Search" method="post" name="searchParams"
object="{searchParams}" pluginName="searchresult" extensionName="epproducts" object="{searchParams}" pluginName="searchresult" extensionName="epproducts"
pageUid="{settings.defaultSearchPageUid}" data="{'searchbar-target': 'form'}"> pageUid="{settings.defaultSearchPageUid}" data="{'searchbar-target': 'form'}">
@@ -15,18 +17,20 @@
<f:form.hidden property="destinationUid" data="{'searchbar-target': 'destinationUid'}"/> <f:form.hidden property="destinationUid" data="{'searchbar-target': 'destinationUid'}"/>
<f:form.hidden property="destinationType" data="{'searchbar-target': 'destinationType'}"/> <f:form.hidden property="destinationType" data="{'searchbar-target': 'destinationType'}"/>
<f:form.hidden property="priceRange" data="{'searchbar-target': 'priceRange'}"/> <f:form.hidden property="priceRange" data="{'searchbar-target': 'priceRange'}"/>
<div class="searchbar{f:if(condition: fixed, then: ' sticky')}" <div class="searchbar{f:if(condition: collapsed, then: ' reduced hidden')}"
<f:if condition="{fixed}"> data-collapse-target="container"
<f:if condition="{collapsed}">
<f:else> <f:else>
data-controller="sticky" data-controller="sticky"
data-sticky-offset-value="650" data-sticky-offset-value="650"
data-sticky-disabled-value="{fixed -> f:format.json()}" data-sticky-disabled-value="false"
data-sticky-classes-value="sticky reduced"
</f:else> </f:else>
</f:if> </f:if>
data-searchbar-target="container"> data-searchbar-target="container">
<div class="bg-gradient-to-tr from-ep-primary-light via-ep-primary-medium to-ep-primary-dark"> <div class="bg-gradient-to-tr from-ep-primary-light via-ep-primary-medium to-ep-primary-dark">
<div class="sticky:max-w-screen-xl sticky:mx-auto flex flex-col sticky:flex-row sticky:items-center"> <div class="reduced:max-w-screen-xl reduced:mx-auto reduced:px-4 flex flex-col reduced:flex-row reduced:items-center">
<div class="flex items-start justify-between sticky:flex-1 pt-8 px-8 sticky:py-4 sticky:px-0"> <div class="flex items-start justify-between reduced:flex-1 pt-8 px-8 reduced:px-0 reduced:py-4">
<div class="flex-1" <div class="flex-1"
data-controller="collapse datepicker" data-controller="collapse datepicker"
@@ -232,13 +236,13 @@
</div> </div>
</div> </div>
<button type="submit" class="hidden sticky:block sticky:ml-4"> <button type="submit" class="hidden reduced:block reduced:ml-4">
<svg class="w-8 h-8 text-white"> <svg class="w-8 h-8 text-white">
<use href="#icon-chevron-right"></use> <use href="#icon-chevron-right"></use>
</svg> </svg>
</button> </button>
</div> </div>
<div class="flex justify-end mt-4 sticky:hidden"> <div class="flex justify-end mt-4 reduced:hidden">
<button type="submit" class="w-1/3 text-white uppercase py-2"> <button type="submit" class="w-1/3 text-white uppercase py-2">
Detailsuche Detailsuche
</button> </button>
+9 -9
View File
@@ -118,16 +118,16 @@ module.exports = {
borderWidth: [ 'even', 'odd', 'first', 'last' ], borderWidth: [ 'even', 'odd', 'first', 'last' ],
textColor: [ 'sbw', 'sbw-hover', 'snz', 'snz-hover', 'uch', 'uch-hover' ], textColor: [ 'sbw', 'sbw-hover', 'snz', 'snz-hover', 'uch', 'uch-hover' ],
borderColor: [ 'sbw','snz', 'uch' ], borderColor: [ 'sbw','snz', 'uch' ],
display: ['group-hover', 'sticky'], display: ['group-hover', 'reduced'],
visibility: [ 'group-hover' ], visibility: [ 'group-hover' ],
opacity: [ 'group-hover' ], opacity: [ 'group-hover' ],
rotate: [ 'group-hover' ], rotate: [ 'group-hover' ],
flex: [ 'sticky' ], flex: [ 'reduced' ],
flexDirection: [ 'even', 'odd', 'sticky' ], flexDirection: [ 'even', 'odd', 'reduced' ],
alignItems: [ 'sticky' ], alignItems: [ 'reduced' ],
padding: [ 'even', 'odd', 'first', 'last', 'sticky' ], padding: [ 'even', 'odd', 'first', 'last', 'reduced' ],
margin: [ 'even', 'odd', 'first', 'last', 'sticky' ], margin: [ 'even', 'odd', 'first', 'last', 'reduced' ],
maxWidth: [ 'sticky' ], maxWidth: [ 'reduced' ],
}, },
}, },
plugins: [ plugins: [
@@ -151,9 +151,9 @@ module.exports = {
}) })
}), }),
plugin(function ({addVariant, e}) { plugin(function ({addVariant, e}) {
addVariant('sticky', ({modifySelectors, separator}) => { addVariant('reduced', ({modifySelectors, separator}) => {
modifySelectors(({className}) => { modifySelectors(({className}) => {
return `.sticky .${e(`sticky${separator}${className}`)}` return `.reduced .${e(`reduced${separator}${className}`)}`
}) })
}) })
}), }),