{# Filter Sidebar Components ========================= Product filtering panel for category and search pages. Usage: {% from 'shared/macros/storefront/filter-sidebar.html' import filter_sidebar, filter_group, price_filter, rating_filter %} #} {# Filter Sidebar ============== Complete filter sidebar with multiple filter types. Parameters: - filters_var: Alpine.js expression for filter configuration (default: 'filters') - active_filters_var: Alpine.js expression for active filters (default: 'activeFilters') - on_change: JavaScript callback when filters change (default: 'filterProducts()') - show_clear: Show clear all button (default: true) - collapsible: Make filter groups collapsible (default: true) Expected filters structure: { categories: [{ id, name, count }], brands: [{ id, name, count }], priceRange: { min: 0, max: 1000 }, attributes: { color: [{ value, label, count, hex }], size: [{ value, label, count }] }, ratings: [{ value: 5, count: 10 }, ...] } Usage: {{ filter_sidebar(filters_var='filters', on_change='applyFilters()') }} #} {% macro filter_sidebar( filters_var='filters', active_filters_var='activeFilters', on_change='filterProducts()', show_clear=true, collapsible=true ) %} {% endmacro %} {# Internal: Filter Group for Categories/Brands #} {% macro _filter_group(title, type, collapsible) %}
{% if collapsible %} {% else %}

{{ title }}

{% endif %}
{% endmacro %} {# Internal: Price Range Group #} {% macro _price_range_group(filters_var, active_filters_var, on_change, collapsible) %}
{% if collapsible %} {% else %}

Price Range

{% endif %}
{# Dual Range Slider #}
{# Price Inputs #}
$
-
$
{% endmacro %} {# Internal: Rating Group #} {% macro _rating_group(filters_var, active_filters_var, on_change, collapsible) %}
{% if collapsible %} {% else %}

Rating

{% endif %}
{% endmacro %} {# Internal: Dynamic Attribute Group (color, size, etc.) #} {% macro _attribute_group(filters_var, active_filters_var, on_change, collapsible) %}
{% if collapsible %} {% else %}

{% endif %}
{# Color Swatches #} {# Size/Other Buttons #} {# Checkbox List for other attributes #}
{% endmacro %} {# Price Filter (Standalone) ========================= Standalone price range filter component. Parameters: - min: Minimum price (default: 0) - max: Maximum price (default: 1000) - value_min_var: Alpine.js var for min value (default: 'priceMin') - value_max_var: Alpine.js var for max value (default: 'priceMax') - on_change: Callback on change (default: 'updateFilters()') - currency: Currency symbol (default: '$') Usage: {{ price_filter(min=0, max=500, on_change='filterByPrice()') }} #} {% macro price_filter( min=0, max=1000, value_min_var='priceMin', value_max_var='priceMax', on_change='updateFilters()', currency='$' ) %}
{{ currency }}
to
{{ currency }}
{% endmacro %} {# Rating Filter (Standalone) ========================== Standalone star rating filter. Parameters: - value_var: Alpine.js var for selected rating (default: 'minRating') - on_change: Callback on change (default: 'updateFilters()') - show_count: Show product counts (default: false) - counts: List of counts per rating level Usage: {{ rating_filter(value_var='minRating', on_change='filterByRating()') }} #} {% macro rating_filter( value_var='minRating', on_change='updateFilters()', show_count=false, counts=none ) %}
{% for i in range(5, 0, -1) %} {% endfor %}
{% endmacro %} {# Mobile Filter Drawer ==================== Full-screen filter panel for mobile devices. Parameters: - show_var: Alpine.js variable for visibility (default: 'showFilters') - filters_var: Alpine.js expression for filters (default: 'filters') - active_filters_var: Alpine.js expression for active filters (default: 'activeFilters') - on_apply: Callback on apply (default: 'applyFilters()') - result_count_var: Alpine.js var showing result count (default: 'productCount') Usage: {{ mobile_filter_drawer(show_var='showMobileFilters') }} #} {% macro mobile_filter_drawer( show_var='showFilters', filters_var='filters', active_filters_var='activeFilters', on_apply='applyFilters()', result_count_var='productCount' ) %} {% endmacro %} {# Filter Trigger Button ==================== Button to open mobile filter drawer. Parameters: - show_var: Alpine.js variable to toggle (default: 'showFilters') - active_count_var: Alpine.js var for active filter count (default: none) Usage: {{ filter_trigger(show_var='showMobileFilters') }} #} {% macro filter_trigger( show_var='showFilters', active_count_var=none ) %} {% endmacro %} {# Sort Dropdown ============= Product sorting dropdown. Parameters: - value_var: Alpine.js var for sort value (default: 'sortBy') - options: Sort options list (default: common options) - on_change: Callback on change (default: 'sortProducts()') Usage: {{ sort_dropdown(value_var='currentSort') }} #} {% macro sort_dropdown( value_var='sortBy', options=none, on_change='sortProducts()' ) %} {% set default_options = [ {'value': 'relevance', 'label': 'Relevance'}, {'value': 'price_asc', 'label': 'Price: Low to High'}, {'value': 'price_desc', 'label': 'Price: High to Low'}, {'value': 'newest', 'label': 'Newest First'}, {'value': 'rating', 'label': 'Highest Rated'}, {'value': 'popular', 'label': 'Most Popular'} ] %} {% set sort_options = options if options else default_options %}
{% endmacro %}