Europa Component Library

Pager

Why and how to use this component

A pager enables a user to navigate in a list divided into different pages in order to see additional results in that list.

When to use this component

  • to be used when the filter component is used and there are more than 20 results (i.e. ‘Announcements’)

Do not use this component

  • when it’s useful to see all results (i.e. ‘Departments’, ‘Policies’) - in this case, show all results
{#
  - "current_page" (int): page currently displayed (default: 1)
  - "max_page" (int): total number of pages (default: 0)
  - "fragment_url" (string): url parameter to identify current page (default: '/page')
  - "title_previous" (string): helper when hovering previous page button (default: 'Go to previous page')
  - "title_page" (string): helper when hovering a page button (default: 'Go to page')
  - "title_next" (string): helper when hovering next page button (default: 'Go to next page')
  - "label_previous" (string): previous button label (default: '‹ Previous')
  - "label_page" (string): page label displayed on small screens (default: 'Page')
  - "label_next" (string): next button label (default: 'Next ›')
  - "extra_classes" (string): extra CSS classes to be added
  - "extra_attributes" (array): extra attributes classes (optional, format: [{ 'name': 'name_of_the_attribute', 'value': 'value_of_the_attribute'}])
#}

{% set current_page = current_page|default(1) %}
{% set max_page = max_page|default(0) %}
{% set fragment_url = fragment_url|default('/page') %}
{% set title_previous = title_previous|default('Go to previous page') %}
{% set title_page = title_page|default('Go to page') %}
{% set title_next = title_next|default('Go to next page') %}
{% set label_previous = label_previous|default('‹ Previous') %}
{% set label_page = label_page|default('Page') %}
{% set label_next = label_next|default('Next ›') %}

{# Internal properties #}

{% set _css_class = 'ecl-pager' %}
{% set _extra_attributes = '' %}

{# Internal logic - Process properties #}

{% if extra_class is defined %}
  {% set _css_class = _css_class ~ ' ' ~ extra_class %}
{% endif %}

{% if extra_attributes is defined %}
  {% for attr in extra_attributes %}
    {% set _extra_attributes = _extra_attributes ~ ' ' ~ attr.name ~ '="' ~ attr.value ~'"' %}
  {% endfor %}
{% endif %}

{# Print the result  #}

<nav class="ecl-pager__wrapper" aria-label="pagination">
  <ul class="{{ _css_class }}" {{ _extra_attributes|raw }}>
    {% if current_page > 1 %}
    <li class="ecl-pager__item ecl-pager__item--previous">
      <a class="ecl-pager__link" title="{{ title_previous }}" href="{{ fragment_url }}={{ current_page - 1 }}">{{ label_previous }}</a>
    </li>
    {% endif %}

    {% if current_page > 1 %}
    <li class="ecl-pager__item ecl-pager__item--first">
      <a class="ecl-pager__link" title="{{ title_page }} 1" href="{{ fragment_url }}=1">
        <span class="ecl-u-sr-only" >{{ label_page }} </span>1
      </a>
    </li>
    {% endif %}

    {% if current_page > 4 %}
    <li class="ecl-pager__item ecl-pager__item--ellipsis"></li>
    {% endif %}

    {% if current_page > 3 %}
    <li class="ecl-pager__item">
      <a class="ecl-pager__link" title="{{ title_page }} {{ current_page - 2 }}" href="{{ fragment_url }}={{ current_page - 2 }}">
        <span class="ecl-u-sr-only" >{{ label_page }} </span>{{ current_page - 2 }}
      </a>
    </li>
    {% endif %}

    {% if current_page > 2 %}
    <li class="ecl-pager__item">
      <a class="ecl-pager__link" title="{{ title_page }} {{ current_page - 1 }}" href="{{ fragment_url }}={{ current_page - 1 }}">
        <span class="ecl-u-sr-only" >{{ label_page }} </span>{{ current_page - 1 }}
      </a>
    </li>
    {% endif %}

    <li class="ecl-pager__item ecl-pager__item--current" aria-current="page">
      <span class="ecl-pager__item-text" >{{ label_page }}</span> {{ current_page }}
    </li>

    {% if max_page - current_page > 1 %}
    <li class="ecl-pager__item">
      <a class="ecl-pager__link" title="{{ title_page }} {{ current_page + 1 }}" href="{{ fragment_url }}={{ current_page + 1 }}">
        <span class="ecl-u-sr-only" >{{ label_page }} </span>{{ current_page + 1 }}
      </a>
    </li>
    {% endif %}

    {% if max_page - current_page > 2 %}
    <li class="ecl-pager__item">
      <a class="ecl-pager__link" title="{{ title_page }} {{ current_page + 2 }}" href="{{ fragment_url }}={{ current_page + 2 }}">
        <span class="ecl-u-sr-only" >{{ label_page }} </span>{{ current_page + 2 }}
      </a>
    </li>
    {% endif %}

    {% if max_page - current_page > 3 %}
    <li class="ecl-pager__item ecl-pager__item--ellipsis"></li>
    {% endif %}

    {% if current_page != max_page %}
    <li class="ecl-pager__item ecl-pager__item--last">
      <a class="ecl-pager__link" title="{{ title_page }} {{ max_page }}" href="{{ fragment_url }}={{ max_page }}">
        <span class="ecl-u-sr-only" >{{ label_page }} </span>{{ max_page }}
      </a>
    </li>
    {% endif %}

    {% if current_page != max_page %}
    <li class="ecl-pager__item ecl-pager__item--next">
      <a class="ecl-pager__link" title="{{ title_next }}" href="{{ fragment_url }}={{ current_page + 1 }}">{{ label_next }}</a>
    </li>
    {% endif %}
  </ul>
</nav>
{
  "current_page": 7,
  "max_page": 20
}
<nav class="ecl-pager__wrapper" aria-label="pagination">
  <ul class="ecl-pager">
    <li class="ecl-pager__item ecl-pager__item--previous">
      <a class="ecl-pager__link" title="Go to previous page" href="/page=6">‹ Previous</a>
    </li>

    <li class="ecl-pager__item ecl-pager__item--first">
      <a class="ecl-pager__link" title="Go to page 1" href="/page=1">
        <span class="ecl-u-sr-only" >Page </span>1
      </a>
    </li>

    <li class="ecl-pager__item ecl-pager__item--ellipsis"></li>

    <li class="ecl-pager__item">
      <a class="ecl-pager__link" title="Go to page 5" href="/page=5">
        <span class="ecl-u-sr-only" >Page </span>5
      </a>
    </li>

    <li class="ecl-pager__item">
      <a class="ecl-pager__link" title="Go to page 6" href="/page=6">
        <span class="ecl-u-sr-only" >Page </span>6
      </a>
    </li>

    <li class="ecl-pager__item ecl-pager__item--current" aria-current="page">
      <span class="ecl-pager__item-text">Page</span> 7
    </li>

    <li class="ecl-pager__item">
      <a class="ecl-pager__link" title="Go to page 8" href="/page=8">
        <span class="ecl-u-sr-only" >Page </span>8
      </a>
    </li>

    <li class="ecl-pager__item">
      <a class="ecl-pager__link" title="Go to page 9" href="/page=9">
        <span class="ecl-u-sr-only" >Page </span>9
      </a>
    </li>

    <li class="ecl-pager__item ecl-pager__item--ellipsis"></li>

    <li class="ecl-pager__item ecl-pager__item--last">
      <a class="ecl-pager__link" title="Go to page 20" href="/page=20">
        <span class="ecl-u-sr-only" >Page </span>20
      </a>
    </li>

    <li class="ecl-pager__item ecl-pager__item--next">
      <a class="ecl-pager__link" title="Go to next page" href="/page=8">Next ›</a>
    </li>
  </ul>
</nav>
  • Content:
    /**
     * ECL Pager
     * @define pager
     */
    
    .ecl-pager__wrapper {
      border-top: 2px solid #000;
      margin: 0;
      text-align: center;
    }
    
    .ecl-pager {
      align-items: center;
      display: inline-flex;
      justify-content: center;
      margin: map-get($ecl-spacing, 's') 0;
      padding-left: 0;
      width: 100%;
    }
    
    .ecl-pager__item {
      border: 2px solid transparent;
      box-sizing: content-box;
      color: #000;
      display: none;
      list-style: none;
      margin: 0 map-get($ecl-spacing, 'xxxs');
    }
    
    .ecl-pager__link {
      color: map-get($ecl-colors, 'blue-100');
      display: block;
      font-size: map-get($ecl-font-size, 's');
      font-weight: 500;
      min-width: map-get($ecl-spacing, 's');
      padding: map-get($ecl-spacing, 'xxxs');
      text-decoration: none;
    
      &:hover {
        color: #000;
        text-decoration: underline;
      }
    }
    
    .ecl-pager__item--previous,
    .ecl-pager__item--next {
      display: block;
    
      .ecl-pager__link {
        font-weight: 600;
      }
    }
    
    .ecl-pager__item--ellipsis {
      font-size: map-get($ecl-font-size, 's');
      font-weight: 400;
      min-width: map-get($ecl-spacing, 's');
      padding: map-get($ecl-spacing, 'xxxs');
    }
    
    .ecl-pager__item--current {
      border-radius: 50%;
      display: block;
      flex-grow: 1;
      font-size: map-get($ecl-font-size, 's');
      font-weight: 600;
      min-width: map-get($ecl-spacing, 's');
      padding: map-get($ecl-spacing, 'xxxs');
    }
    
    @include ecl-media-breakpoint-up(md) {
      .ecl-pager {
        width: auto;
      }
    
      .ecl-pager__item {
        display: block;
      }
    
      .ecl-pager__item--current {
        border: 2px solid #000;
        flex-grow: 0;
      }
    
      .ecl-pager__item-text {
        display: none;
      }
    }
    
  • URL: /components/raw/ecl-pagers/ecl-pagers.scss
  • Filesystem Path: framework/components/ecl-pagers/ecl-pagers.scss
  • Size: 1.6 KB
  • Handle: @ec-europa/ecl-pagers
  • Tags: molecule
  • Preview:
  • Filesystem Path: framework/components/ecl-pagers/ecl-pagers.twig