{% extends 'layout/app.html.twig' %}{% block PAGE_CSS %}{% endblock %}{% block CONTENT_MID %} <div x-data="{ showMobileFilter: false }"> <div x-cloak x-show="showMobileFilter" class="relative z-40 lg:hidden" role="dialog" aria-modal="true"> <div x-transition:enter="transition-opacity ease-linear duration-300" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="transition-opacity ease-linear duration-300" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" class="fixed inset-0 bg-black bg-opacity-25"></div> <div class="fixed inset-0 z-40 flex"> <div x-transition:enter="transition ease-in-out duration-300 transform" x-transition:enter-start="translate-x-full" x-transition:enter-end="translate-x-0" x-transition:leave="transition ease-in-out duration-300 transform" x-transition:leave-start="translate-x-0" x-transition:leave-end="translate-x-full" class="relative ml-auto flex h-full w-full max-w-xs flex-col overflow-y-auto bg-white py-4 pb-6 shadow-xl"> <div class="flex items-center justify-between px-4"> <h2 class="text-lg font-medium text-gray-900">Filters</h2> <button @click="showMobileFilter = false" type="button" class="-mr-2 flex h-10 w-10 items-center justify-center p-2 text-gray-400 hover:text-gray-500"> <span class="sr-only">Close menu</span> <!-- Heroicon name: outline/x-mark --> <svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" /> </svg> </button> </div> <!-- Filters --> <form id="mobileFilters" class="mt-4"> <div class="space-y-2 px-4"> {% if(currentFilter|length > 0) %} {% for key,filter in currentFilter %} {% if(filter is not null and filter is not empty) %} {% if filter is iterable %} {% for f in filter %} <button data-filter="{{ (key ~ f)|replace({' ': ''}) }}" type="button" class="removeMobileFilter w-full inline-flex items-center py-2 px-3 bg-gray-100 hover:bg-brand-50 text-sm font-medium text-gray-600 hover:text-brand-600 border border-transparent hover:border-brand-600 rounded-md space-x-2 cursor-pointer select-none transition ease duration-300 group text-left"> <span class="flex-shrink-0"> <svg class="h-2 w-2" stroke="currentColor" fill="none" viewBox="0 0 8 8"> <path stroke-linecap="round" stroke-width="1.5" d="M1 1l6 6m0-6L1 7" /> </svg> </span> <span> {{ ('general.filter.' ~ key)|lower|trans }}: {{ (f)|lower|trans }} </span> </button> {% endfor %} {% else %} <button data-filter="{{ (key ~ filter)|replace({' ': ''}) }}" type="button" class="removeMobileFilter w-full inline-flex items-center py-2 px-3 bg-gray-100 hover:bg-brand-50 text-sm font-medium text-gray-600 hover:text-brand-600 border border-transparent hover:border-brand-600 rounded-md space-x-2 cursor-pointer select-none transition ease duration-300 group text-left"> <span class="flex-shrink-0"> <svg class="h-2 w-2" stroke="currentColor" fill="none" viewBox="0 0 8 8"> <path stroke-linecap="round" stroke-width="1.5" d="M1 1l6 6m0-6L1 7" /> </svg> </span> <span> {{ ('general.filter.' ~ key)|lower|trans }}: {{ (filter)|lower|trans }} </span> </button> {% endif %} {% endif %} {% endfor %} {% endif %} </div> <div class="mt-4"> <div class="divide-y divide-gray-200"> {% if(filterDefinition.filters|length > 0) %} {% for filter in filterDefinition.filters %} {% set filterMarkup = filterService.filterFrontend(filter, productListing, currentFilter) %} {{ filterMarkup | raw }} {% endfor %} {% endif %} </div> </div> </form> </div> </div> </div> <nav aria-label="Breadcrumb" class="pt-4"> <ol role="list" class="mx-auto flex max-w-2xl items-center space-x-2 px-4 sm:px-6 lg:max-w-7xl lg:px-8"> <li> <div class="flex items-center"> <a href="/" class="mr-2 text-sm font-medium text-gray-900">Home</a> <svg width="16" height="20" viewBox="0 0 16 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="h-5 w-4 text-gray-300"> <path d="M5.697 4.34L8.98 16.532h1.327L7.025 4.341H5.697z" /> </svg> </div> </li> <li class="text-sm"> <a href="{{ navStartNode }}" aria-current="page" class="font-medium text-brand-600 hover:text-gray-600">{{ 'Produkte' | trans }}</a> </li> </ol> </nav> <main class="mx-auto max-w-2xl px-4 lg:max-w-7xl lg:px-8"> <form id="filters"> <div class="pt-12 pb-24 lg:grid lg:grid-cols-3 lg:gap-x-8 xl:grid-cols-4"> <aside> <div class="flex items-baseline justify-between hidden lg:block"> <h3 class="text-2xl mb-4 font-bold tracking-tight text-gray-900">Filter</h3> </div> <div class="space-y-2 hidden lg:block"> {% if(currentFilter|length > 0) %} {% for key,filter in currentFilter %} {% if(filter is not null and filter is not empty and key not in ["productGroup", "parentCategoryIds", "materialThickness"]) %} {% if filter is iterable %} {% for f in filter %} <button data-filter="{{ (key ~ f)|replace({' ': ''}) }}" type="button" class="removeFilter w-full inline-flex items-center py-2 px-3 bg-gray-100 hover:bg-brand-50 text-sm font-medium text-gray-600 hover:text-brand-600 border border-transparent hover:border-brand-600 rounded-md space-x-2 cursor-pointer select-none transition ease duration-300 group text-left"> <span class="flex-shrink-0"> <svg class="h-2 w-2" stroke="currentColor" fill="none" viewBox="0 0 8 8"> <path stroke-linecap="round" stroke-width="1.5" d="M1 1l6 6m0-6L1 7" /> </svg> </span> <span> {{ ('general.filter.' ~ key)|lower|trans }}: {{ (f)|lower|trans }} </span> </button> {% endfor %} {% else %} <button data-filter="{{ (key ~ filter)|replace({' ': ''}) }}" type="button" class="removeFilter w-full inline-flex items-center py-2 px-3 bg-gray-100 hover:bg-brand-50 text-sm font-medium text-gray-600 hover:text-brand-600 border border-transparent hover:border-brand-600 rounded-md space-x-2 cursor-pointer select-none transition ease duration-300 group text-left"> <span class="flex-shrink-0"> <svg class="h-2 w-2" stroke="currentColor" fill="none" viewBox="0 0 8 8"> <path stroke-linecap="round" stroke-width="1.5" d="M1 1l6 6m0-6L1 7" /> </svg> </span> <span> {{ ('general.filter.' ~ key)|lower|trans }}: {{ (filter)|lower|trans }} </span> </button> {% endif %} {% endif %} {% endfor %} {% endif %} </div> <div class="mt-4 hidden lg:block"> <div class="divide-y divide-gray-200"> {% if(filterDefinition.filters|length > 0) %} {% for filter in filterDefinition.filters %} {% set filterMarkup = filterService.filterFrontend(filter, productListing, currentFilter) %} {{ filterMarkup | raw }} {% endfor %} {% endif %} </div> </div> </aside> <section aria-labelledby="product-heading" class="mt-6 lg:col-span-2 lg:mt-0 xl:col-span-3"> <div class="flex justify-between mb-4 items-center"> <h3 class="text-2xl font-bold tracking-tight text-gray-900">{{ 'Produkte' | trans }}</h3> <div class="flex items-center"> <button @click="showMobileFilter = true" type="button" class="mr-4 p-2 text-gray-400 hover:text-gray-500 sm:ml-6 lg:hidden"> <span class="sr-only">Filters</span> <svg class="h-5 w-5" aria-hidden="true" viewBox="0 0 20 20" fill="currentColor"> <path fill-rule="evenodd" d="M2.628 1.601C5.028 1.206 7.49 1 10 1s4.973.206 7.372.601a.75.75 0 01.628.74v2.288a2.25 2.25 0 01-.659 1.59l-4.682 4.683a2.25 2.25 0 00-.659 1.59v3.037c0 .684-.31 1.33-.844 1.757l-1.937 1.55A.75.75 0 018 18.25v-5.757a2.25 2.25 0 00-.659-1.591L2.659 6.22A2.25 2.25 0 012 4.629V2.34a.75.75 0 01.628-.74z" clip-rule="evenodd" /> </svg> </button> <div class="relative inline-block text-left" x-data="{ isOpen: false }"> <div> <button type="button" x-on:click="isOpen = ! isOpen" class="inline-flex w-full justify-center py-2 px-3 bg-gray-100 text-sm font-semibold text-gray-900 space-x-1.5 rounded-md focus:outline-none" id="menu-button" aria-expanded="true" aria-haspopup="true"> <span>{{ 'Sortieren nach' | trans }}</span> <svg class="-mr-1 h-5 w-5 text-gray-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"> <path fill-rule="evenodd" d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z" clip-rule="evenodd" /> </svg> </button> </div> <!-- Dropdown menu, show/hide based on menu state. Entering: "transition ease-out duration-100" From: "transform opacity-0 scale-95" To: "transform opacity-100 scale-100" Leaving: "transition ease-in duration-75" From: "transform opacity-100 scale-100" To: "transform opacity-0 scale-95" --> <div x-cloak x-show="isOpen" @click.outside="isOpen = false" x-transition:enter="transition ease-out duration-100" x-transition:enter-start="transform opacity-0 scale-95" x-transition:enter-end="transform opacity-0 scale-100" x-transition:leave="transition ease-in duration-75" x-transition:leave-start="transform opacity-100 scale-100" x-transition:leave-end="transform opacity-0 scale-95" class="absolute right-0 z-10 mt-2 w-56 origin-top-right rounded-md bg-gray-50 shadow-lg focus:outline-none" role="menu" aria-orientation="vertical" aria-labelledby="menu-button" tabindex="-1"> <div class="py-1" role="none"> <!--<button name="sort" value="name-asc" class="w-full block py-2 px-4 hover:bg-gray-100 text-sm text-gray-700 hover:text-gray-900 text-left" role="menuitem" tabindex="-1" id="menu-item-0">{{ 'Artikelname' | trans }}</button>--> <button name="sort" value="code-asc" class="w-full block py-2 px-4 hover:bg-gray-100 text-sm text-gray-700 hover:text-gray-900 text-left" role="menuitem" tabindex="-1" id="menu-item-1">{{ 'Produktcode (aufsteigend)' | trans }}</button> <button name="sort" value="code-desc" class="w-full block py-2 px-4 hover:bg-gray-100 text-sm text-gray-700 hover:text-gray-900 text-left" role="menuitem" tabindex="-1" id="menu-item-1">{{ 'Produktcode (absteigend)' | trans }}</button> <button name="sort" value="materialThickness-asc" class="w-full block py-2 px-4 hover:bg-gray-100 text-sm text-gray-700 hover:text-gray-900 text-left" role="menuitem" tabindex="-1" id="menu-item-1">{{ 'Materialstärke (aufsteigend)' | trans }}</button> <button name="sort" value="materialThickness-desc" class="w-full block py-2 px-4 hover:bg-gray-100 text-sm text-gray-700 hover:text-gray-900 text-left" role="menuitem" tabindex="-1" id="menu-item-1">{{ 'Materialstärke (absteigend)' | trans }}</button> </div> </div> </div> </div> </div> <div class="grid grid-cols-1 gap-y-4 sm:grid-cols-3 sm:gap-x-6 sm:gap-y-10 lg:gap-x-8 xl:grid-cols-4"> {% for item in results %} {% include 'product/product_teaser.html.twig' with {'product': item} %} {% else %} <div class="p-4 my-4 text-sm text-brand-600 rounded-lg bg-brand-50 col-span-4" role="alert"> {{ 'Leider wurden keine Ergebnisse gefunden' }} </div> {% endfor %} </div> <div class="mt-10"> {% include '_partials/pagination.html.twig' %} </div> </section> </div> </form> </main> </div>{% endblock %}{% block PAGE_JS %}{% endblock %}